본문 바로가기
컴퓨터 COMPUTER/Linux 리눅스

11. [Multithreading(2)] : Thread 의 적용, User-level Threading 과 Kernel-level Threading

by 매실이 maesiri 2019. 2. 6.

Thread 를 적용하는 방법에는 두가지가 있다. OS 즉 커널 레벨 쓰레드가 쓰레드를 관리하는 것과 user 레벨(프로세스 내)에서 쓰레드를 관리하는 방법이다. user 레벨에서도 쓰레드의 적용이 가능한 이유는, 한 프로세스 내의 쓰레드들은 같은 메모리 공간을 공유하며, 오직 SP, PC, 레지스터와 같은 부분만 차이나기 때문이다.

User-level Threading

: 커널은 쓰레드의 존재를 알지 못한다. 프로세스 내의 Thread library 가 쓰레드에 관한 매니징을 모두 담당한다. 쓰레드의 관리에 있어서 커널이 아예 관여하지 않기 때문에 모드 스위칭이 적게 일어나 굉장히 가볍게 쓰레딩을 할 수 있다. 하지만 이러한 경우, 하나의 쓰레드만 작동을 멈춰도 그 프로세스 자체가 block 되며, 멀티 프로세서를 전혀 활용하지 못한다는 점에서 별로 이점이 없는 방식이다.

아래 그림과 같이, 쓰레드는 하나의 프로세스 (원) 내에서 관리/이용되며, 각 프로세스마다 쓰레드를 관리하는 테이블과 작은 커널의 역할을 하는 Run-time System 이 있다. 이 작은 커널 안에 Thread table 이 있어서 프로세스 내에서 쓰레드가 스케줄링 된다. Kernel은 그저 프로세스의 순서만 스케줄링 해주면 된다.

유저레벨 스레딩을 할 경우, 하나의 커널 쓰레드(프로세스)가 여러개의 유저레벨 쓰레드를 관리한다는 점에서 "many-to-one" 모델이라고 불린다.


Kernel-level Threading

: 커널이 모든 프로세스와 모든 쓰레드의 관리를 하는 방식이다. 모든 프로세스와 쓰레드들은 커널에 의해 독자적으로 스케줄링 된다. 아래 그림을 참고하여 보면, User-level일 때와 다르게 Thread table 이 커널에 합쳐져서 한 개만 존재하는 것을 볼 수 있다.



이 모델을 사용한다면 만약 컴퓨터가 듀얼코어일 때, 각 프로세서에서 한 프로세스의 다른 두 개의 쓰레드를 수행할 수 있다. 여러 개의 커널 쓰레드가 각각 한 개의 쓰레드를 관리하거나, 혹은 여러 개의 커널 쓰레드가 여러 개의 쓰레드를 관리할 수 있다는 점에서 one-to-one, many-to-many 모델을 가질 수 있다.

one-to-one 모델의 경우, 2개 이상의 프로세서에서 여러 개의 쓰레드가 동시에 돌아갈 수 있다. 또한 하나의 프로세서만 가진 하드웨어에서 하나의 쓰레드가 어떤 이유로 block 이 되면 다른 쓰레드를 돌리도록 할 수 있다. 하지만 쓰레드를 생성할 때마다 커널쓰레드도 생성되어야 하므로 오버헤드가 크다. 유닉스, 리눅스 등이 이러한 모델을 사용하고 있다.

many-to-many 모델의 경우, 여러 개의 커널 쓰레드가 랜덤하게 여러 유저 쓰레드를 관리할 수 있는 모델이다. 보통 many-to-many 와 one-to-one 을 섞은 모델을 사용하여 필요에 따라 유연하게 행동한다.



① User-level Multithreading

② One-to-One Kernel-level Multithreading

③ combined

분홍색 상자는 Thread library, 노란 원은 Kernel Thread, 맨 밑의 P 가 각 프로세스를 의미하는 그림이다. 참고하도록 하자.


개인 공부 정리용으로 작성한 글입니다. 틀린 부분이 있을 수 있으니 참고용으로만 사용해주세요. 틀린 부분은 댓글로 알려주세요.♥


반응형

댓글