본문 바로가기
CS/운영체제

12. 커널 레벨 스레드와 사용자 레벨 스레드

by D.O.T 2024. 4. 22.
스레드의 레벨?

 

스레드는 스케줄링 주체에 따라 두 종류의 스레드로 구분된다.

1. 커널 레벨 스레드 (Kernal-Level Thread) : 커널에 의해 스케줄링 된다.

2. 사용자 레벨 스레드 (User-Level Thread) : 스레드 라이브러리에 의해 스케줄링 된다.

TCB를 소유하고 있는 주체에 따라 두 종류의 스레드로 구분되는데 자세히 알아보도록 하겠다.

 

커널 레벨 스레드

 

커널 레벨 스레드는 시스템 호출을 통해서만 생성된다. 즉, 커널에 의해서만 스케줄링 되는 것이다.

하지만, 커널 코드와 달리 커널 레벨 스레드의 코드나 데이터가 커널 공간뿐 아니라 사용자 공간에도 있을 수 있다.

이게 무슨말인지 정말 헷갈렸다. thread_create() 뿐만 아니라 ktread_create()라는 스레드 함수도 존재한다. ktread_create() 함수로 커널 스레드를 생성할 수 있는데 생성된 커널 스레드는 커널 공간에서 TCB를 관리하게 된다. 하지만 이 코드를 작성한 것은 사용자 공간에 있기 때문에 위와 같은 말이 나왔다.

 

응용프로그램을 적재해 프로세스를 생성할 때, 자동으로 커널이 main 스레드를 생성한다. 그래서 main Thread도 커널에서 TCB를 관리하기 때문에 커널 스레드다.

 

그 외에도 순수 커널 레벨 스레드(pure kernel level thread)가 존재한다. 부팅할 때, 커널 공간에서 실행되도록 작성된 스레드인데, 대부분 OS는 다수의 순수 커널 레벨 스레드를 생성해서 실행하고 있다고 한다.

 

사용자 레벨 스레드

 

스레드 라이브러리 함수를 호출해서 생성되는 스레드이다.

스레드 정보를 사용자 공간에 생성하고 소유하는데 pthread_create()로 생성된 스레드를 의미한다.

커널 스레드는 커널에 의해 스케줄링 되었다면 사용자 레벨 스레드는 스레드 라이브러리에 의해 스케줄된다.

 

즉, 커널 스레드는 다양한 커널 레벨 스레드가 동시에 실행되고 있으므로 컨텍스트 스위칭이 자주 발생하게 될 것이고 속도가 느리다는 단점이 있고 사용자 레벨 스레드는 현재 실행중인 프로세스에 대해서만 컨텍스트 스위칭이 발생하게 되므로 속도가 커널 스레드보다 100배 빠르다고 한다.

 

프로세스 기반 스레드
멀티코어 기 스레드

 

정리

 

하나의 코어에 집중된 일을 하고 싶다면 concurrency를 띠는 사용자 레벨 스레드를 사용하자. 속도가 매우 빠르다. 단점으로 하나의 사용자 레벨 스레드가 Block되면 해당 프로세스의 모든 사용자 레벨 스레드가 Block과 같은 상태가 된다.

멀티 코어에 일을 분산해서 parallelism을 띠는 작업을 하고 싶다면 커널 레벨 스레드를 사용하자. 속도는 느리지만 다수의 일을 한 번에 처리하면서 상황에 따라 더 높은 속도 효율이 나온다.

 

위 정리는 개발을 할 때, 생각한 부분이다.

이 포스트는 OS에 대한 내용이기 때문에 오늘날의 OS에서는 H/W 입,출력 뿐만 아니라 다양한 처리 등을 위해 커널 레벨 스레드를 많이 사용하고 있다. 물론 사용자 레벨 스레드도 병합해서 사용하고 있다.

'CS > 운영체제' 카테고리의 다른 글

14. CPU Scheduling  (0) 2024.04.22
13. 멀티스레드 구현  (0) 2024.04.22
11. 스레드 주소 공간과 컨텍스트  (0) 2024.04.22
10. 스레드 (Thread)  (0) 2024.04.21
9. 프로세스 계층 구조  (1) 2024.04.21