Engineering/Linux Kernel

[Linux Kernel] 커널의 개념과 리눅스 커널의 구조

5=0 2020. 2. 18. 22:13

Content

1. 운영체제(OS)와 배포판, 그리고 커널
2. 리눅스 커널 구조

 


 

커널이 무엇인지 이해하고, 리눅스 커널의 구조에 대해 알아봅니다.


 

1. 운영체제(OS)와 배포판, 그리고 커널

일반적으로 운영체제(Operating System) 배포판, 그리고 커널

의미 구분 없이 사용되는 경우가 많습니다.

 

'커널' 무엇인지 알고 싶다면, 이들 사이의 차이점은 알아야겠죠?

 

따라서 본격적으로 커널을 살펴보기 전에!

우리가 배우려는 '커널'이란 것이 정확히 무엇인지.

'커널'과 운영체제, 그리고 배포판은 어떻게 다른 것인지 짚고 넘어가도록 하겠습니다.

 

 

 

우선 '컴퓨터' 대해서 먼저 알아볼까요?

우리에게 너무 익숙한 컴퓨터이지만, 다시 한번 살펴봅시다.

 

컴퓨터는 크게 하드웨어(HW) 소프트웨어(SW) 구분됩니다.

하드웨어는 눈으로 보이고, 손으로 만질 있는 (흔히 '물리적인' 이라고 합니다.) 장치들 입니다.

모니터, 키보드, 프린터, 컴퓨터 본체, 본체 중에서도 CPU, 메모리 등의 기기들이 컴퓨터를 이루는 하드웨어가 되겠죠.

 

이와 반대로, 소프트웨어는 눈에 보이지 않고, 손으로 만질 없는 요소들 입니다.

프로그래밍 관련 지식이 없는 분들은,

여기까지의 설명으로는 소프트웨어가 무엇인지 감이 오지 않을 있는데요.

소프트웨어를 이루는 요소들을 한번 구분하다 보면 이해가 되실 겁니다.

 

 

 

소프트웨어는 운영체제 응용 프로그램으로 다시 구분됩니다.

운영체제의 예시로 우분투, 윈도우 등을 있습니다.

응용프로그램은 특정 운영체제 위에 설치되는 프로그램으로, 가장 쉽게 MS office, 웹브라우저 등이 있습니다.

 

 

 

그리고 운영체제는 다시 커널 시스템 프로그램으로 구분됩니다.

여기서 우리가 배울 '커널' 등장 합니다.

일단, '커널' 운영체제의 핵심 기능 부로 컴퓨터 자원들을 관리하는 역할 합니다.

그런데 커널항상 컴퓨터 자원들만 바라보고 있습니다.

사용자와의 상호작용은 전혀 지원하지 않죠.

 

따라서 사용자와 직접적인 상호작용을 위해서는 시스템 프로그램이 필요하고,

이러한 이유에서 운영체제는 커널 뿐만 아니라 시스템 프로그램을 함께 제공합니다.

대표적인 시스템 프로그램은 (Shell) 이라는 명령어 해석기 입니다.

쉘은 사용자가 컴퓨터에게 전달하는 명령을 해석하는 프로그램으로,

사용자와의 상호작용을 가능케 하죠.

 

 

 

여기까지 '컴퓨터' 세분화 해보았습니다.

정리해보면 아래 그림과 같습니다.

 

그림에 표시해 두었지만.

이로써 운영체제와 커널의 관계가 확실해 졌습니다.

 

운영체제는 커널을 포함하는 개념이고,

커널은 운영체제의 핵심 부분 이라는 것이죠.

 

 

 

이제 남은 녀석은 '배포판' 입니다.

'배포판' 운영체제와 유사한 의미로 많이 쓰입니다.

커널과 함께 시스템 프로그램, 뿐만 아니라 이들을 쉽게 설치할 수 있는 기능까지 제공하는 것을 '배포판'이라고 합니다.

따라서 운영체제와 같거나 또는 운영체제를 포함하는 의미를 가진 녀석이 '배포판' 입니다.

 

사실상 '배포판' 이라는 단어는 리눅스 커널을 포함한 운영체제에 한해 사용됩니다.

리눅스 커널은 모든 소스가 모든 사용자에게 오픈이 되는데요.

따라서 리눅스 커널을 사용하려는 사용자들이

자신의 입맛에 맞는 시스템 프로그램들을 포함하여 운영체제의 형태로 다시 '배포' 하는 사례가 많아졌고.

이때부터 리눅스 계열의 운영체제들은 '배포판' 이라는 단어로 자주 대체되어 사용되고 있습니다.

 

 

정리를 해보면 다음과 같습니다.

'운영체제'는 커널과 함께 사용자 편의를 위한 시스템 프로그램을 포함하며,

'커널'은 컴퓨터 자원을 관리하는 운영체제의 핵심 부분이다.

배포판과 운영체제는 같은 의미이나, '배포판'은 주로 리눅스 계열 운영체제에 한해 사용된다.

 

 

 

2. 리눅스 커널 구조

커널의 가장 큰 역할은 컴퓨터의 물리적(=하드웨어) 자원과 추상화 자원을 관리 하는 것 입니다. 

 

여기서 추상화란 물리적으로 하나 뿐인 하드웨어를 여러 사용자들이 번갈아 사용하게 중재함으로서,

마치 한 개의 하드웨어가 여러개인 것처럼 보여지도록 하는 기술을 말합니다. 

추상화된 환경에서 각 사용자들은 본인이 하나의 하드웨어를 독점하여 활용 하는 것 처럼 느끼게 되죠. 

이를 위해 커널은 하나의 하드웨어 자원을 여러 사용자들을 위한 복수개의 추상화된 객체로 관리합니다. 

 

 

 

커널이 추상화하여 관리하는 물리적 자원들과 이를 추상화한 자원을 칭하는 용어 간 대응 관계는 아래와 같습니다. 

 

CPU -> 태스크(task)

메모리 -> 페이지(page), 세그먼트(segment)

디스크 -> 파일(file)

네트워크 -> 소켓(socket)

 

이 외에도, 커널이 관리하는 자원으로 외부장치 (ex. 프린터, GPU 등) 이 있습니다. 

 

 

 

자, 다시 이야기하지만 커널은 위에서 말한 물리 자원과 추상 자원들을 관리(Manage) 합니다. 

따라서 리눅스 커널의 구성요소는 여러가지 자원들을 관리하는 관리자(Manager)들 입니다. 

커널을 구성하는 자원 관리자들은 아래와 같이 크게 5가지 입니다! 

 

1) 태스크(Task) 관리자

  : 물리적 자원인 CPU를 추상적 자원인 태스크로 제공 

 

2) 메모리(Memory) 관리자 

  : 물리적 자원인 메모리를 추상적 자원인 페이지나 세그먼트로 제공

 

3) 파일 시스템(File System) 관리자 

  : 물리적 자원인 디스크를 추상적 자원인 파일로 제공

 

4) 네트워크(Network) 관리자

 : 물리적 자원인 네트워크 장치를 추상적 자원인 소켓으로 제공

 

5) 디바이스 드라이버(Device Driver) 관리자

 : 각종 외부 장치에대한 접근 

 

 

 

그런데, 커널은 왜 이러한 자원들을 관리해야 할까요? 

바로 사용자가 물리적인 하드웨어에 접근하고 사용할 수 있도록 매개하기 위해서 입니다. 

컴퓨터 구성요소들은 컴퓨터만의 언어와 규칙으로 하드웨어에 접근하고 통신해야 하는데,

일반적인 사람들은 이러한 컴퓨터 세계의 언어와 규칙을 모르죠.

따라서 커널이 이를 중간에서 돕는 역할을 한다고 보시면 됩니다. 

 

 

 

아래 그림을 보며 좀 더 설명드리겠습니다. 

 

 

위에서 말씀드린 커널 구성요소들이 존재하는 공간Kernel Space라고 부릅니다. 

Kernel Space위에 사용자로 여겨지는 태스크(그림에선 process)들이 존재하는 User Space가 있습니다. 

저희가 아는 C/C++과 같은 컴퓨팅 언어로 작성된 프로그램 파일이 결국 task들이 되는데,

따라서 태스크를 사용자라고 생각하시면 됩니다. (태스크엔 사용자의 명령이 담겨져 있으니까요!)

 

이 Kernel Space와 User Space 사이에는 System Call Interface가 있습니다. 

User Space의 task들이 커널이 관리하는 자원에 접근해야할 필요가 있으면 

System Call Interface를 통해 Kerenel Space의 자원 관리자에게 요청이 전달 됩니다. 

그리고 이 커널의 각 자원 관리자는 사용자 요청에 맞게 알맞는 하드웨어에 사용자 명령을 전달하고 작업을 수행합니다. 

 

 

 

 

요약하자면, 커널은 '사용자가 system call을 통해 컴퓨터 자원을 사용할 수 있게해주는 자원 관리자' 라고 할 수 있습니다.