학습 목표
프로세스와 스레드의 차이를 설명할 수 있다.
스레드가 주소 공간·파일을 공유하고 스택·레지스터만 갖는 이유를 설명할 수 있다.
유저 스레드 vs 커널 스레드 모델의 트레이드오프를 비교할 수 있다.
pthread_create·top의 스레드 수가 의미하는 바를 설명할 수 있다.
문제 상황
- 웹 서버 프로세스 하나인데
top에 스레드가 수십 개- 프로세스를 더 fork할지, 스레드를 쓸지 기준이 없다
- 멀티스레드로 속도는 올랐는데 간헐적 크래시 — 재현이 안 된다
- 공유 변수 경쟁을 의심하지만 스레드 경계가 불명확하다
fork후 멀티스레드 프로그램이 데드락에 걸린다- POSIX에서 fork는 호출 스레드만 복제한다는 규칙을 모른다
- goroutine·async는 스레드인가 아닌가 헷갈린다
- OS 스레드와 런타임 스케줄링 단위가 다르다
프로세스 생성·종료를 봤다. 이번 편은 같은 프로세스 안의 실행 단위 — 스레드다.
1. 프로세스 vs 스레드
프로세스는 자원 할당 단위, 스레드는 CPU 스케줄링·실행 단위다.

| 프로세스 | 스레드 | |
|---|---|---|
| 주소 공간 | 독립 | 공유 (코드·데이터·힙) |
| 스택 | 각자 | 스레드마다 |
| PCB | 프로세스당 1 | 스레드당 TCB 또는 PCB 내 스레드 목록 |
| 생성 비용 | fork 비쌈 |
상대적으로 가벼움 |
| 통신 | IPC(파이프·소켓) | 공유 메모리 (동기화 필요) |
- 스레드는 같은 힙을 쓰므로 포인터·전역 변수 공유가 쉽다
- 편하지만 경쟁 상태 위험도 커진다
2. 스레드가 공유·독립인 것
| 공유 | 독립 |
|---|---|
| 코드(텍스트) | 레지스터·PC |
| 전역·힙 데이터 | 스택 |
| 열린 파일·시그널 설정(일부) | 스레드 ID |
#include <pthread.h>
void *worker(void *arg) { /* ... */ return NULL; }
pthread_t tid;
pthread_create(&tid, NULL, worker, NULL);
pthread_join(tid, NULL);
3. 멀티스레드 모델

| 모델 | 설명 | 예 |
|---|---|---|
| Many-to-One | 유저 스레드 여러 개 → 커널 스레드 1 | 구식 green thread |
| One-to-One | 유저 스레드 1 : 커널 스레드 1 | Linux NPTL, Windows |
| Many-to-Many | M 유저 : N 커널 (M≥N) | 일부 구현 |
- One-to-One이 현대 OS에서 일반적
- 한 스레드 블록 시 다른 스레드가 다른 코어에서 실행 가능
- Many-to-One은 한 스레드가 블로킹 syscall 하면 전체가 멈출 수 있음
4. 왜 스레드를 쓰는가
| 이유 | 설명 |
|---|---|
| 응답성 | UI 스레드 + 워커 스레드 |
| 자원 공유 | 같은 데이터 구조에 쉽게 접근 |
| 경제성 | 프로세스 생성보다 컨텍스트 스위치 저렴 (같은 주소 공간) |
| 멀티코어 | 코어당 스레드 배치로 병렬 |
- 단점: 동기화 복잡, 디버깅 어려움, 한 스레드 버그가 전체 프로세스에 영향
5. 정리
- 스레드는 프로세스 내부 실행 단위, 코드·힙은 공유·스택은 분리
- One-to-One 모델이 Linux·Windows의 기본
- 공유 메모리는 IPC보다 빠르지만 동기화가 필수
- 다음: CPU가 어떤 스레드/프로세스를 고르는지 — 스케줄링
다음에 다룰 것
- CPU 스케줄링 기초
- FCFS, SJF, Round-Robin, 우선순위
해당 내용은 Operating System Concepts, 10/E (Avraham Silberschatz, Peter Baer Galvin, Greg Gagne) 의 내용을 기반으로 합니다.
'운영체제 따라잡기' 카테고리의 다른 글
| 동기화 도구 (0) | 2026.06.25 |
|---|---|
| CPU 스케줄링 기초 (0) | 2026.06.24 |
| 프로세스 생성과 종료 (0) | 2026.06.22 |
| 프로세스란 무엇인가 (0) | 2026.06.21 |
| 운영체제 구조와 시스템 콜 (0) | 2026.06.20 |