본문 바로가기

운영체제

커널 레벨 스레드와 사용자 레벨 스레드의 차이점 이해하기

스레드는 커널 레벨 스레드(Kernel-Level Threads)와 사용자 레벨 스레드(User-Level Threads)로 나뉘며, 이 두 가지 스레드 유형은 운영체제와 응용 프로그램의 스케줄링 방식에 따라 구분됩니다.

 

이번 포스팅에서는 이 두 스레드의 차이점, 각각의 장단점에 대해 알아보겠습니다.

1. 커널 레벨 스레드(Kernel-Level Threads)

개념 및 특징

커널 레벨 스레드는 운영체제의 커널에 의해 관리되고 스케줄링됩니다.

 

커널은 이 스레드들의 상태와 관련된 정보를 TCB(Thread Control Block)라는 구조체에 저장하여 관리합니다.

 

커널은 각 스레드의 작업을 스케줄링하고, 스레드 간의 전환을 담당합니다.

  • 스레드 생성 및 관리: 응용 프로그램이 시스템 호출을 통해 커널 레벨 스레드를 생성하면, 커널이 TCB를 생성하여 해당 스레드를 관리합니다.
  • 스케줄링: 커널이 직접 스케줄링을 담당하며, 멀티코어 CPU 환경에서 높은 병렬성을 제공합니다.
  • 블로킹 처리: 한 스레드가 블로킹될 경우, 다른 스레드들은 영향을 받지 않습니다.

 

장점

  • 병렬성 지원: 멀티코어 CPU에서 높은 병렬성을 제공, 여러 CPU 코어에서 스레드들이 병렬로 실행될 수 있습니다.
  • 블로킹 처리의 유연성: 블로킹된 스레드만 중단되며, 다른 스레드는 계속 실행됩니다.

 

단점

  • 성능 오버헤드: 커널이 직접 스레드를 관리하므로, 컨텍스트 스위칭이나 스레드 생성/소멸 시 성능 오버헤드가 발생합니다.
  • 이식성 문제: 운영체제마다 스레드를 관리하는 방식이 다르기 때문에, 코드 이식성이 낮습니다.

 

2. 사용자 레벨 스레드(User-Level Threads)

개념 및 특징

사용자 레벨 스레드는 스레드 라이브러리에 의해 관리됩니다.

 

이 스레드는 커널이 아닌 사용자 공간에서 스케줄링되며, 커널은 이러한 스레드의 존재를 알지 못합니다.

 

스레드 정보는 U-TCB(User-level Thread Control Block)라는 구조체에 저장되며, 사용자 공간에서 관리됩니다.

  • 스레드 생성 및 관리: 스레드 라이브러리 함수 호출을 통해 스레드가 생성되며, 이 정보는 사용자 공간에 저장됩니다.
  • 스케줄링: 스레드 라이브러리가 직접 스케줄링을 담당하며, 커널의 개입 없이 사용자 모드에서 실행됩니다.
  • 블로킹 처리: 한 스레드가 블로킹되면, 해당 프로세스의 모든 사용자 레벨 스레드가 중단될 수 있습니다.

 

장점

  • 높은 이식성: 운영체제에 관계없이 동일한 코드로 구현 가능하여 이식성이 매우 높습니다.
  • 빠른 컨텍스트 스위칭: 사용자 공간에서 스레드 전환이 이루어지므로, 커널 레벨 스레드에 비해 매우 빠릅니다.
  • 낮은 커널 부담: 스레드 라이브러리가 모든 스레드를 관리하므로, 커널에 추가적인 부담이 없습니다.

 

단점

  • 병렬성 제한: 멀티코어 CPU에서 병렬 처리가 불가능하여, 스레드 간의 진정한 병렬성이 제공되지 않습니다.
  • 블로킹 문제: 하나의 스레드가 블로킹될 경우, 프로세스 전체의 스레드가 중단될 수 있습니다.

 

3. 최근 경향과 결론

최근에는 멀티코어 CPU의 확산으로 인해 커널 레벨 스레드가 더욱 많이 사용되는 추세입니다.

커널 레벨 스레드는 높은 병렬성을 제공하고, 블로킹 문제에서도 유연한 처리가 가능하기 때문에, 멀티코어 환경에서 더 적합한 솔루션이 됩니다.

반면, 사용자 레벨 스레드는 그 이식성 덕분에 여전히 사용되지만, 멀티코어 시대에는 병렬성 측면에서 한계를 가지고 있습니다.

결론적으로, 응용 프로그램이 요구하는 스레드 처리 방식과 시스템 자원 관리에 따라 커널 레벨 스레드와 사용자 레벨 스레드를 적절히 선택하는 것이 중요합니다.

시스템 성능 최적화와 처리량 향상을 위해 이 두 스레드의 특성을 이해하고, 운영체제의 특성에 맞는 적절한 선택이 필요합니다.

 

  사용자 레벨 스레드  커널 레벨 스레드
정의 스레드 라이브러리에 의해 스케줄 되는 스레드 커널에 의해 스케줄되는 스레드
구현 스레드 라이브러리에 의해 구현되고 다루어짐 커널에 의해 구현. 커널 API 혹은 시스템 호출 필요
스레드 스위칭 스레드 라이브러리에 의해 커널에 의해
스레드 스위칭 모드 사용자 모드에서 스레드 라이브러리에 의해 실행 커널 모드에서 커널 코드에 의해 실행
컨텍스트 스위칭 속도 커널 레벨 스레드 보다 100배 이상 빠르다고 알려짐 커널 내에서 상당 시간 소요
멀티스레드 응용 프로그램 스레드 라이브러리를 이용하여 작성하기 쉽고, 스레드 생성 속도 빠름 시스템 호출을 이용하여 스레드 생성. 스레드 생성 속도 느림
이식성(portability) 운영체제 상관없이 작성 가능하므로 높은 이식성. 스레드를 지원하지 않는 운영체제에서도 가능 스레드를 생성하고 다루는 시스템 호출이 운영체제마다 다르므로 이식성 낮음
병렬성(parallelizm) 멀티 - CPU 컴퓨터나 멀티코어 CPU에서 멀티 스레드의 병렬처리 안됨 높은 병렬성. 커널 레벨 스레드들이 서로 다른 CPU나 다른 코어에서 병렬 실행 가능
병렬성의 종류 concurrency parallelism
블록킹(blocking) 하나의 사용자 레벨 스레드가 시스템 호출 도중 입출력 등으로 인해 중단(blocked) 되면 프로세스의 모든 사용자 레벨 스레드가 중단됨 하나의 커널 스레드가 시스템 호출 도중 입출력 등으로 인해 중단(blocked) 되어도 해당 스레드만 중단
커널 부담 없음 커널 코드 실행 시간 증가. 컴퓨터 전체의 부담
스레드 동기화 스레드 라이브러리에 의해 수행 시스템 호출을 통해 커널에 의해 수행
관리의 효율성 커널 부담 없음 커널 부담
최근 경향 멀티코어 CPU에 적합하지 않아 줄고 있는 추세 멀티 코어 CPU에서 높은 병렬성을 얻을 수 있어 많이 사용되는 추세