Thread
- 단일 실행 Process에 대한 추상화
- Program을 여러 수행 단위로 나누어서 실행 가능할 때, 하나의 수행 단위를 Thread라고 한다.
Example

Multi-Threaded Process
- Thread는 일종의 경량 Process이다.
⠀⠀
- Process는 두 개 이상의 Thread를 갖는다.
- Thread가 하나라면 Single-Threaded Process이다.
- Context Switching Unit은 Thread이다.
- 각 Thread마다 실행 상태가 존재한다. (PC, Register, Stack)
⠀⠀
- 실행 Thread 변환 시 (T1 → T2)
- T1의 실행 상태는 TCB에 복사된다.
- T2의 실행 상태를 TCB에서 불러온다.
- TCB = Thread Control Block
- Address Space는 동일하게 유지된다.
Address Space of Multi-Threaded Process
- Process의 모든 Thread는 주소 공간을 공유한다.
- 각 Thread마다 자신의 Stack이 존재한다.

- Process 생성 (Single-Threaded Process)
→ Child Process는 Parent Process의 모든 Address Space를 복사한다.
⠀⠀
- Thread 생성 (Multi-Threaded Process)
→ Program Code, Heap은 공유하고 Stack만 새로 할당한다.
PCB VS TCB

Why Use Multi-Threaded Process
- 뛰어난 성능
- Process는 여러 개의 CPU를 통해 실행될 수 있다.
- I/O와 계산 작업은 동시에 수행될 수 있다.

- Parallelism → 동시에 하나의 Process 내의 여러 Thread를 수행
- Overlap → I/O나 계산 작업을 하여 CPU를 사용하지 않을 때 다른 Thread를 수행
Problem 1
- 실행 순서는 OS Scheduler에 의해 비결정적으로 결정된다.
- 어느 순간에 어떤 Thread가 실행될 지 알기 어렵다.
- Debug하기 힘들다.

Problem 2
- 여러 Thread가 공유 데이터를 동시에 최신화 하는 경우
- 비결정적 실행 순서로 인해 결과를 예측할 수 없다.

- 여러 Thread가 Critical Section에 들어가 공유 데이터를 최신화 한다.
- 두 Thread(T1, T2)와 하나의 전역 변수 (counter 0x8049a1c)
- 두 Thread는 동일한 코드를 실행한다.


- 실행할 때마다 달라지는 불확실한 결과
- 두 개의 Thread를 실행한 후 Counter의 값은 "+2"로 예상된다.
Critical Section
- 두 개 이상의 Thread에 의해 수행되어서는 안되는 코드 영역
- Critical Section을 실행하는 여러 Thread로 인해 문제가 발생할 수 있다.
- Critical Section에 대한 Atomicity를 지원해야 한다.
- Atomicity는 어떤 작업이나 연산이 더 이상 나눌 수 없는 단위로 수행된다는 것을 의미한다.
Solution: Super Instruction
- Hardware는 명령어가 분리되지 않고 실행되게끔 해야한다.

- 좌측의 세 가지 명령을 XADD 명령어 (Super Instruction) 하나로 수행 → 중단되지 않고 진행