본문으로 바로가기

Kernel (1) - what is kernel?

Contents

  1. Definition of kernel

  2. Role of kernel

  3. Kinds of kernel


Definition of kernel

컴퓨터 과학에서 커널(kernel)은 컴퓨터의 운영 체제의 핵심이 되는 컴퓨터 프로그램의 하나로, 시스템의 모든 것을 완전히 통제한다.[1] 운영 체제의 다른 부분 및 응용 프로그램 수행에 필요한 여러 가지 서비스를 제공한다. 핵심(核心)[2]이라고도 한다.

위키백과에서 긁어온 커널의 정의이다.

지금까지 포너블을 공부하면서 많은것을 접했지만 어느 사이트에서도 저렇게 당당하게 컴퓨터 과학에서는 내가 제일 중요한 핵심이야! 라는 내용을 본적이 없었다.

그만큼 커널이 담당하고 있는 부분이 크다고 할 수 있겠다.

Imgur

포너블을 공부하면서 난 stack,heap,BSS,code section 등 여러가지 메모리 구조에 대해서 공부했고, 위의 사진처럼 스택이 힙과 반대방향으로 자라서 결국 서로를 가르키고 있다는 정보도 알게 되었다.

그런데 왜 stack이 거꾸로 자랄까?


답은 바로 스택의 바로 밑부분에 kernel이 존재하기 때문이다.

프로그래머의 잘못된 코딩으로 stack영역에서 오버플로우가 발생하게 된다면, 커널 영역을 침범 할 여지가 생긴다. 혹여나 프로그램을 실행하는 중, 커널영역을 침범하여 운영체제가 망가지면 어떻게될까?

하지만, stackheap이 서로를 마주보고 있다면 이런생각을 안해도 된다.

왜냐하면 stack에서 오버플로우가 발생한다고 하더라도, 절대로 커널 영역을 침범할 수 없다.

이렇게 알게모르게 컴퓨터에서는 커널을 보호하기 위한 행동을 하고있었다.


커널 버전은 크게 3가지로 나누어진다.

예를들어서 1.2.3-456 이라는 커널 버전이 있다고 생각해보자.


첫번째 자리는 커널의 주버전을 뜻한다, 획기적이거나 커다란 변화가 있을때 증가한다.

두번째 자리는 커널의 부버전으로, 기능의 업그레이드 및 작은변화가 있을경우 증가한다.

세번째 자리는 패치 레벨이다. 커널의 해당 버전에 대한 수정이 있을경우 증가한다.


Role of kernel

위에서 설명했듯이 커널은 운영 체제의 핵심으로서, 운영 체제의 다른 부분과 응용 프로그램 수행에 필요한 여러가지 서비스를 제공해주는 역할을 한다.

이러한 대전제를 기본으로, 여러가지 세부적인 일들을 하기도 한다.


  • 보안

    • 커널은 컴퓨터 하드웨어와 프로세스들의 보안을 책임진다.

    • 윈도우 아키텍쳐에서는 커널에 유저모드, 커널모드 등등 의 모드가 나눠져있고, 리눅스에서도 커널을 관리할 수 있는 관리자 권한이 나눠져있다.

  • 자원관리

    • 한정된 시스템 자원을 효율적으로 관리하여 프로그램의 실행을 원할하게 한다. 프로세스에 필요한 자원을 할당하는것을 스케줄링이라고 한다.

      • 이러한 스케줄링은 선점,비선점 으로 나누어지며, 프로세스의 우선순위 변동 여부에 따라서 정적, 동적 스케줄링으로 나누어지기도 한다.

      • 대표적인 기법으로는 FIFO(First In First Out), SJF(Shortest Job First), HRN(Highest Response-ratio Next)등이 있다.

    • 프로세스 말고도 메모리를 관리하며, 프로세서도 관리한다.

  • 추상화

    • 운영 체제를 관리하는 만큼 커널은 복잡한 내부를 가지고 있다. 이를 숨기고 깔끔하고 알괸성 있는 인터페이스를 제공하기 위해 커널은 추상화를 통해 구현된다.


여기서 추상화란, 어떠한 행동을 일반화 시키는 개념이다.

예를 하나 들어보자. *이라는 문자를 100번 출력해야한다고 생각해보자.

/* code.c */
#include <stdio.h>
int main(void)
{
   printf("*");
  ... // repeat 100 times
   printf("*");
   return 0;
}


이러한 코드에 추상화 개념을 적용시키면 어떻게될까?

/* new.c */
#include <stdio.h>
int main(void)
{
   for(int i = 0; i < 100; i++)
  {
       printf("*");
  }
}

new.c에서는 단순한 별찍기를 추상화 시켰다고 볼 수 있다.

즉, 단순히 별을 한번 찍는 행동을 반복문을 사용하므로서 추상화 시켰고, 반복문이 실행되며 행동이 실체화 된다고 볼 수 있겠다.


이렇게 우리가 자주쓰던 반복문도 일종의 추상화라고 할 수 있다.

그렇다면 왜 추상화를 사용해야할까?


  1. 코드의 가독성, 재사용성을 높임

  2. 생상성을 높이고, 에러를 감소시킴

  3. 프로그래머가 유지 보수, 버그 해결에 쓰이는 시간을 줄일 수 있음.

커널도 추상화를 통해 관리되어지므로, 위의 장점을 모두 챙긴다고 볼 수 있겠다.


Kinds of kernel

단일형 커널(Monolithic kernel)

커널의 다양한 서비스 및 높은 수준의 하드웨어 추상화를 하나의 덩어리로 묶은것.

운영 체제 개발자의 입장에서 유지 보수가 더 어려우나 성능이 좋다.

관리자 모드에서 작동하는 프로세스 관리, 메모리 관리 등의 운영 체제 서비스를 구현하기 위한 시스템 콜(system call)들로 구현되어있다.

위와 같은 구조이다보니, 같은 주소, 메모리 공간 내에세 실행 되게 때문에, 한 모듈의 버그가 시스템 전반들 다운 시킬 수 있다.

리눅스 커널이, 유닉스 커널, MS-DOS 등이 단일형 커널로 제작되었다.


마이크로 커널(Micro kernel)

하드웨어 추상화는 간결하게 하고, 더 많은 기능은 서버라고 불리는 소프트웨어를 통하여 제공한다.

마이크로 커널은 기본 연산 집합과, 운영체제 서비스를 구현한 스레드를 관리하며, 작은 시스템 콜로 서비스가 구현되어진다.

단일형 커널과 대조되어지는 모습이다.


혼합형 커널(Hybrid kernel)

혼합형 커널은 마이크로 커널을 바탕으로 하나, 유저레벨에서 커널이 실행될 때 성능 향상을 위하여 느린 코드를 커널 레벨에서 수행 하도록 수정한 것이다.

ReactOS, BeOS 등이 혼합형 커널이라고 할 수 있다.


엑소 커널(Exo kernel)

낮은 수준의 하드웨어 접근을 위한 최소한의 추상화만 제공한다.

엑소커널의 기본 아이디어는, 개발자에게 가장 낮은 수준의 추상화를 제공하여 개발자들이 하드웨어와 관련해 가능한 많은 결정권을 가지도록 한 것이다.

엑소커널은 보호와 다중화만 제공하므로 크기가 매우 작고, 마이크로 커널이나 단일형 커널의 추상화에 비해서 훨씬 간단하다.

엑소커널에서 구현된 어플리케이션은 라이브러리 OS 라고 불린다.

라이브러리 OS는 특정 메모리 영역, 디스크 블럭 등의 자원을 커널에게 요청할 수 있다.


오늘은 간단하게 커널이 무엇인지에 대하여 알아보았다.

다음 글부터는 본격적으로 "리눅스" 커널이 무엇인지에 대하여 알아보겠다.


Reference