반응형

User Level Thread VS Kernel Level Thread


이 내용을 보기 전 꼭 명심해야 하는 것이 있다.

우리는 흔히 OS를 공부 할 때 스케줄러가 스케줄링 하는 것을 프로세스라 생각했고 한발 더 나아가면 PCB라 생각했지만, 이제는 스케줄러가 컨텍스트 스위칭 하는 단위는 커널 스레드이고 컨텍스트 스위칭을 당하며 저장되는 정보가 PCB임을 알고 있어야한다.


사용자 레벨 스레드와 커널 레벨 스레드라는 것이 있다.


사용자 레벨 스레드는 우리가 흔히 프로그래밍 과정에서 스레드를 코드에 적는 것이 사용자 레벨 스레드이고 커널 레벨 스레드는 OS가 관리하는 스레드들이다.


실제로 우리가 컨텍스트 스위칭을 한다는 것은 커널 레벨 스레드가 컨텍스트 스위칭 되는 것이고, 커널 레벨 스레드가 프로세스에 2개가 붙는다면 사용자 레벨 스레드에서는 여러개 중 2개의 스레드가 돌 수 있는 것이다.


즉 아래 그림을 통해 알아보자.


프로세스에 현재 스레드 4개를 생성하였다.

이것이 이제 우리가 말하는 유저 레벨 스레드가 된다. 이때 프로세스가 CPU 사용을 위해 OS에게 스레드 2개를 달라고 요청한다.

 

그럼 위와같이 2개의 스레드를 현재 프로세스에서 쓸 수 있도록 할당해준다. 이것이 커널 레벨 스레드이다.




OS의 스케줄러에 의해 현재 프로세스를 보고 있는 커널 레벨 스레드를 CPU에 할당해주면 이제 해당 프로세스를 보고있는 커널 레벨스레드가 동작하기 시작하고 사용자 레벨 스레드에 있는 스레드중 1개가 커널 레벨 스레드와 연결되어 프로세스에서 작업을 진행 할 수 있다.

이때 사용자 레벨 스레드는 스레드 라이브러리의 스케줄러가 관리하고, 우선순위를 두는 방법이 따로 없기에 어느 사용자 레벨 스레드가 우선적으로 커널 스레드와 결합될지는 아무도 모른다.


위의 그림은 커널 레벨 스레드는 그대로 컨텍스트 스위칭을 당하지 않았지만 사용자 레벨 스레드는 컨텍스트 스위칭을 당해 작업하는 스레드가 바뀜을 알 수 있다.

위의 그림은 커널 레벨 스레드가 OS의 스케줄러에 의해 컨텍스트 스위칭을 당하면서 TCB가 저장, 스왑되고 어떤 인터럽트가 들어와서 프로세스 자체가 컨텍스트 스위칭될때 PCB가 저장, 스왑된다.


사용자 스레드 방식이 커널 스레드 방식보다 오버헤드가 적은 이유는 스레드간 전환할 때마다 커널 스케줄러를 호출할 필요가 없기 때문이다.


커널 스케줄러로 진입하려면 프로세서 모드를 사용자 모드에서 커널 모드로 전환해야 하는데, 이때 사용자쪽 하드웨어 레지스터를 전부 저장시키고, 커널 레지스터를 복구하고, 기타 등등의 수많은 작업이 밑에서 일어난다.


따라서 사용자 모드와 커널 모드를 많이 왔다갔다 할 수록 성능은 급격하게 떨어지게 되고 사용자 쓰레드는 쓰레드 스케줄러가 사용자 모드에만 있기 때문에 그런 오버헤드는 발생하지 않는다.




운영체제의 멀티 스레드 모델을 의미한다. 사용자 스레드 갯수와 이에 할당되는 커널 스레드 갯수로 N:1, 1:1, N:M와 같이 분류한다.

☜ N:1(사용자) ☜1:1 (커널)

  1. 사용자 수준 스레드 모델 (N:1)

  • 특징

  • 프로세스 1개(사용자 스레드 N개) 당 커널 스레드 1개가 할당된다.

  • 프로세스 내에 스레드 라이브러리가 있어서 커널의 도움없이 스레드의

스케줄링을 할 수 있다.

  • 커널은 프로세스 내의 스레드의 존재를 모른다.

  • 스레드 정보(TCB, Thead Control Block)는 프로세스 내에서, 프로세스 정보(PCB, Process Control Block)는 커널에서 관리한다.

  • 장점

  • 스레드의 스케줄링 및 동기화에 시스템콜(커널호출)이 필요없기 때문에 오버헤드가 적다.

  • 단점

  • 동작 중인 스레드가 시스템콜을 하면 해당 프로세스 내의 모든 스레드가 멈춘다. (Blocking system call)

  • 프로세스 단위로 CPU가 할당되므로, 다중CPU환경에서 한 프로세스 내 스레드들을 동시에 실행할 수 없다. (Hardware Parallelism 지원안함)

  • 위와 같은 이유로, 다중 처리 시스템에서는 사용할 수 없다.

  • 커널이 스레드를 관리하지 않아, 프로세스에서 스레드 간 보호를 해줘야 한다.


  1. 커널 수준 스레드 모델 (1:1)

  • 특징

  • 프로세스 내의 사용자 스레드 1개 당 커널 스레드 1개가 할당된다. (사용자 스레드를 생성하면 할당할 커널 스레드를 1개 생성한다.)

  • 프로세스 내에 스레드 라이브러리가 없어서 커널 스레드를 스케줄하여 매핑된 사용자 스레드를 동작시킨다.

  • 커널이 전체 TCB와 PCB를 관리한다.

  • 장점

  • 동작 중인 스레드가 시스템콜을 해도 해당 프로세스 내의 다른 스레드가 동작할 수 있다.

  • 스레드 단위로 커널 스레드가 할당되므로, 다중CPU환경에서 한 프로세스 내 스레드들을 동시에 실행할 수 있다. ( = 시스템 동시성 지원)

  • 단점

  • 스레드 문맥교환할 때도 시스템콜이 필요하고 커널이 모든 TCB와 PCB를 관리하여 오버헤드가 크다.

  • CPU, RAM 성능에 따라 생성 가능한 커널 스레드 및 사용자 스레드가 한정되어 있다.


  1. 혼합된 스레드 모델 (N:M)

  • 특징

  • 커널 스레드 마다 1개씩 경량 프로세스(LWP, Light Weight Process)가 매핑되어 있다. LWP는 가상 처리기로써, 1:1 모델처럼 한 프로세스에 여러 개가 할당될 수 있고, 프로세스에 할당된 LWP는 N:1 모델처럼 여러 개의 사용자 스레드를 관리한다. (커널과 프로세스 간의 중간자 역할을 한다.)

따라서 프로세스 1개(사용자 스레드 N개)에 M 개의 커널 스레드를 할당할 수 있다. (N ≥ M)

※ 아래 4가지 특징들은 확실하지 않음….

  • 사용자 스레드가 아닌 LWP를 직접 사용할 수도 있다.

  • 사용자 스레드는 Time slice 마다 다른 LWP가 할당될 수 있다.

  • 커널의 Scheduler Activation은 프로세스 성능을 보장하기 위해 커널 스레드 수를 동적으로 조절한다.

  • 커널에서 스케줄링 및 (Un)Blocking Event를 Upcall(프로세스 호출/알림 cf. syscall)하면 LWP의 Upcall Processor가 받고 LWP가 사용자 스레드를 스케줄하게 된다.

  • 장점

  • 사용자 스레드 생성 개수가 제한되지 않는다. (N:1)

  • 시스템콜을 해도 해당 프로세스 내 (다른 LWP에 연결된) 스레드는 멈추지 않는다. (1:1)

  • 단점

  • LWP가 블록되면 LWP에 연결된 모든 사용자 스레드가 멈춘다. (N:1)

  • LWP의 사용자 스레드 문맥교환도 1:1 모델만큼 오버헤드가 크다. (1:1)

  • 각 LWP에 한 개의 사용자 스레드가 실행되지 않으면, 1:1 모델에 비해 다중CPU환경에서 효율적이지 않다. (N:1)

※ 괄호 안은 해당 장단점의 원인이 되는 모델


※ 참고 #wiki_멀티스레딩 #ppt_process&thread_38p-43p # kldp_ult/klt #blog_kldp정리

# blog_개념_및_활용사례




디스크 입력은 커널레벨스레드, 유저레벨 스레드 중 어느게 더 유리한가?



(1,2 모두 동치입니다.)


1. 디스크 입출력을 하면 시스템콜을 해야 하기 때문에, 프로세스 작업 효율면에서 커널 레벨 스레드가 더 유리하다.

User-level Thread 모델에서는 스레드가 디스크 입출력을 할 때마다 해당 프로세스 내의 모든 스레드가 중단된다.

반면에, Kernel-level Thread 모델은 커널 스레드가 사용자 스레드에 1:1로 할당되므로 한 스레드에서 시스템콜을 해도 해당 프로세스의 다른 스레드가 중단되지 않는다.

※ 시스템콜 → 스레드 블록 및 커널모드로 전환


2. 우선 유저 레벨 스레드와 커널 레벨 스레드의 차이를 알아야 한다.
유저 레벨 스레드를 이용하면 컨텍스트 스위칭을 프로세스 내부에서 진행하면 되고, 커널로 진입하지 않아도 되어 비용이 적게 든다.
즉, 스레드의 스케줄링 및 동기화에 시스템콜(커널호출)이 필요 없기 때문에 오버헤드가 적다.
그리고 커널 레벨 스레드는 커널이 직접 스레드를 관리해주는 것이기 때문에 유저 스레드 1개당 커널 1개가 맡아준다. 따라서 하나의 프로세스에 여러 유저 스레드가 있어도 동시에 실행이 가능하다.
하지만 여기서 유저 레벨 스레드에 I/O를 이용하면 치명적인 단점이 존재한다.
유저 레벨 스레드를 이용하면 커널은 프로세스 내의 스레드 존재를 모르기 때문에 하나의 유저 레벨 스레드가 I/O를 하면 나머지 모든 스레드가 멈추게 된다.

따라서 I/O를 하기 위해서라면 커널 레벨 스레드를 이용하는게 더 유리하다.











반응형