컴퓨터의 커널이라고 함은 무엇을 의미할까? 학부생 1학년 시절 개발자 중에 제일 머리 똑똑한 사람은 커널 개발자라는 말을 얼핏 듣고 생긴 커널의 첫 인상은 어렵다 복잡하다였다. 사실 커널이 무엇인지도 몰랐지만, "컴퓨터의 극의에 다다른 이들만이 이해할 수 있는 영역" 정도로 받아들였던 것 같다.

운영 체제 과목을 수강하고, 커널에 대해서 어느정도는 이해하고 있다고 생각했지만 막상 다른 분야에 종사하는 사람에게 커널이란 이런 이런 역할을 하는 친구야라고 자신있게 말하기엔 여전히 굉장히 어색하다.

예를 들어 운영 체제는 커널과 같은 말인지. 커널을 접근한다는게 정확히 무슨말인지에 대해서 스스로 질문을 해봤으나 그 답이 쉽게 나오지 않는다.

해당 글에서는 커널은 무엇을 하는 친구인지, 또 운영체제와의 어떤 관계를 갖는지를 중심으로 커널을 소개하고자 한다.

Kernel이란?

[그림 1-1] Unix Structure

kernel을 papago에 돌려보면 알맹이라는 번역 결과를 얻을 수 있다. 도대체 왜 알맹이일까를 살펴보면, Unix 구조를 보면 바로 이해가 된다. 맨 위의 application, 그리고 가장 안쪽에 알맹이로서 kernel이 존재한다.

그 외에 shell, system calls, library routines 등이 application의 요청을 받아 중요한 역할을 수행한다.

근데 여기서 알맹이라는 이해도 사실 조금 추상적이다. 그래서 Unix 운영 체제의 핵심이라고 불릴 수 있는 요소는 무엇일까?

이를 이해하기 위해서는 Unix 시스템에서 프로그램이 동작하는 과정을 살펴보아야 한다.

Unix 운영 체제에는 두 가지 mode가 존재한다.

바로 user modekernel mode가 그것이다.

user mode는 일반 사용자가 프로그램을 실행하면 구동되는 모드이다. 조금만 더 쉽게 설명하자면, 우리가 크롬을 열게되면, 이때 컴퓨터는 유저 모드에서 크롬이라는 application의 실행을 처리한다. 다만 컴퓨터 리소스에 직접적으로 접근할 수 없다. 즉 일반 유저가 자유롭게 컴퓨터 자원을 접근하는 것이 Unix에선 막혀있다.

kernel mode는 일반 사용자가 직접적으로 접근할 수 없는 모드이라고 일단 간단하게 생각을 해보자.

여기까지가 간단한 설명이였고 이제 본격적으로 둘을 이해하려면 Unix에서 프로그램이 어떻게 실행되는지를 이해해야 한다.

[그림 1-2] application level에서 시스템콜 API인 open()을 사용하는 과정

위의 [그림 1-2]은 C로 작성된 프로그램(user application)이 실행되는 과정을 user mode와 kernel mode 두 모드를 중심으로 표현하였다.

프로그램을 클릭하여 시작한다고 생각해보자. 프로그램을 실행하려면 당연히 컴퓨팅 자원이 필요하다. 당장 생각나는 CPU, MEM, DISK와 같은 것 외에도 네트워크의 연결(소켓이라 불리는), 키보드나 모니터와 같은 주변 장치와 같은 것들도 모두 컴퓨팅 자원으로써 프로그램 실행에 기여한다.

그럼 프로그램은 어떻게 자원을 받아서 실행되는 걸까? 바로 user mode와 kernel mode의 긴밀한 연결을 통해 프로그램은 자원을 할당받는다.

앞서 언급하엿듯 user mode에서는 직접적으로 접근할 수 없다. 때문에 user는 system call을 통해 컴퓨터 리소스를 할당해달라는 요청을 system call interface(system call의 처리를 1차적으로 담당하는 친구라고 보면 된다) 보낸다. system call interface는 user mode와 kernel mode를 매개해주는 역할을 수행한다고 이해할 수 있겠다.

kernel mode에 진입하면 system call interface에서는 받은 요청을 처리하기 위해, 우선 system call vector table이라는 곳으로 요청을 매개한다. system call vector table에서는 해당 시스템 콜 코드가 어디에 위치해 있는지를 알려주는 역할을 수행한다. open이라는 시스템콜 요청이 들어오면 system call vector table에서는 해당 시스템 콜을 실행하기 위해 테이블을 마구 뒤지게 된다. 그러다 해당하는 system call을 찾으면 해당 하는 위치로 가서 해당 system call 코드를 실행한다.

최종적으로 실행 결과를 system call interface에 돌려주고, 이는 다시 user application에 전달된다.

다 쓰고나니 내용이 되게 많아보이지만 사실 핵심은 간단하다. user mode에서는 컴퓨팅 리소스에 접근할 수 없고 항상 kernel mode를 거친다는 것.

이와 관련해서는 이야기를 이만 줄이도록 하고, 시스템콜에 대한 추가적인 내용은 작성한 다른 글을 참고해보시면 좋겠다. 참고링크: [os] introduction

다시 본론으로 돌아와서, 그럼 kernel은 무엇일까? 바로 앞의 리소스를 할당해주는 주체가 바로 커널이다. 커널은 단단한 알맹이로서 전화기, 노트북, 서버 컴퓨터 가리지 않고 하드웨어의 모든 주요 기능을 제어하고 조율한다.

유저는 kernel에 직접적으로 접근하는 대신 shell과 library routine(c의 lib이라고 생각)을 통해 system call을 system call interafae에 전달하거나 아니면 곧바로 system call interface에 system call 요청을 보내는 식으로 해당 프로세스(프로그램이 실행된 상태) 실행에 필요한 자원을 요구한다.

커널의 역할

커널은 크게 총 4가지의 기능을 수행한다.

  1. CPU 관리: 어떤 프로세스가 CPU를 얼마나 오랫동안 점유할지를 결정
  2. Memory 관리: RAM 메모리를 어떻게 사용할지 또 무엇을 저장할지를 결정
  3. Device Driver 관련 작업: 하드웨어와 프로세스 사이에서 중재자의 역할을 수행
  4. System call 관련 작업: System call api를 통한 프로세스의 리소스 요청을 처리

이와 관련된 내용 전반을 운영 체제라는 교과에서 배우게 된다.

커널과 운영 체제는 같은 말일까?

결론부터 말하자면 그렇지 않다. 운영 체제는 커널을 포함하여 다른 추가적인 소프트웨어들이 내장되어 있다. 다르게 표현하자면 Kernel은 운영 체제의 주요 구성 요소 중 하나이다. 커널 위에 유틸리티 소프트웨어들과 같은 친구들이 붙게 되면 이를 비로소 OS라고 부른다.

근데 다만 OS의 대부분을 커널이 차지하기 때문에, 어떻게 보면 커널이 OS라고 볼 수도 있겠지만 엄밀하게 따지자면 커널은 OS와는 다른 개념이라고 이해해야 한다.

참고 자료

[Linux 커널이란 무엇일까요?

Linux 커널은 Linux 운영 체제(OS)의 주요 구성 요소이며 컴퓨터 하드웨어와 프로세스를 잇는 핵심 인터페이스입니다.

www.redhat.com](https://www.redhat.com/ko/topics/linux/what-is-the-linux-kernel)

'CS' 카테고리의 다른 글

Cache Hit, Cache Miss 개념, Cache Miss의 종류  (0) 2022.11.28
Cache Memory 소개  (0) 2022.11.28
Ch2. Operating-System Structures  (0) 2022.11.15
[OS] Introduction  (1) 2022.09.23
[리눅스 프로그래밍] 리눅스 계보  (2) 2022.09.23