Kernel

Updated:

커널

커널(kernel)은 컴퓨터의 운영 체제의 핵심이 되는 컴퓨터 프로그램의 하나로, 시스템의 모든 것을 완전히 통제한다. 운영체제의 다른 부분과 응용 프로그램이 요구하는 기본 서비스를 모두 제공하고, 시스템을 구성하는 중요한 자원들(메모리, 파일, 주변 장치)을 관리합니다.

커널은 프로그램의 수행상태인 프로세스 간의 보안 접근을 책임지는 소프트웨어입니다. 커널이 이러한 프로세스마다 얼마만큼의 자원을 사용해야 하는지 결정해야하는데 이것을 스케줄링이라고 합니다.

유저모드 vs 커널모드

유저모드와 커널모드의 가장 큰 차이점은 접근 가능한 가상메모리의 범위이다.

각 프로세스들은 고유한 개별 메모리 공간을 가지지만 커널모드 운영채제와 디바이스 드라이버 코드는 단일 가상주소 공간을 공유한다. 가상 메모리 내의 각 페이지에는 페이지를 읽고 쓰기 위해 프로세서가 가져야하는 접근 모드가 무엇인지 표시가 되어있으며, 시스템 공간의 페이지는 커널모드에서만 접근 가능하다.

커널모드는 커널에 권한이 있는 프로그램 모드이다. 모든 시스템 메모리와 모든 CPU 인스트럭션에 접근이 허가된 프로세스 실행모드를 말한다. 즉 프로세서는 유저 모드보다 커널모드에 높은 권한을 줌으로써 오작동을 유발하는 유저 어플리케이션 등이 시스템 전체에 안정성을 해치지 않게 보장하는 필수 기반을 운녕체제 설계자에게 제공한다.(ex 운영체제 코드 - 시스템 서비스, 디바이스 드라이버)

유저모드는 커널보다 권한이 낮음, 오작동으로 인한 시스템에 안전성을 해치지 않음. (ex 어플리케이션)

유저모드

  • 사용자 애플리케이션의 코드가 실행 됨.
  • 시스템 데이터에 제한된 접근만이 허용, 하드웨어 직접 접근 불가.
  • 시스템 서비스 호출 시 유저모드에서 커널모드로 잠시 전환됨.
  • CPU 유저 모드 특권 수준으로 코드를 실행 한다.
  • 유저모드 에서 실행하는 스레드는 자신만의 유저모드 스택을 가진다.

커널모드

  • 시스템의 모든 메모리에 접근 할 수있고 모든 CPU 명령을 실행 할 수 있다.
  • 운영체제 코드나 디바이스 드라이버 같은 커널 모드 코드를 실행 한다.
  • CPU는 커널 모드 특권 수준에서 코드를 실행 한다.

Kernel / User Level Thread

사용자 레벨 스레드는 말그대로 우리가 #include <thread> 혹은 import를 통해 스레드를 이용하는 것을 의미한다.

image

커널 레벨 스레드는 커널 내에 있는 스레드를 의미하게 되고 위와같이 3가지 방법으로 나뉜다.

1. Pure user-level

커널 스레드 1개당 사용자 스레드 n개를 의미한다. 즉, 1 : n 방식이다.

이 방식같은 경우에는 커널은 사용자 스레드가 100개가 있어도 전혀 모르기 때문에 사용자 스레드에서 I/O가 하나라도 발생하면 해당 프로세스는 I/O가 풀릴 때 까지 영원히 block된다.

2. Pure Kernel-level

n개의 커널 스레드가 n개의 사용자 스레드를 담당하게 된다. 즉 1:1 방식이다.

1:1 방식이기에 병렬성은 좋으나 효율성 면에서 다소 떨어진다.

3. Combined

커널 스레드와 사용자 스레드를 혼합하여 사용하는 방식이다.

위의 두 방식의 장점을 혼합한 방식이라 생각 할 수 있다.

커널 레벨 스레드

  • 커널 스레드는 가장 가벼운 커널 스케쥴링 단위다.
  • 하나의 프로세스는 적어도 하나의 커널 스레드를 가지게 된다.
  • 커널 영역에서 스레드 연산을 수행하게 된다.
  • 커널이 스레드를 관리하기 때문에 커널에 종속적이다.
  • 프로그래머 요청에 따라 스레드를 생성하고 스케줄링하는 주체가 커널이면 커널 레벨(Kernel Level) 스레드라고 한다.

커널 레벨 스레드 장점

  • 프로세스의 스레드들을 몇몇 프로세서에 한꺼번에 디스패치 할 수 있기 때문에 멀티프로세서 환경에서 매우 빠르게 동작한다.
  • 다른 스레드가 입출력 작업이 다 끝날 때까지 다른 스레드를 사용해 다른 작업을 진행할 수 있다.
  • 커널이 각 스레드를 개별적으로 관리할 수 있다.
  • 커널이 직접 스레드를 제공해 주기 때문에 안정성과 다양한 기능이 제공된다.

커널 레벨 스레드 단점

  • 스케줄링과 동기화를 위해 커널을 호출하는데 무겁고 오래걸린다.(저장한 내용을 다시 불러오는 과정이 필요)
  • 즉, 사용자 모드에서 커널 모드로의 전환이 빈번하게 이뤄져 성능 저하가 발생한다.
  • 사용자가 프로그래밍할 때 구현하기 어렵고 자원을 더 많이 소비하는 경향이 있다.

사용자 레벨 스레드

  • 사용자 영역에서 스레드 연산을 수행한다.
  • 사용자 영역에서 스레드 연산을 수행하기 때문에 운영체제에 투명하다.
  • 커널에 의존적이지 않은 형태로 스레드의 기능을 제공하는 라이브러리를 활용하는 방식이 사용자 레벨(User Level) 스레드다.

사용자 레벨 스레드 장점

  • 운영체제에서 스레드를 지원할 필요가 없다.
  • 스케줄링 결정이나 동기화를 위해 커널을 호출하지 않기 때문에 인터럽트가 발생할 때 커널 레벨 스레드보다 오버헤드가 적다.
  • 즉, 위의 말은 사용자 영역 스레드에서 행동을 하기에 OS Scheduler의 context switch가 없다(유저레벨 스레드 스케줄러를 이용).
  • 커널은 사용자 레벨 스레드의 존재조차 모르기 때문에 모드 간의 전환이 없고 성능 이득이 발생한다

사용자 레벨 스레드 단점

  • 시스템 전반에 걸친 스케줄링 우선순위를 지원하지 않는다. (무슨 스레드가 먼저 동작할 지 모른다.)
  • 프로세스에 속한 스레드 중 I/O 작업등에 의해 하나라도 블록이 걸린다면 전체 스레드가 블록된다.

Leave a comment