[OS] User Level Thread, Kernel Level Thread

hyng·2022년 4월 7일
0

os

목록 보기
5/5

User Level Thread

  • 커널이 생성해 주는 게 아닌 라이브러리를 이용해서 생성한 스레드이다.
  • 커널에는 '커널 모드'와 '사용자 모드' 두 가지가 있고, '사용자 모드'에서 동작하는 스레드가 User Level Thread이다.
  • 입출력 인터럽트가 발생하면 커널은 '사용자 모드'가 되어 User Level Thread의 응답을 기다린다.
  • 그리고 User Level Thread에서 응답이 오면 다시 '커널 모드'로 변환되어 Kernel Level Thread가 일을 처리하게 되는 것이다.
  • User Level Thread는 커널에 의해 생성된 것이 아니기 때문에 당연히 OS는 해당 스레드에 대해 알지 못한다.
  • OS가 관리하는 스레드가 아니기 때문에 Context Switch로 인한 커널 모드 <-> 유저 모드 전환이 발생하지 않아, Kernel Level Thread보다 Context Switch에 걸리는 시간이 짧다.
  • 커널의 개입 없이 스레드 생성, 스레드 교체, 스레드 동기화 등을 할 수 있기 때문에 관리가 쉽고 더 빠르다.
  • 현재 실행 중인 프로세스에 여러 User Level Thread가 생성된 상태에서 실행 중이던 스레드 A가 IO 요청으로 blocking 되면 현재 프로세스의 다른 스레드로 CPU가 넘어가는 게 아니라 아예 다른 프로세스로 스케줄링 된다.
  • thread를 지원하지 않는 OS를 사용하더라도 라이브러리를 이용해서 스레드를 생성할 수 있다.
  • 각각의 스레드는 PC, 레지스터, Control Block을 가지고 user process address space에 저장된다.
  • User Level Thread를 사용할 경우 하나의 Kernel Level Thread에서 여러 개의 User Level Thread를 관리한다는 점에서 "Many-To-One"모델이라고 불린다.
    • Kernel Level Thread가 하나이기 때문에 Many-To-One 모델은 동시에 오직 하나의 스레드만 커널에 접근할 수 있다.
    • 그래서 Many-To-One 모델은 제한된 concurrency를 제공한다.
    • User Level Thread가 blocking 상태가 되면 프로세스가 blocking된다.

  • 출처

    각각의 프로세스에는 적어도 하나의 Kernel Level Thread가 존재한다. 만약 프로세스에 여러개의 Kernel Level Thread가 존재한다면, 스레드는 동일한 메모리와 파일 리소스를 공유한다.
    따라서 입출력이 필요없는 스레드는 하나 이상 스레드를 가지고, 사용자 입출력이 필요한 프로세스는 두개(kernel Level Thread 1 + User Level Thread 1) 이상의 스레드를 가지게 된다.
    https://en.wikipedia.org/wiki/Thread_(computing)

Kernel Level Thread

  • 커널에 의해 생성되고 관리되는 스레드이다.
  • OS에 의해 관리되기 때문에 Context Switch 시, 커널 모드 <-> 유저 모드 전환으로 인해 User Level Thread에 비해 시간이 오래 걸린다.
  • 커널이 프로세스 내에 모든 스레드에 대해 다 알고 있기 때문에 스케줄러는 적은 개수의 스레드를 가진 프로세스보다 더 많은 개수의 스레드를 가진 프로세스에 더 많은 시간을 분배할 수 있다.
  • Kernel Level Thread는 blocking이 빈번한 애플리케이션에서 사용하면 좋다.
  • 커널에서 모든 프로세스뿐만 아니라 스레드까지 생성 관리하기 때문에 커널의 복잡도가 높아지고 그로 인한 오버헤드가 발생한다.
  • One-To-One 모델, Many-To-Many 모델이 존재한다.
  • One-To-One모델

    출처
    • 하나의 Kernel Level Thread에 하나의 User Level Thread 형식이다.
    • 따라서 동시에 모든 스레드가 커널에 접근할 수 있다.
    • 하나의 Kernel Level Thread에 하나의 User Level Thread가 대응되기 때문에 Kernel Level Thread가 과도하게 생성되면 시스템에 부담을 줄 수 있어 Kernel Level Thread 수가 정해져 있다.
    • 각각의 User Level Thread가 다른 Kernel Level Thread에 연결되어 있기 때문에 어떤 하나의 User Level Thread가 blocking 상태가 되더라도 다른 User Level Thread는 blocking 되지 않는다.
  • Many-To-Many모델

    출처
    • User Level Thread에 같거나 더 적은 수의 Kernel Level Thread가 매핑된다.
    • 필요한 만큼 User Level Thread를 생성할 수 있고 Kernel Level Thread가 멀티프로세서상에서 병렬로 실행될 수 있어 One-To-One 모델과 Many-To-Many의 문제점을 보완한다.
    • 하나의 User Level Thread가 blocking 상태가 되더라도 다른 Kernel Level Thread로 다른 User Level Thread를 스케줄링 할 수 있다.
    • 보통 One-To-One 모델과 Many-To-Many 모델을 혼합한 방식을 사용하여 필요에 따라 유연하게 행동한다.

      출처

참고

https://docs.oracle.com/cd/E19620-01/805-4031/6j3qv1oej/index.html
https://www.tutorialspoint.com/multi-threading-models
https://www.geeksforgeeks.org/multi-threading-models-in-process-management/
https://helloinyong.tistory.com/293
https://happy-chipmunk.tistory.com/entry/11-Multithreading2-Thread-%EC%9D%98-%EC%A0%81%EC%9A%A9-Userlevel-Threading-%EA%B3%BC-Kernellevel-Threading
https://www.geeksforgeeks.org/difference-between-user-level-thread-and-kernel-level-thread/
http://www.cs.iit.edu/~cs561/cs450/ChilkuriDineshThreads/dinesh's%20files/User%20and%20Kernel%20Level%20Threads.html

profile
공부하고 알게 된 내용을 기록하는 블로그

0개의 댓글