운영체제의 개요<정의,역사,구조>

2020. 10. 28. 13:23컴퓨터 수업/운영체제

이 내용은 <책:쉽게 배우는 운영체제>를 참고해서 작성했습니다.


운영체제의 정의

User와 hardware의 interface 소프트웨어

 

ex) 예를 들어 내가 어떤 게임을 하고 있다 할 때(User가 User application program을 켠다), 이 프로그램은 OS에 의해 메모리로 올라와 프로세스화 되며, 이 프로세스는 당연하게도 어떤 연산을 필요로 할 것이다. 이런 연산은 CPU가 수행한다. 따라서 OS는 현재, 내가(User) 실행하는 프로그램(User application program이 프로세스화 된 것)이 필요로 하는 연산을 수행해야 하는데, 이때 CPU를 나(User)에게 할당해 준다.

따라서 정리하자면, OS를 통해 hardware를 할당받은 것이다. 

 

ex) OS는 여러 일을 하지만, 가장 근본적으론 프로그램(=User application program)을 프로세스화 한다. 폰 노이만 아키텍처에 의해, 프로그램은 메모리에 올라와야만 executable 한데, 이런 맥락에서

메모리에 올라온 프로그램  =  프로세스이다.

 

ex) 윈도우, 리눅스 등의 소위 OS(운영체제) 또한 하나의 "소프트웨어"이다. 이 소프트웨어(=프로그램)는 폰 노이만 아키텍처에 의해, 메모리에 올라와야만 실행될 수 있고, 이런 맥락에 따라. 운영체제도 부팅 시 메모리에 올라오도록 되어있다. 운영체제가 저장되어 있는 장소 (하드디스크의 첫 번째 섹터)를 마스터 부트 레코드(MBR)이라고 하며, 평상시에는 운영체제가 User Application Program을 메모리로 올려줬겠지만, 지금은 운영체제 당사자가 메모리로 올라가야 하는 상황이므로, 이 운영체제는 부트스트랩(bootstrap)이란 작은 프로그램이 운영체제를 메모리로 올린다.

(그럼 그 부트스트랩이란 프로그램은 누가 프로세스화 하는가?라는 질문은 남는다.)


운영체제의 역할

1. 자원 관리

2. 자원 보호

3. 사용자 인터페이스 제공

 

ex) 자원관리 - 자원을 관리한다. 여기서 자원이란 Computer resource를 의미한다. 이때 Computer resource란 CPU, 저장장치, 메모리 등의 하드웨어 자원을 의미한다. 따라서, 자원을 관리한다는 것의 의미는 예를 들어 CPU, 저장장치, 메모리 등의 자원들이 총 100이라는 어느 수치화된 자원을 가진다면,  (1) 어느 프로그램에 자원을 할당해 주거나, 주지 않거나 등 자원의 할당을 수행한다. (2) 또는 어느 특정 프로그램에는 20만큼 할당해주고 다른 프로그램에는 80 할당해주는 등의 작업을 수행한다. 이는 I/O device와 크게 관련이 있는데, 이때 I/O device란 input/output device로써, 키보드 마우스 등의 hardware를 의미한다. 예를 들어 백그라운드에 크롬 창으로 유튜브를 켜 두고, 마이크로소프트 워드를 켜 두고 내가 타이핑을 하는 작업을 하고 있다면 내 Output device인 키보드가 활성화되고 있으므로, 필연적으로 워드에 더 많은 자원을 할당해 줄 수밖에 없다. (OS는 I/O device에 더 많은 자원을 할당한다.)

 

ex) 자원보호 - nullptr참조는 C++에서 중요한 이슈다. 이때 C++은 어셈블리 언어와 유사한 방식으로 기능하는데, 예를 들어 내가 User가 접근해선 안 되는 메모리에 접근한다고 해보자

예를 들어) LOAD mem(접근해서는 안 되는 메모리 주소) , register 1;

이때, 이 접근해서는 안 되는 메모리 주소가 운영체제가 메모리에 올라와 있는 주소라면, 이는 운영체제를 직접적으로 공격하는 행위가 된다. 따라서 이러한 일은 수행되지 않도록 해야 하므로, 운영체제는 어떤 메모리에 접근할지, 사용자가 정하지 못하고(또는 사용자가 실행한 프로그램이 정하지 못하고) 운영체제가 위치를 정해 메모리에 접근하도록 작업하며, 이때 접근한 메모리의 위치가 아닌, 라벨을 발행함으로써, 해당 메모리에서 계속 작업을 이어가도록 동작한다.

 

ex) 사용자 인터페이스(UI) 제공 - 운영체제는 사용자 인터페이스와 커널로 나뉜다. 지금까지 말한 운영체제 역할의 원천적인 부분을 커널이 담당한다고 생각해도 만무한데, 이때 사용자 인터페이스는 여러 UI가 있을 수 있겠지만 쉽게 말해 GUI로 이해해도 좋다. 예를 들어 내 PC는 윈도 OS를 사용하는데, 윈 10 OS를 이용해서 부팅하면 하단에 작업표시줄이 보이며, 오른쪽 클릭을 누르면 작업 관리자에 들어갈 수 있는 버튼을 시각적으로 확인할 수 있다. 이런 User가 Kernel(운영체제)에 접근할 인터페이스를 제공하는 것 또한 운영체제의 역할이다. 즉, 다시 말해, 운영체제가 운영체제에 접근할 수 있게 인터페이스를 제공하는 것도 운영체제의 역할이다.


운영체제의 역사 ★

운영체제의 역사는 OS가 어떤 시스템을 채용했는지, 그리고 그 시스템의 특징은 무엇인지로 요약할 수 있다.

 

어떤 특정 시스템이 이론상 가능하지만, 그 시스템을 해당 OS가 수용할 수 있을지는 불분명하다.

예를 들어 유닉스는 멀티프로그래밍과 다중 사용자를 지원한다.


1. 일괄 작업 시스템 (batch job system)

에니악 이후, CPU와 메모리 등등의 현대적인 컴퓨터 자원을 가진 컴퓨터가 등장한 이후, 운영체제가 자리 잡게 되었다. 이때 컴퓨터는 천공카드로 입력하고 라인프린터로 출력하였는데, 이는 필연적으로 입력 1회, 출력 1회라는 한 번의 cycle을 가지게 된다. 즉 한번 입력하면 출력을 볼 때까지, 중간에 다른 입력이 불가했다. 천공카드를 통해 프로그램과 입력값을 한번 넣고 나면, 라인프린터로 출력 값을 보기 전에는 메모리와 상호작용할 방법이 없었다. (이때도 메모리라는 개념이 있었고, 이 메모리는 운영체제 영역과 사용자 영역으로 구분되었다.(자원보호에 의해 서로의 영역을 침범하지 않았다.)) 따라서, 어떤 특정 시스템을 채용할 때, 상호작용에 대한 처리를 해 줄 필요가 없는 시스템을 채용하게 되었다. 그러한 시스템을 일괄 작업 시스템 (batch job system, batch task system, batch processing system)이라고 한다.

지금은 거의 사라진 시스템으로, 해당 시스템을 사용하는 프로그램은 이제 잘 없다.

<중요한건 이런 "시스템"은 OS 전체가 해당 시스템을 채용할 수도 있고, 어떤 특정 프로그램만 해당 시스템을 채용할 수도 있다는 것이다.>

그럼에도 불구하고, Windows 운영체제에서는 autoexec.bat(여기서 bat은 batch system을 의미한다.)이라는 프로그램을 찾을 수 있는데. (MS-DOS 시절에는 windows-system32에서 해당 프로그램을 찾을 수 있었다는데, 현재는 찾을 수 없다.) 이 프로그램은 운영체제가 시작할 때 한꺼번에 처리해야 할 작업을 모아놓은 것이다. 따라서 내가 PC를 부팅할 때 자동적으로 실행할 시작프로그램들에 대한 정보가 이 autoexec.bat 프로그램에 링킹 되어있음을 예상할 수 있다.


2. 대화형 시스템

1960년대 초반에 키보드와 모니터의 등장으로, 입출력을 실시간으로 수행해야 될 필요가 대두되었다. 이에따라 천공카드를 이용한 batch job system이 아닌 다른 방식으로 수정된 시스템을 사용하는 OS를 이용할 필요가 생겼는데 , 수정된 시스템으로 키보드와 모니터를 이용해 작업(job) 중간에 사용자가 입력을 하거나 사용자에게 중간 결괏값을 보여줄 수 있게 되었다. 이 수정된 시스템을 대화형 시스템(interactive system)이라고 한다.

 

이런 대화형 시스템은 일괄작업시스템에 비해, 작업이 얼마나 걸릴지 예상하기 힘들다는(I/O를 얼마나 사용할지 모르니, 사용자가 타이핑을 얼마나 지속할지 모르니) 단점이 존재했다.


이런 일괄작업시스템과 대화형 시스템은 현재도 사용하는 시스템이다. 주로 뒤에서 설명할 시분할 시스템 중에서 분할된 퀀텀에 사용하는 시스템이 대화형 시스템이나 일괄 작업시스템일 뿐인 것이다. (시분할 시스템에서는 수없이 나눠진 퀀텀으로 일괄 작업시스템과 대화형 시스템 등이 번갈아 작업되므로, 일괄 작업시스템과 대화형 시스템의 장점을 모두 취할 수 있다.)

 

이런 맥락에서, 일괄작업시스템은 주로 연산 작업이 중요한 프로그램(위에도 설명했듯이 특정 OS가 전부 일괄 작업시스템을 채용할 수도 있지만 (이런 일은 잘 없고... 임베디드에는 채용될 수도 있겠다.) 특정 프로그램이 해당 시스템을 채용하는 경우가 더 많다고 사료된다.)에 사용된다. 수학계산이나 ANSYS등의 수치해석이 필요한 프로그램은 일괄 작업시스템으로 처리한다. 이런 작업 job을 CPU bound job이라고 한다.

대화형 시스템은 입출력이 중요한 프로그램에 사용된다. 데이터베이스에 접근하는 프로그램 (예를 들어, Dbeaver와 같은 프로그램)이나 동영상 플레이어와 같은 프로그램은 대화형 시스템을 채용한다. 이러한 작업들을 I/O bound job이라고 한다.


3. 시분할 시스템(time-sharing system & multiprogramming)

 

멀티태스킹이라고도 불리는 이 시스템은 CPU의 타임퀀텀에 따라 작업을 수행한다. 예를 들어 내 PC의 CPU 클럭은 1.60 GHz인데, 초당 1.60*10^9의 작업을 수행한다 = 1/ 1.60*10^12 이 내 CPU의 타임 퀀텀이다.

 

각 타임 퀀텀마다. 일괄 작업시스템이나 대화형 시스템으로 프로그램을 운용한다.


시분할 시스템을 이용해 여러 작업을 동시(동시처럼 보이는)에 실행할 수 있다는 것은 한 사람이 여러 프로그램을 동시에 실행할 수 있다는 의미이다. 같은 맥락에서 여러 사용자가 여러 프로그램을 사용할 수도 있게 되었다. 즉 중앙컴퓨터를 이용해서 여러 유저가 연산을 수행할 수 있다는 것인데 이런 시스템을 다중 사용자 시스템이라고 하며, 유닉스 OS가 해당 시스템을 제공한다.

 

시분할 시스템은 여러 사용자가 하나의 CPU로 여러 프로그램을 동시에 사용할 수 있게 한다.


4. 분산 시스템(distributed system)

 

예전에는 PC가 많이 보급되지 않았으므로 하나의 좋은 컴퓨터를 가지고 여러 User가 연산을 하는 다중 사용자 시스템을 많이 이용했다. 이런 좋은 컴퓨터를 메인프레임이라고 한다.

하지만, 인터넷의 보급과 개인용 컴퓨터의 보급으로 인해, PC가 상용화되자, 이런 여러 PC를 네트워크로 묶어서 여러 개의 CPU를 동시(동시인 것처럼 보이는)에 사용할 수 있게 되었다.

 

분산 시스템은 여러 사용자가 여러 CPU로 여러 프로그램을 동시에 사용할 수 있게 한다.


5. 클라이언트/서버 시스템

 

분산 시스템을 I/O bound job과 CPU bound job으로 구분한 것이 클라이언트/서버 시스템이다.

 

클라이언트는 I/O bound job을 수행하며, 이때 서버는 CPU bound job을 수행한다.

 

즉, 분산 시스템을 계층화하여 나는 것을 클라이언트/서버 시스템이라고 할 수 있다.


6. P2P 시스템

 

클라이언트/서버 시스템에서 서버는 대부분의 연산 작업을 수행하므로, 이에 따른 부하가 발생할 수 있다.

 

하지만 peer to peer 시스템인 P2P 시스템에서는 연산 작업조차 각 PC에서 수행하므로 이에 따른 부하를 없앨 수 있다.

 

따라서, 내가 이해하는바로는, P2P가 완전 분산 시스템이고 클라이언트/서버가 간접 분산 시스템이라고 생각할 수 있다.


운영체제의 구조 = UI + Kernel(SystemCall+Kernel+Driver)

Computer System의 구조는

 

User(Application level)

OS

Hardware

 

라고 생각해서 User와 Hardware가 상호작용하는 인터페이스를 OS가 제공하는 것이라 생각해도 좋다.

 

이때, 운영체제의 구조는 커널과 (사용자) 인터페이스로 나눌 수 있다.

 

따라서 구조는 다음과 같다. OS = UI + Kernel

 

User

UI         

Kernel    

Hardware

 

이 인터페이스를 이해해보려면 다음과 같은 예시를 살펴보자

유닉스의 사용자 인터페이스는 셸 shell이라고 하며 C셸 csh, T셸 tsh, 배시 셸 bash 등 여러 종류의 셸이 있다. 셸은 명령어 기반이라 일반인이 사용하기 불편하여 유닉스 운영체제를 어렵게 느끼는 사람이 많다. 그런데 편리한 인터페이스와 화려한 그래픽을 자랑하는 매킨토시의 운영체제 Mac OS X도 알고 보면 유닉스 계열의 커널을 이용해서 만든 것이다. 엄밀히 말하면 유닉스 운영체제가 어려운 것이 아니라 명령어 기반의 인터페이스가 어려운 것이다. -쉽게 배우는 운영체제

 

그렇다면 커널이 운영체제의 핵심적인 부분을 차지하는 것인데 (자원 할당, 자원보호 등) 이 커널에 접근하는 방법으로는 시스템 콜(System call)이 있다. 이 또한 하나의 인터페이스로써 기능하는데. C의 printf와 같은 명령어가 시스템 호출이라고 할 수 있다. 계층구조를 하나의 예시로써 들어보자면 예를 들어 내가 바탕화면의 어떤 특정 파일을 오른쪽 클릭하여 복사하기 버튼을 눌렀다고 생각해보자, 이를 계층구조로 설명하자면 나 User가 GUI를 이용해 복사하기 버튼을 누르고, 이 복사하기 버튼은 System Call 명령어 Copy()를 사용하여 커널에 진입한다. 이후 커널은 하드웨어인 저장장치의 메모리 영역 하나를 다른 곳에 복사한다.

 

이와 유사하게 커널이 하드웨어와 상호작용하는 인터페이스로 드라이버 또한 존재한다.

 

따라서 다음과 같은 계층구조가 만들어진다