Written by coh at home
OS. Thread. 본문
개요
process의 context switching의 overhead를 줄이기 위해 thread란 개념이 사용됩니다.
process의 정의 중 하나는 resource를 할당받고 이를 제어하는 것입니다.
이 때 제어를 담당하는 것이 thread입니다. thread는 실이란 의미이며 앞으로 실처럼 표현하게 됩니다.
thread는 제어를 위한 제어정보(SP, PC, thread ID), local data를 저장할 stack 으로 구성된다고 볼 수 있습니다.
하나의 process에는 여러 개의 thread가 존재할 수 있습니다. 이 때 같은 process의 thread들은 동일한 프로세스의 메모리 공간을 구성하게 됩니다. 즉, 자원(heap, data, code)를 공유하며 제어를 하게 됩니다.
스레드는 Light Weight process라고 불리기도 하며 프로세서 활용의 기본 단위입니다.
제어 요소 모든 자원들은 모든 thread가 공유를 합니다.
thread의 장점
1.사용자 응답성.
-일부 스레드가 지연 되어도 다른 스레드는 작업을 지속.
게임을 할 때 화면출력, 마우스입력, 소리/마이크 입출력 세 가지 IO를 처리하는 상황을 가정하면
process로 이를 처리하게 되면 하나를 처리하는 동안 나머지 둘은 asleep상태로 가게 됩니다.
근데 process는 하나이고 세 가지 I/O를 동시에 처리해야 하는데 스레드가 하나면.. 게임을 할 수 없겠죠.
따라서 자원(게임)을 공유하는 멀티스레드를 활용하게 되며 하나가 지연되어도 나머지는 동작하는 사용자 응답성을 높이게 됩니다.
2.자원 공유
-자원을 공유해서 효율성이 증가.
프로세서 간에는 자원 공유를 못 함. 따라서 context switching 발생.(kernal 개입)
그런데 thread로 자원을 공유하면 cs는 발생하지 않아서 overhead 낮아진다.
3.경제성
context switching에 비해 효율적.
2와 같은 이야기인데, process가 변경되는 context switching은 overhead가 큽니다. 물론 thread 내에서도 context switching이 발생할 수 있지만 thread 단위에서의 overhead는 그 부담이 덜 합니다.
4.multiprocessor 활용
멀티 스레드 = 여러 개의 cpu core를 사용하는 것과 같아서 병렬 처리가 가능합니다.
사용자 수준 스레드
스레드를 라이브러리 level로 구현함.
라이브러리가 스레드 생성, 스케줄링을 담당.
user가 프로세스하나를 만들면 kernal은 제어를 위해 kernal수준의 thread를 만들게 됩니다.(프로세스 하나니까 갯수도 하나!) user영역에서 lib를 이용해서 여러 개의 thread를 사용하는 것처럼 하는 겁니다. lib level에서 만들었으니 TCB가 user level에서 관리를 하게 됩니다. (1:다 mapping)
장점.
kernal은 thread의 존재를 모르기 때문에 개입이 없습니다. 즉, overhead가 적고 유연한 관리가 가능합니다.
lib만 있는 flatform에 우리가 만든 프로그램을 이식할 수 있습니다.
단점.
user thread 하나가 I/O가 필요해서 block이 되면은 해당 kernal thread가 하나이므로 이 system call을 처리해 주어야해서 해당 process가 asleep상태가 됩니다. 따라서 나머지 user thread가 작업이 가능해도 다 같이 block되는 겁니다.
kernal수준 스레드
kernal이 각 thread를 개별적으로 관리 (1:1 mapping). kernal의 개입이 늘어나며 따라서 overhead가 크게 됩니다. .
process의 CS보단 작지만 그래도 kernal level이니까 어느 정도 크다고 봐야합니다.
근데 kernal수준에서 하나의 스레드가 block되어도 나머지 thread는 1:1 mapping이 되어있기 때문에 지속적인 작업이 가능하게 됩니다. 즉, process의 CS가 일어나지 않습니다.
각각의 장점을 잘 섞으면 좋겠네? 따라서 n:m model이 등장하게 됩니다.
n개의 사용자 수준 스레드와 m개의 커널 스레드를 사용하게 됩니다.
kernal 스레드는 자신에게 할당된 하나의 사용자 스레드가 block이 되어도 다른 스레드 수행이 가능하게 됩니다.
효율적이고 유연한 구조가 됩니다.
thread는 자원은 공유하지만 각각의 자신만의 제어 요소를 갖는 것이고 여기서 스레드의 구현에 대해 알아보았습니다.
'CS > OS' 카테고리의 다른 글
OS supported SW solution -Semaphore (0) | 2022.04.07 |
---|---|
Process Syncronization & Mutual Exclusive.2.TAS, spinlock (0) | 2022.04.06 |
Process Syncronization & Mutual Exclusive (0) | 2022.04.05 |
메모리/프로세스 질문 (0) | 2022.04.01 |