# 💡 Thread란?
### ✅ 정의
- **process 내에서 실행되는 여러 흐름의 단위**
- CPU 수행의 기본 단위
- **스케쥴링의 대상**이라는 말 (그 중에서 kernel thread가 scheduling 대상)
### ✅ 특징

- process의 **address space를 공유**한다
- **Code**, **Data**, **Heap** 영역 공유
- 각 thread는 **개인 stack 영역을 보유**
- 다른 thread의 stack 영역 볼 수 있음
- 각 thread는 **개인 register set 보유**
- PC (Program Counter) : 다음에 실행할 instruction의 주소 값
- SP (Stack Pointer) : 현재 stack영역의 최상단 가리킴
----
# 💡 Process란?
### ✅ 정의
- **메모리에 올라와 실행되고 있는 프로그램의 인스턴스**(독립적인 개체)
- **thread의 container라고 볼 수 있음**
### ✅ 특징

- process는 **1개 이상의 thread를 갖는다**
- process는 각자 **독립된 address space**를 갖는다
- Code, Data, Heap, Stack으로 구성되어 있음
- OS가 각 프로세스에게 **가상화한 address space(virtual address space)**를 준다
- **다른 프로세스의 주소 공간에 접근 못함**
- _IPC(pipe, socket 등)을 활용하면 가능하긴 함_
---
# 💡 Process와 Thread의 차이
### 1. 오류 발생 시, 영향력 차이
- **process**는 오류가 발생해 강제 종료되어도, **기본적으로 다른 프로세스와 데이터를 공유하지 않기에 영향을 주지 않음**
- **thread**는 Code, Data, Heap **메모리 영역을 공유**하기에 특정 thread에서 오류 발생하면 같은 프로세스 내의 다른 thread가 모두 종료될 수 있음
### 2. resource 차이
-** process**는 각각 **독립된 address space**를 갖는다
- **thread**는 같은 process 안에서는 **code/data/heap 영역 공유**하지만, stack과 register set은 독립적으로 보유
### 3. 통신 차이
- **process**는 shared memory, pipe, socket 등 **IPC 활용해 통신** → 상대적으로 overhead가 크다
- **thread**는 같은 address space를 공유해서 데이터 공유 및 통신이 더 쉽다 → 대신에 race condition과 같은 **synchronize 문제 발생할 수 있음**
### 4. context switching 비용 차이
- process는 PCB를 교환하는데 비용 많이 발생하고 시간도 오래 걸림
- thread는 stack을 제외한 다른 영역은 공유하기에 context switching 비용이 비교적 적다