> For the complete documentation index, see [llms.txt](https://riverallzero.gitbook.io/summary/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://riverallzero.gitbook.io/summary/operating-system/os-and-kernel.md).

# OS and Kernel

### OS

다음과 같은 3가지 목적을 가진다.

* 사용자가 컴퓨터 하드웨어에서 편리하고 효율적으로 프로그램을 실행할 수 있는 환경 제공
* 요청된 임무를 수행하기 위해 컴퓨터 별도의 자원 할당
* 사용자의 프로그램 실행을 감독하고 작동과 입출력 장치 컨트롤 관리

운영체제는 컴퓨터가 부팅될 때 메모리 내 **커널 영역**이라는 공간에 따로 적재되어 실행된다. 커널 영역을 제외한 나머지가 **사용자 영역**으로, 사용자가 이용하는 응용 프로그램이 적재된다.

### Kernel

자원에 접근하고 조작하는 것, 프로그램을 올바르고 안전하게 실행하는 기능을 담당하는 부분이다. 커널에 사용자의 명령을 전달하고 실행결과를 사용자에게 알려주려면 **인터페이스**가 필요하다.

* GUI(Graphical User Interface): 스마트폰이나 윈도우 화면처럼 그래픽을 기반으로 컴퓨터와 상호작용할 수 있는 인터페이스
* CLI(Command Line Interface): 명령어를 기반으로 컴퓨터와 상호작용할 수 있는 인터페이스

운영체제는 사용자가 실행하는 응용 프로그램이 하드웨어에 직접 접근하는 것을 **이중모드**로 방지해 자원을 보호한다.

### 이중모드

이중모드는 사용자모드(1)과 커널모드(0)으로 나뉜다.

#### 사용자 모드

일반적인 응용프로그램은 사용자 모드로 실행된다. 커널 영역의 코드를 실행할 수 없으며 하드웨어 자원에 접근할 수 없다.

#### 커널 모드

커널 영역의 코드를 실행할 수 있으며 하드웨어 자원에 접근할 수 있다.

### 시스템 호출

![](/files/uVkXzgAhDGiKKXfLfqIh)

사용자 모드로 실행되는 프로그램은 시스템 호출을 통해 커널 모드로 전환하여 운영체제 서비스를 제공받을 수 있다. 일종의 인터럽트이며, 사용자 모드에서 시스템 호출을 통해 커널모드로 전환되고 접근이 끝나면 다시 사용자 모드로 복귀한다. 응용 프로그램이 실행될 때 빈번하게 시스템 호출을 발생시키고 사용자 모드와 커널 모드를 오가며 실행된다. 커널에 대해 더 자세히 알아보자. 커널은 Monolithic Kernel, Layerd, Micro Kernel, Module, Hybrid와 같이 다양한 구조를 가진다.

### 커널 구조

#### Monolithic Kernel

![](/files/ZOepcJwSSaPQx1FVajkC)

**전통적인** 운영체제 설계 방법이다. 커널의 핵심 기능을 구현하는 모듈들이 구분 없이 하나로 구성되어있다.

**장점**

* 모듈이 분리되지 않아 모듈 간 통신 비용이 줄고 효율적인 운영이 가능하다.
* 빠르다.

**단점**

* 한 모듈에 장애가 생기면 전체에 영향을 끼친다.
* 수정이 어려워 이식성이 떨어진다.
* 커널의 기능을 확장하면 크기가 방대해져 관리가 어려워진다.

#### Layerd Kernel

![](/files/x9mn5hNQHkBkWZpHaUnK)

비슷한 기능을 수행하는 요소가 그룹화, 계층화 된 형태이다. 가장 아래쪽 레이어(0)은 하드웨어, 가장 높은쪽 레이어(N)는 사용자 인터페이스이다. 각 계층은 자신의 하위 계층만 사용 가능하다.

**장점**

* Monolithic 구조보다 모듈화가 잘 되어있다.
* 시스템 검증과 오류 수정이 용이하다.
* 시스템 설계나 구현이 단순해진다.

**단점**

* Monolithic 구조보다 성능이 낮다.
* 추가적인 시스템 호출이 필요하다.

#### Micro Kernel

![](/files/0zutRPYhzjPVbHNNRewP)

프로세스 관리, 메모리 관리, CPU 스케줄링, 프로세스 간 통신(IPC)과 같은 기본적인 기능만을 커널 영역에서 제공하고 이 외의 다른 기능은 **사용자 영역**에 구현함으로써 커널의 크기를 줄인 구조이다.

**장점**

* 각 모듈이 독립적으로 작동해 한 모듈에 장애가 생겨도 전체에 영향을 주지 않는다.
* 이식성이 뛰어나다.

**단점**

* 모듈 간 프로세스 통신(IPC)가 발생하여 느리며 메세지 전달 방식을 사용해 오버헤드가 발생할 수 있다.
* 시스템의 자원을 효율적으로 사용하기 어렵다.

#### Module Kernel(LKM:Lodable Kernel Module)

![](/files/AG6fi0MDdxfQKgribgtW)

커널에 핵심 기능 세트가 있고 추가 서비스를 모듈 형태로 동적으로 추가할 수 있는 구조이다.

**장점**

* 전체 시스템을 수정하지 않고도 새로운 모듈을 추가할 수 있다.
* 엄격한 계층 구조 없이 서로 상호작용할 수 있어 **유연**하다.
* Micro 구조처럼 통신이 필요 없어 **효율적**이다.

**단점**

* 동적으로 로드되는 모듈을 제대로 관리하지 않으면 **보안 취약점**이 발생할 수 있다.
* 커널 관리 복잡도가 증가한다.
* 동적 동작이 제대로 구현되지 않으면 한번에 구현되는 Monolithic보다 비효율적이며 리소스 소비가 증가할 수 있다.

#### Hybrid

Monolithic + Micro 구조이다. 데스크톱이나 모바일 디바이스처럼 복잡하거나 다양한 컴퓨팅 환경에서 요구사항과 작업이 크게 달라질 수 있는 환경에서 널리 사용된다. 예시로는 Mac OS, iOS, Android가 있다.
