운영체제 따라잡기

스레드

meellon 2026. 6. 23. 05:00

학습 목표

프로세스스레드의 차이를 설명할 수 있다.

스레드가 주소 공간·파일을 공유하고 스택·레지스터만 갖는 이유를 설명할 수 있다.

유저 스레드 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