임베디드 스터디 - 프로세스 vs 스레드, 컨텍스트 스위칭, 멀티스레딩 모델
임베디드 스터디 - 프로세스 vs 스레드, 컨텍스트 스위칭, 멀티스레딩 모델
프로세스 vs 스레드
- 프로세스 : 실행 중인 프로그램 — OS로부터 독립적인 메모리 자원을 할당받은 단위
- 스레드 : 프로세스 안에서 실제 실행을 담당하는 단위 — 같은 프로세스의 메모리를 공유함
1
2
3
4
5
프로세스 (크롬)
├── 메모리 공간 (코드·데이터·힙) ← 스레드들이 공유
├── 스레드 1 : 탭 렌더링 (스택은 각자 독립)
├── 스레드 2 : 네트워크 요청
└── 스레드 3 : UI 업데이트
PCB (Process Control Block)
- OS가 프로세스를 관리하기 위해 각 프로세스의 정보를 저장하는 자료구조
1
2
3
4
5
6
7
8
PCB
├── 프로세스 ID (PID)
├── 프로세스 상태 (Ready/Running/Waiting 등)
├── PC (Program Counter) ← 마지막으로 수행하던 명령어 위치
├── CPU 레지스터 값 ← 중단 시점의 연산 상태
├── 메모리 관리 정보 ← 가상 주소 공간 매핑
├── 스케줄링 정보 ← 우선순위 등
└── I/O 상태 정보
컨텍스트 스위칭 (Context Switching)
- CPU가 프로세스 A에서 B로 전환할 때의 과정
1
2
3
① A의 PCB에 현재 상태 저장
② B의 PCB에서 이전 상태 복원
③ B 실행 재개
- 컨텍스트 스위칭 자체는 오버헤드 — 이 시간 동안 CPU는 실제 유용한 작업을 못 함
- 스위칭이 너무 자주 일어나면 오버헤드 비용 증가로 전체 성능 저하
프로세스 vs 스레드 전환 비용
| 구분 | 전환 시 교체 범위 | 비용 |
|---|---|---|
| 프로세스 | 가상 주소 공간·캐시 전체 교체 | 많이 듦 |
| 스레드 | 스택·레지스터만 교체 | 적게 듦 |
멀티스레딩 모델
- 유저 레벨 스레드와 커널 레벨 스레드를 어떻게 매핑하느냐에 따라 3가지 모델로 구분
- 유저 레벨 스레드 : 애플리케이션이 관리하는 논리적 단위
- 커널 레벨 스레드 : OS가 직접 관리, CPU에 실제로 할당되는 단위
N:1 모델
1
2
3
유저 스레드 1 ─┐
유저 스레드 2 ─┤→ 커널 스레드 1 → CPU
유저 스레드 3 ─┘
- 장점 : 구현 단순
- 단점 : 유저 스레드 하나가 블로킹 시스템 콜 호출 → 스레드 전체가 멈춤
- 단점 : 커널 스레드가 하나이므로 멀티코어 CPU 활용 불가
1:1 모델
1
2
3
유저 스레드 1 → 커널 스레드 1 → CPU 코어 1
유저 스레드 2 → 커널 스레드 2 → CPU 코어 2
유저 스레드 3 → 커널 스레드 3 → CPU 코어 3
- 장점 : 블로킹 시 다른 스레드 영향 없음, 멀티코어 CPU 활용 가능
- 단점 : 유저 스레드 수만큼 커널 스레드 생성 → 스레드가 많아지면 생성 비용 증가
- 예시 : Linux pthread, Java 기본 스레드
M:N 모델
1
2
3
4
유저 스레드 1 ─┐
유저 스레드 2 ─┤→ 커널 스레드 1 → CPU 코어 1
유저 스레드 3 ─┤→ 커널 스레드 2 → CPU 코어 2
유저 스레드 4 ─┘
- M개의 유저 스레드를 N개(M>N)의 커널 스레드에 동적으로 매핑
- 장점 : 1:1보다 커널 스레드 수 적음, 멀티코어 활용 가능
- 단점 : 구현 복잡도 높음
비교 요약
| 모델 | 매핑 | 블로킹 문제 | 멀티코어 | 구현 복잡도 |
|---|---|---|---|---|
| N:1 | 多유저 → 1커널 | 스레드 전체 멈춤 | ❌ | 낮음 |
| 1:1 | 1유저 → 1커널 | 영향 없음 | ✅ | 중간 |
| M:N | 多유저 → 少커널 | 영향 없음 | ✅ | 높음 |
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.