프로세스보다 작은 개념으로 실행의 가장 작은 단위다.
프로세스 간의 communication은 OS를 거쳐야해서 성능이 좋지 않은데
thread는 OS를 거칠 필요가 없어서 성능이 더 좋다.
하지만 thread들끼리 서로 메모리를 공유하기 때문에 사용 시 주의해야한다.
thread끼리는 서로 메모리를 공유하기 때문에 heap, data, text 영역들을 같이 쓸 수 있는데, 예외적으로 stack 영역은 분리되어 있고 register set도 개별적으로 가지고 있다.
❗️ 왜 process 말고 thread를 쓸까 ..?
프로세스는 생성될 때마다 메모리 copy가 필요한데, thread는 관련 정보 데이터 구조만 추가하면 되기 때문에 메모리 측면이나 속도 측면이나 thread를 병렬화해서 사용하는 것이 훨씬 좋다.
- process : fork() & exec() -> 100 ~ 200µs
- thread : pthread_create() -> 10 ~ 20µs
core의 개수만큼 병렬적으로 작업할 수 있는 thread의 개수도 늘어난다.
(core의 개수에 따라 병렬성이 높아진다.)
Concurrency
: 여러 개의 일들을 처리할 수 있는 능력 (반드시 동시에 할 필요 x)
Parallelism
: 여러 개의 일들을 동시에 처리할 수 있는 능력
concurrent하지만 parallel하지 않을 수도 있음
실제 물리적인 코어보다 코어가 2배 더 많게 보여주는 기술
ILP(Instruction Level Parallelism)을 통해 인스트럭션을 수행할 때 중간에 메모리 액세스 등으로 인해 쉬는 경우가 발생하면 다른 인스트럭션을 수행하도록 하는 방식이다.
원래 하나의 CPU에서 남는 시간을 잘 활용해서 마치 2개의 CPU가 동작하는 것처럼 성능을 낸다.
(실제로 core가 2배가 된 것은 아니기 때문에 성능이 2배까지 올라가지는 x)
실제로는 Data parallelism과 Task parallelism이 hybrid로 쓰임
📢 User thread의 장/단점
- 장점
: 모든 thread 관련 작업들이 system call을 사용하지 않는 단순한 library call이기 때문에 비교적 빠르고 가볍다.- 단점
: kernel이 user thread의 존재를 알 수 없어서 스케쥴링을 다르게 할 수도 없고, 한 프로세스가 block 되어버리면 process 내에 있는 user thread들이 다 같이 멈추게 된다.
📢 Kernel thread의 장/단점
- 장점
: kernel이 thread를 인식할 수 있어서 하나의 thread가 block 되어버리면 다른 thread를 스케쥴링해서 CPU가 쉬지 않을 수 있다.
또한, 프로세스 내의 thread 개수를 바탕으로 스케쥴링 할 수 있다.- 단점
: 생성하는데 비교적 시간이 더 걸리고, user thread의 data structure보다 field가 더 많고 크다.
user thread는 실제 일을 수행하는 thread가 아니다.
application 쪽에서 병렬성의 정도가 어느 정도 되어야 한다는 필요한 병렬성 정도를 자료구조로 만들어 놓은 것이다.
실제로 일을 할 수 있는 것은 kernel thread로 kernel thread 자체가 kernel에 의해 스케쥴링 되어 사용된다.
=> 그래서 user thread를 kernel thread에 mapping 해줘야 kernel thread가 스케쥴링 되면서 user thread가 의도한 일을 진행할 수 있다.
❗️mapping 방법은 어떻게 될까 ??
- user thread 내에 있는 thread의 상태 정보를 kernel thread의 data structure 내부로 옮겨준다.
- kernel thread 안의 pointer가 user thread 구조체를 가리키게 한다.