최근 들어 문득 커널이 운영체제의 핵심인 것은 알고 있으나 커널이 구체적으로 무엇이고 어떤 식으로 작동하는지 설명하기는 어렵다는 생각이 들었다. (물론 배우고 난 다음 시간이 지나면서 까먹은 게 가장 큰 원인이지만)
오늘은 커널의 개념과 그 작동 원리에 대해서 공부한 내용을 정리해 보고자 한다.
컴퓨터 구성 요소
컴퓨터를 구성하는 요소는 H/W와 S/W고 S/W는 다시 Kernel과 Application으로 나뉜다. 이러한 관점으로 볼 때 컴퓨터는 H/W, Kernel(S/W), Application(S/W) 로 이루어진 3층 집이라고 볼 수 있다.
Kernel 이란
커널은 컴퓨터 운영체제의 핵심이 되는 프로그램으로 하드웨어와 응용 프로그램 사이에서 인터페이스를 제공하는 역할을 하며 컴퓨터 자원들을 관리하는 역할을 한다.
Kernel이 없었던 시절
초창기 컴퓨터에서 커널은 필수 요소가 아니었다. 초기 응용 프로그램은 운영체제의 지원을 받지 않고도 실행이 가능했는데, 이것은 당시 초창기 컴퓨터들의 일반적인 운영 방식이었다.
그렇기 때문에 다른 프로그램을 실행하기 위해서는 컴퓨터의 전원을 껐다가 켬으로써 다시 입력자료를 읽어 들여야 했다. 또한 운영체제의 역할이 작았기 때문에 응용 프로그램이 비정상적으로 종료되면 사용 중이던 자원을 정상적으로 반환하지 못하는 문제도 발생했다.
User Mode와 Kernel Mode
오늘날의 운영체제는 사용자가 실행하는 응용 프로그램이 하드웨어 자원에 직접 접근하는 것을 방지하여 자원을 보호한다. 만약 응용 프로그램이 CPU, 메모리, 하드 디스크 등에 마음대로 접근하고 조작할 수 있다면 자원이 무질서하게 관리될 것이고, 응용 프로그램이 조금만 실수해도 컴퓨터 전체에 큰 악영향을 끼칠 수 있다.
이러한 운영체제의 문지기 역할은 이중 모드로써 구현된다. 이중 모드(dual mode)란 CPU가 명령어를 실행하는 모드를 크게 유저 모드와 커널 모드로 구분하는 방식이다. CPU는 명령어를 유저 모드로써 실행할 수 있고, 커널 모드로써 실행할 수 있다.
- 유저 모드 : 운영체제 서비스를 제공받을 수 없는 실행 모드
- 커널 영역의 코드를 실행할 수 없는 모드
- 일반적인 응용 프로그램은 기본적으로 유저 모드로 실행된다.
- 유저 모드로 실행 중인 CPU는 입출력 명령어와 같이 하드웨어 자원에 접근하는 명령어를 실행할 수 없다. - 커널 모드 : 운영체제 서비스를 제공받을 수 있는 실행 모드
- CPU가 커널 모드로 명령어를 실행하면 자원에 접근하는 명령어를 비롯한 모든 명령어를 실행할 수 있다. - 유저 영역 : 응용 프로그램이 동작하기 위해 사용되는 메모리 공간
- 커널 영역 : 메모리에서 유저 영역을 제외한 영역
System Call
‘Hello world’를 출력하는 프로그램을 만들었다고 가정하자. ‘Hello world’라는 문구가 화면에 표시되려면 응용 프로그램은 모니터라는 하드웨어 자원을 조작해야 한다. 그렇게 되려면 아래와 같은 과정을 거쳐야 한다.
유저 모드로 실행되는 프로그램이 자원에 접근하는 운영체제 서비스를 제공받으려면 운영체제에 요청을 보내 커널 모드로 전환되어야 한다. 이때 운영체제 서비스를 제공받기 위한 요청을 system call(시스템 콜)이라고 한다.
이러한 시스템 콜은 일종의 소프트웨어 인터럽트이다. CPU가 시스템 콜을 처리하는 순서는 인터럽트 처리 순서와 유사하다. 시스템 콜을 발생시키는 명령어가 실행되면 CPU는 지금까지의 작업을 백업하고, 커널 영역 내에 시스템 호출을 수행하는 코드(인터럽트 서비스 루틴)를 실행한 뒤 다시 기존에 실행하던 응용 프로그램으로 복귀하여 실행을 계속해 나간다.
일반적으로 응용 프로그램은 실행 과정에서 운영체제 서비스들을 매우 빈번하게 사용한다. 그 과정에서 빈번하게 시스템 콜을 발생시키고 유저 모드와 커널 모드를 오가며 실행된다.
Q&A
운영체제가 제공하는 서비스 중 커널에 포함되지 않는 서비스는 어떤 것이 있나요?
- 대표적으로 GUI나 CLI와 같은 사용자 인터페이스가 이에 해당된다.