Monolitic Kernel은 OS의 Kernel 아키텍쳐 중 하나로, 모든 운영 체제 서비스가 커널 공간에서 실행되도록 구현된 것이다.
Monolitic Kernel으로 구현된 OS에는 UNIX, LINUX 등이 있다.
Micro Kernel은 OS의 Kernel 아키텍쳐 중 하나로, 핵심 서비스만이 커널 공간에서 실행되고, 다른 서비스는 사용자 공간에서 실행되도록 구현된 것이다.
커널 공간에서 실행되는 핵심 서비스에는 다음과 같은 것들이 있다.
Micro Kernel의 장점은 커널의 크기가 작아 메모리 공간을 줄일 수 있고, 확장성이 높다는 것이다.
대신, Monolitic Kernel에 비해 성능이 낮을 수 있다는 단점이 있다.
Micro Kernel으로 구현된 OS에는 미닉스 등이 있다.
Operating System에는 Unix, Linux, Windows, IOS 등이 있다.
주로 범용 컴퓨터에서는 Unix, Linux, Windows, MacOS 등을 이용하고,
모바일 환경에서는 IOS 및 Android가 사용된다.
👽 Android는 운영체제인가?
Android는 리눅스 커널 위에서 동작하는 오픈 소스 플랫폼이므로 그 자체로 운영체제는 아니지만,
가상머신 기술이 보편화된 지금은 일종의 guest OS라고 봐도 무방하다.
UNIX는 Bell Lab에서 개발된 Monolitic Kernel으로 설계된 OS로, 주로 서버용 컴퓨터에 사용된다.
UNIX에는 BSD, Solaris 등 여러 버전이 존재한다.
또한, UNIX의 Kernel 내부에는 System Call Interface가 서브루틴 형태로 구현되어 있다.
💡 System Call Interface가 Kernel의 외부에 존재하는 것처럼 묘사한 그림이 많다.
이는 System Call Interface와 Kernel이 분리되어 구현된 것이 아니라,
Applications가 System Call을 통해 Kernel과 소통한다는 것을 의미하는 모식도이다.
모식도 상으로는 System Call이 Kernel과 Application 사이의 중간 다리 역할을 하여 외부에 있는 것처럼 보이지만,
실제로 System Call은 Kernel의 내부에 서브루틴 형태로 구현되어 있다.
Linux 또한 Unix와 마찬가지로 Monolitic Kernel 구조로 설계되었으며, 오픈 소스이다.
Windows는 초기 NT Kernel 개발 시 Microkernel architecture를 따라 개발 되어 많은 부분이 Micro Kernel과 비슷한 방식으로 디자인되어 있지만, 성능에 영향을 미치는 코드들을 Kernel MODE에서 실행한 점에서 Monolithic Kernel의 특징도 가지고 있다. 이러한 방식을 Hybrid Kernel이라고 한다.
[출처 : Wikipedia]
💡 Windows NT 기반의 OS들과 Windows CE 기반의 OS들은 Hybrid Kernel 구조로 설계되었지만,
Windows 9x, MS-DOS는 Monolithic Kernel으로 설계되었다.
프로세스란 프로그램이 실행 상태에 있는 것을 말한다.
프로세스는 사람이 프로그램을 실행함으로써 만들 수 있고, 또 다른 프로세스를 통해 만들 수도 있다.
이 때, 프로세스를 만든 프로세스를 부모 프로세스라고 하고, 만들어진 프로세스를 자식 프로세스라고 한다.
프로세스는 다음 3가지로 구성되어 있다.
실행하는 instructions이 모인 CODE
instruction의 실행 대상이 되는 DATA
운영 체제에서 프로세스가 실행되는 환경 및 상태를 나타내는 Process context
프로세스를 생성할 때에는, 부모 프로세스를 통해 자식 프로세스를 생성하는 방식으로 진행한다. (fork() 함수 이용)
최상위 프로세스는 init으로, init은 부팅 시 자신 스스로 생성한다.
OS 내부에는 프로세서가 어떤 프로세스에서 다른 프로세스로 스위칭하게 하는 커널 함수인
Dispatcher가 존재한다.
Dispatcher은 Scheduler의 내부에 구현되어 있으며, 프로세스를 스위칭할 때마다
Dispatcher의 코드를 실행하여 전환한다.
example) 컴퓨터 내부에 다음과 같이 주소가 할당되어 있다고 가정하자.
프로세스 A의 Code는 5000번지부터 5012번지까지로, 해당 코드를 모두 실행해야 A가 종료된다.
프로세스 B의 Code는 8000번지부터 8005번지까지로, 해당 코드르 모두 실행해야 B가 종료된다.
프로세스 C의 Code는 12000번지부터 12011번지까지로, 해당 코드를 모두 실행해야 C가 종료된다.
Dispatcher의 코드가 100번지부터 105번지까지라고 하고, 현재 Program Counter에 5000이 저장되어 있다고 할 때,
실행되는 instruction의 주소값을 시간 순으로 나타내면 다음과 같다.
위와 같이 Process가 Time Out(TimeSharing에서의 기준 시간 만료)으로 인해 전환될 때마다,
Dispatcher의 Code를 실행시킴으로써 전환하는 것을 확인할 수 있다.
two-state process model은 프로세스의 상태 변화를 그림으로 나타낸 것이다.
Dispatcher을 통해 Not Running 상태에서 Running 상태로 변경되고,
Running 상태에서 pause되면 Not Running 상태로 변경되는 것을 확인할 수 있다.
위 상태도의 Enter 부분은 프로세스가 생성되는 부분인데, 프로세스가 생성되는 방법은 다음과 같다:
그냥 실행하면 Foreground, &를 뒤에 붙여 실행하면 Background
또한, 상태도의 Exit 부분은 프로세스가 종료되는 부분인데, 프로세스가 종료되는 방법은 다음과 같다:
상태도의 Not Running 상태는 프로세스가 실행되지 않고 있는 상태를 나타내는데,
다음 2가지로 나눌 수 있다.
Ready State
준비 상태라는 뜻으로, Dispatcher을 통해 Running으로 전환되는 것을 기다리는 상태를 의미한다.
Blocked State (= Wait State, Sleep State)
대기 상태라는 뜻으로, 입출력 이벤트와 같이 특정 이벤트의 발생을 기다리는 상태이다.
이 상태에서 이벤트가 발생하게 되면 Ready State로 전환된다.
five-state process model은 two-state process model의 상태들을 좀 더 세분화시킨 모델이다.
위 모델에서 New 상태는 프로세스가 새로 생성된 상태로,
이 State에서 프로세스가 작업 큐에 Enqueue된다.
Terminated 상태는 Running 상태의 프로세스가 exit 명령어를 통해 종료된 것이다.
이 상태는 zombie 상태라고도 부르며, 부모 프로세스가 wait 명령을 통해 프로세스의 종료 상태를 반환받기 전까지 리소스를 점유하게 된다.
Terminated 상태에서 부모 프로세스가 wait() 함수를 호출하게 되면,
Terminated 상태였던 프로세스의 PCB에 존재하던 Accounting Information을
부모 프로세스에게 전달한 뒤, 운영체제가 해당 프로세스의 PCB를 회수한다.
만약 wait() 함수를 통해 종료하려 하는 프로세스에게 자식 프로세스가 존재한다면,
해당 자식 프로세스들은 init process의 자식 프로세스가 된다.
five-state process model에서는 다음과 같이 Queue를 통해 프로세스가 관리된다.
위처럼 Event Queue를 각 event마다 따로 구현해서 관리하게 되면 더 효율적으로 관리할 수 있다.
만약 프로세스들이 모두 Blocked State가 되어 프로세서가 더 이상 관여할 수 없다면,
프로세서의 사용도를 높이기 위해 해당 Blocked State의 프로세스들을 보조기억장치로 이동시키고
프로세서를 다른 프로세스에 할당하게 된다.
이렇게 Blocked 상태의 프로세스가 보조기억장치로 밀려난 걸 Suspended Blocked 상태라고 한다.
Suspended Blocked 상태에서 이벤트가 발생하게 되면 Suspended Ready 상태로 전환되어
OS가 swap in 할 때까지 대기한다.
Ready 상태에서 프로세스가 OS에 의해 일시정지되었을 경우에서 Suspended Ready 상태로
변경될 수 있다.
위 그림은 Suspended states를 포함한 프로세스 상태도이다.
운영 체제는 컴퓨터 하드웨어를 관리하면서 프로그램을 실행하기 위해 여러 내부 정보를 관리해야 한다.
따라서 운영 체제는 컴퓨터에서 실행되고 있는 모든 프로세스에 대한 정보도 저장하고 있는데,
프로세스가 저장되어 있는 block을 Process Control Block이라 한다.
PCB는 OS에 의해 생성 및 관리되며, PCB 하나 당 프로세스 하나의 정보가 저장되어 있다.
PCB에 저장되어 있는 정보는 다음과 같다 :
자연수 형태로 저장, 부모 프로세스의 식별자와 사용자의 식별자도 함께 저장됨.
프로세스가 실행되다가 중단되면 그 순간에 CPU 레시스터 내부에 저장된 값이 저장되는데,
이는 프로세스 진행 상황을 나타내므로 일종의 상태 정보에 해당됨
끊임없이 프로세스가 실행될 수 있도록 Running에서 다른 State로 전환될 때의 레지스터를 저장
레지스터에는 프로세스가 실행되면서 사용되는 값들이 저장되므로, 이에 대한 정보를 PCB에 저장하여야 한다.
PCB는 각각의 프로세스의 스케줄링 정보, 우선순위 등을 저장한다.
프로세스 사이의 통신에 대한 정보,프로세스의 권한 정보 등도 저장된다.
메모리 포인터
입출력 장치
자원 이용 통계 정보
PCB는 task_struct 형태로 프로세스 정보를 저장한다.
OS는 PCB를 양방향 링크드 리스트 형태(Double Linked List)로 관리한다.
주의할 점은 부모 프로세스와 자식 프로세스는 서로 PCB를 공유하지 않는다는 것이다.