※ 본문은 혼자 공부한 내용을 기록한 글입니다. 오개념이 있다면 반드시 댓글로 알려주세요!
[ 1 ] kernel
만약 사용자가 실행하고 있는 응용 프로그램이 CPU, 메모리 등에 직접 접근하고 조작할 수 있다면 하드웨어 자원이 무질서하게 관리될 것이다. 이에 OS는 CPU의 실행 모드를 User mode와 Kernel mode로 나누어 사용자가 실행하는 응용 프로그램이 하드웨어 자원에 직접 접근하는 것을 방지하며 자원을 보호하는 역할을 한다.
이때 kernel이 하드웨어와 소프트웨어 간의 인터페이스 역할을 담당하며 Device Driver, File System, I/O execution, error detection 등의 주요 기능을 수행한다.
User area에서 kernel area의 권한이 필요한 기능을 수행하기 위해서는 system call 이라는 인터페이스를 거쳐야 하며, system call에 대한 내용은 다음 게시글을 참고하자.
kernel은 크게 Monolithic kernel과 Micro kernel로 나누어지며 각각의 장단점이 있다.
[ 2 ] Monolithic kernel
Monolithic kernel에서는 kernel의 코드가 '한 덩어리'로 구성되어 있다. 즉, kernel이 수행하는 Device Driver, File System, I/O execution, error detection 등의 주요 기능들의 코드가 하나의 바이너리로 이루어져 있는 것이다.
또한, 위 그림처럼 한 프로세스의 관점에서는 자신의 주소공간(address space) 중 일부에 kernel 코드 영역이 매핑되는 것처럼 간주되기 때문에 system call 및 kernel 서비스 간의 데이터 전달 시 오버헤드가 적다는 장점이 있다.
하지만, 모든 kernel 서비스들이 하나의 바이너리로 이루어져 있기 때문에 일부 기능의 수정이 전체에 영향을 미칠 수 있고, 각 모듈이 유기적으로 연결되어 있기 때문에 kernel 크기가 커질수록 유지 보수가 어렵다는 단점이 있다. 즉, 한 모듈의 버그가 시스템 전체에 영향을 끼칠 수 있음을 의미한다.
[ 3 ] Micro kernel
Monolithic kernel과 달리 Micro kernel은 각 kernel 서비스를 기능에 따라 모듈화하여 독립된 주소 공간에서 실행한다. 이러한 모듈을 '서버'라고 하며, 서버는 독립된 프로세스로 구현된다. Micro kernel의 kernel space는 서버들 간의 통신(IPC), 애플리케이션의 서비스 콜 전달과 같은 단순한 기능만을 제공한다.
Monolithic kernel에서는 모든 서비스가 한 덩어리의 코드에 모여 있었기에 기능 간 커뮤니케이션이 효율적이었지만, Micro kernel에서는 각 서비스가 독립된 프로세스로 구현되기에 기능 간 통신을 하기 위해서는 IPC(Interprocess communication)를 거쳐야 한다.
성능 측면에서는 Monolithic kernel이 Micro kernel보다 우위에 있다. 그 이유는 Monolithic kernel에서는 한 번의 system call로 kernel space에 진입하면 모든 기능이 같은 주소공간에 있으므로 다른 기능들을 단순한 함수 호출로 사용할 수 있기 때문이다.
반면, Micro kernel에서는 각 기능들이 독립된 프로세스로 구현되어 있기 때문에 기능 간 통신을 하려면 프로세스 간 통신을 지원하는 IPC를 거쳐야 하는데 그로 인해 발생하는 오버헤드가 크다.
그림에서도 확인할 수 있듯이 Monolithic kernel에서는 한 번의 system call로 블록 I/O를 처리하는 반면, Micro kernel에서는 애플리케이션이 system call → kernel이 VFS 서버에 메시지 전달(IPC) → VFS의 system call → ... 총 세 번의 system call을 거쳐 블록 I/O를 처리한다.
성능은 좋지 않지만 Micro kernel은 Monolithic kernel의 단점을 보완할 수 있다. 우선, 각 kernel 서비스가 따로 구현되어 있기 때문에 서로 간의 의존성이 낮아 개발 및 유지 보수가 상대적으로 용이하다. 또한, Monolithic kernel에서는 한 모듈의 버그가 시스템 전체에 영향을 줄 수 있지만, Micro kernel에서는 문제가 있는 서버의 버그만 해결하면 된다. 서버별로 독립적인 실행 및 검증이 가능하다는 점에서 기능별 검증이 중요한 임베디드 로봇 산업, 의료 컴퓨터 분야에 적합하게 사용될 수도 있다.
[ 4 ] Hybrid structure
하지만, 대다수 현대의 OS들은 특정 디자인의 kernel만 따르는 것은 아니다.
리눅스의 경우 일반적으로 커널 전체가 하나의 주소 공간을 사용하는 Monolithic kernel이지만, 기능의 확장을 위한 일부 동적 모듈(loadable kernel module)을 제공하기도 한다.
윈도우의 경우 Monolithic kernel 구조가 기본이지만, 특정 서브 시스템에서는 Micro kernel를 활용한다.
'CS > 운영체제' 카테고리의 다른 글
[운영체제 OS] 프로세스와 스레드, 그리고 병렬처리 (2) | 2023.06.14 |
---|---|
[운영체제 OS] 운영체제의 역사 - Mainframe, Spooling, Multiprogramming, Timesharing (1) | 2023.04.18 |
[운영체제 OS] system call 및 호출 루틴 (1) | 2023.04.16 |
[운영체제 OS] 운영체제란? (1) | 2023.04.16 |