1개의 실행 흐름을 여러개로 만든다면??
Process를 생성하는 것 보다, Thread를 생성하는 것이 더 적은 비용..(IPC, Context Switching)

Thread의 수가 증가할수록 CPU의 Utilization이 증가
임계값을 넘어가면 다시 감소 -> Thread Switching 비용이 증가함.
CPU가 많은 System일 수록 Thread를 이용하는 것이 유리
Multi-processor, 즉 CPU의 수가 많을 수록 한 Process에서 여러 Thread를 Parallel하게 실행하는 것이 유리.
Single Thread process와 동일
Process 간의 Memory는 독립적이므로, 서로의 영역에 접근하기 어려움
IPC나 Shared Memory를 사용한다.
Process간의 Switching 비용이 큼 (상대적으로 Heavy Weight)
하나의 Process 안에 여러개의 Thread가 존재
(Multi Thread process와 동일)
Process의 Code 영역과 Data 영역은 Thread간에 공유
Thread들은 같은 Memory 영역을 사용하므로, Thread간 Switching 비용이 적음
Thread ID : Thread 식별자
Program Counter : 현재 실행중인 Instruction 주소
Register Set : CPU의 Register 값들
Stack : Process보다 Thread의 고유 정보 수가 적기 때문에 Thread Switching 비용이 적음

각 Thread 간에는 code, data, files 부분은 공유하고,
각 Thread는 registers와 stack을 가지고 있음을 알 수 있다.

Multi-Process 환경에 비해서, Multi-Thread가 메모리 관점에서 더 이득임을 알 수 있다.
Kernel 영역 위에서 지원되며, 일반적으로 User Level의 Library를 통해 구현됨
Library에서 Thread를 생성, Scheduling과 관련된 관리를 해줌
장점
동일한 Memory영역에서 Thread가 생성, 관리되므로 이에 대한 속도가 빠르다.
단점
여러 개의 User Thread 중 하나의 Thread가 System Call 요청으로 Block이 된다면, 나머지 모든 Thread 역시 Block 된다.
-> Kernel은 여러 User Thread들을 하나의 Process로 간주하기 때문
운영체제에서 Thread를 지원
Kernel 영역에서 Thread의 생성, Scheduling 등을 관리
장점
Thread가 System Call을 호출하여 Block이 되면, Kernel은 다른 Thread를 실행함으로써 전체적인 Thread Blocking이 없음
Multiprocessor 환경에서 Kernel이 여러 개의 Thread를 다른 Processor에 할당할 수 있음
단점
User Thread보다 생성 및 관리가 느림
Thread 관리는 User Level에서 이루어짐(=User-level Threading)
여러 개의 User Level Thread들이 하나의 Kernel Thread로 Mapping됨
Kernel Thread를 지원하지 못하는 System에서 사용됨
한계점
한번에 하나의 Thread만 Kernel에 접근 가능
- 하나의 Thread가 Kernel에 접근 (System Call)하면, 나머지 Thread들은 대기해야 함
- 진정한 Concurrency는 지원하지 못함
- 동시에 여러 개의 Thread가 System Call 사용 불가
Kernel의 입장에서 여러 개의 Thread는 하나의 Process이기 때문에 Multiprocessor더라도 여러 개의 Processor에서 동시에 수행 불가능

각각의 User Thread를 kernel Thread로 Mapping
User Thread가 생성되면, 그에 따른 Kernel Thread가 생성
Many-to-One 방법에서 문제가 되었던, System Call 호출 시 다른 Thread들이 Block되는 문제를 해결
여러 개의 Thread를 Multiprocessor에서 동시에 수행할 수 있음
한계점
Kernel Thread도 한정된 자원이기 때문에, 무한정으로 생성할 수 없음
Thread를 생성, 사용하려 할 때 그 개수에 대한 고려가 필요

여러 개의 User Thread를 여러 개의 Kernel Thread로 Mapping
Many-to-One과 One-to-One Model의 문제점을 해결
Kernel Thread는 생성된 User Thread와 같거나, 적은 수 만큼만 생성이 되어 적절히 Scheduling됨
One-to-One처럼 사용할 Thread의 수에 대해 고민할 필요가 없음
Many-to-One처럼 Thread가 System Call을 사용할 경우, 다른 Thread들이 Block되는 현상에 대해 걱정할 필요가 없음.
Kernel은 적절히 User Thread와 Kernel Thread 사이의 Mapping을 조절하여, 위와 같은 장점을 보장할 수 있음

Thread에서 fork() 요청 시,
모든 thread를 가지고 있는 Process를 만들 것인지,
fork()를 요청한 thread만을 복사한 Process를 만들 것인지.
fork()를 하여 모든 Thread를 복사한 경우 exec()을 수행하면 모든 Thread들은 새로운 Program으로 교체가 됨
fork()를 하고 exec()을 수행할 경우 fork()를 요청한 Thread만이 복사되는 것이 더 바람직함
그러나 fork()를 하고 exec()를 수행하지 않는 경우에는 모든 Thread의 복사가 필요하기도 함
Thread Cancellation : Thread의 작업이 끝나기 전에 외부에서 작업을 중지시키는 것
하나의 Thread에서 중지 명령이 결국은 다른 Thread의 모든 작업을 중지시켜야 하는 경우
자원이 Thread에게 할당된 경우 Cancellation의 문제
System의 자원을 사용하고 있는 Thread가 중지 될 경우 할당된 자원을 함부로 해제할 수 없음-다른 Thread가 그 자원을 사용하고 있을지도 모르기 때문
Pool을 만들어 정해진 수 만큼의 Thread를 만든 후 Pool에 할당