Operating System Concepts (공룡책) 4장

·2026년 6월 24일

IT기초

목록 보기
4/6

"스레드는 CPU 이용의 기본 단위다."
프로세스 안에서 실제로 실행 흐름을 담당하는 것이 스레드다. 하나의 프로세스는 여러 스레드를 가질 수 있고, 이 스레드들은 코드·데이터·파일을 공유하면서 각자의 실행 흐름을 독립적으로 유지한다.


목표

  1. 스레드의 개념과 프로세스와의 차이를 이해
  2. 멀티스레딩의 이점을 파악
  3. 병렬성과 동시성의 차이를 구분
  4. 사용자 스레드와 커널 스레드, 멀티스레딩 모델을 비교
  5. 암묵적 스레딩과 스레딩 이슈를 이해

4.1 스레드 개요

스레드란

스레드는 프로세스 내에서 실행되는 흐름의 단위다. 프로세스 하나가 여러 작업을 동시에 처리하려면 여러 스레드를 사용한다.

[ 단일 스레드 프로세스 ]        [ 멀티 스레드 프로세스 ]

┌──────────────────┐          ┌──────────────────────────┐
│     프로세스       │          │         프로세스           │
│                  │          │                            │
│  ┌────────────┐  │          │  ┌──────┐ ┌──────┐┌──────┐│
│  │  스레드 1    │  │          │  │스레드1│ │스레드2││스레드3││
│  │            │  │          │  │      │ │      ││      ││
│  │ Code       │  │          │  └──────┘ └──────┘└──────┘│
│  │ Data       │  │          │  ← 공유 → Code / Data / Files│
│  │ Files      │  │          │                            │
│  └────────────┘  │          └──────────────────────────┘
└──────────────────┘

프로세스 vs 스레드

스레드가 생기면서 프로세스 내에 공유하는 자원스레드마다 독립적으로 갖는 자원이 나뉜다.

구분공유 (프로세스 전체)독립 (스레드마다 별도)
자원코드 영역, 데이터 영역, 열린 파일, 신호스택, 레지스터, 프로그램 카운터(PC)
이유같은 프로그램 코드를 함께 사용각자의 실행 흐름과 지역 변수가 다름

스레드는 스택과 PC를 독립적으로 가지기 때문에 "각자의 실행 위치"를 유지할 수 있다.


멀티스레딩의 이점

이점설명
응답성 (Responsiveness)한 스레드가 블로킹되어도 다른 스레드가 계속 실행 가능. UI가 멈추지 않음
자원 공유 (Resource Sharing)프로세스를 여러 개 만들지 않고, 한 프로세스 내에서 메모리와 자원을 공유
경제성 (Economy)프로세스 생성보다 스레드 생성이 훨씬 가볍고 빠름. 문맥 교환 비용도 낮음
확장성 (Scalability)멀티코어 환경에서 스레드를 병렬로 실행해 성능 극대화 가능

4.2 멀티코어 프로그래밍

병렬성 vs 동시성

구분동시성 (Concurrency)병렬성 (Parallelism)
개념여러 작업이 번갈아 실행되어 동시에 진행되는 것처럼 보임여러 작업이 물리적으로 정말 동시에 실행됨
필요 조건단일 코어로도 가능멀티코어 필수
[ 동시성 - 단일 코어 ]           [ 병렬성 - 멀티코어 ]

Core 1: A─B─A─B─A─B             Core 1: A─A─A─A
         ↑ 빠른 전환              Core 2: B─B─B─B
         사용자 눈엔 동시처럼 보임          ↑ 진짜 동시 실행

병렬성의 종류

  • 데이터 병렬성 (Data Parallelism) : 동일한 작업을 데이터를 나눠 여러 코어에서 처리

    • ex) 배열 합산 → 절반씩 나눠 Core 1과 Core 2에서 동시에 계산
  • 태스크 병렬성 (Task Parallelism) : 서로 다른 작업을 각 코어에 분배

    • ex) Core 1은 UI 처리, Core 2는 파일 저장

Amdahl의 법칙

코어를 늘려도 성능이 무한정 향상되지 않는다는 법칙이다.

speedup ≤ 1 / (S + (1-S)/N)

S : 순차적으로만 실행해야 하는 비율 (병렬화 불가 구간)
N : 코어 수
예시: 순차 구간 25% (S = 0.25), 코어 4개 (N = 4)

speedup = 1 / (0.25 + 0.75/4)
        = 1 / (0.25 + 0.1875)
        = 1 / 0.4375
        ≈ 2.28배

코어를 무한히 늘려도 순차 구간이 있는 한 속도 향상에는 한계가 있다.
코어 수 N → ∞ 이면 speedup → 1/S


4.3 멀티스레딩 모델

스레드는 구현 위치에 따라 두 종류로 나뉜다.

종류설명관리 주체
사용자 스레드 (User Thread)커널 위, 사용자 공간에서 관리스레드 라이브러리
커널 스레드 (Kernel Thread)OS가 직접 생성하고 관리운영체제

사용자 스레드와 커널 스레드는 반드시 매핑 관계를 가져야 한다. 이 매핑 방식에 따라 세 가지 모델이 있다.


Many-to-One (다대일)

사용자 스레드    커널 스레드
    T1 ─┐
    T2 ─┼──► K1
    T3 ─┘
  • 여러 사용자 스레드가 하나의 커널 스레드에 매핑
  • 스레드 관리가 사용자 공간에서 이루어져 빠름
  • 단점 : 한 스레드가 블로킹 시스템 콜을 호출하면 전체 프로세스가 블로킹됨
  • 단점 : 멀티코어 환경에서 병렬 실행 불가

One-to-One (일대일)

사용자 스레드    커널 스레드
    T1 ──────► K1
    T2 ──────► K2
    T3 ──────► K3
  • 사용자 스레드 하나당 커널 스레드 하나가 대응
  • 한 스레드가 블로킹돼도 다른 스레드는 계속 실행 가능
  • 멀티코어에서 병렬 실행 가능
  • 단점 : 스레드를 만들 때마다 커널 스레드도 생성되어 오버헤드 발생
  • Linux, Windows가 채택하는 방식

Many-to-Many (다대다)

사용자 스레드    커널 스레드
    T1 ─┐
    T2 ─┼──► K1
    T3 ─┤
    T4 ─┼──► K2
    T5 ─┘
  • 여러 사용자 스레드를 더 적거나 같은 수의 커널 스레드에 매핑
  • 블로킹 문제도 없고, 필요한 만큼 커널 스레드를 유연하게 사용 가능
  • 구현이 복잡해 현대 OS에서는 점점 사용 줄어드는 추세

현대 OS(Linux, Windows)는 대부분 One-to-One 모델을 사용한다.


4.4 스레드 라이브러리

스레드를 생성하고 관리하기 위한 API를 제공하는 라이브러리다.

라이브러리환경특징
POSIX PthreadsUnix/Linux표준 스레드 라이브러리. 사용자 및 커널 수준 모두 지원
Windows ThreadsWindowsWindows 전용 커널 수준 스레드
Java ThreadsJVMJVM이 관리. 플랫폼 독립적
/* Pthreads 예시 */
pthread_t tid;
pthread_attr_t attr;

pthread_attr_init(&attr);
pthread_create(&tid, &attr, runner, NULL);  // 스레드 생성
pthread_join(tid, NULL);                    // 스레드 종료 대기

4.5 암묵적 스레딩 (Implicit Threading)

개발자가 직접 스레드를 생성·관리하는 대신, 컴파일러나 런타임 라이브러리가 스레딩을 자동으로 처리하는 방식이다. 멀티코어 환경에서 병렬 프로그래밍의 복잡성을 줄이기 위해 등장했다.

Thread Pool (스레드 풀)

미리 일정 수의 스레드를 만들어두고, 요청이 들어오면 유휴 스레드에 작업을 할당하는 방식이다.

요청 1 ─┐
요청 2 ─┼──► [Thread Pool] ──► 스레드 1
요청 3 ─┤         │          ──► 스레드 2
요청 4 ─┘         │          ──► 스레드 3
           (대기 큐)
  • 스레드를 매번 생성/삭제하는 오버헤드를 줄임
  • 동시에 실행 가능한 스레드 수를 제한해 시스템 과부하 방지
  • 웹 서버에서 흔히 사용

Fork-Join

부모 스레드가 여러 자식 스레드를 fork해 병렬로 작업하고, 모두 완료되면 join해 결과를 합치는 방식이다.

메인 스레드
    │
    ├──► 스레드 1 (작업 A)
    ├──► 스레드 2 (작업 B)   ← fork
    └──► 스레드 3 (작업 C)
              │
           (완료 대기)
              │
         결과 합산          ← join

OpenMP

C/C++ 코드에 #pragma 지시어를 추가해 병렬 구간을 명시하면, 컴파일러가 자동으로 멀티스레드 코드를 생성해주는 방식이다.

#pragma omp parallel for
for (int i = 0; i < N; i++) {
    a[i] = b[i] + c[i];   // 각 반복이 별도 스레드에서 실행
}

4.6 스레딩 이슈

스레드 취소 (Thread Cancellation)

스레드를 중간에 강제 종료해야 할 때 두 가지 방식이 있다.

방식설명문제점
비동기 취소즉시 스레드 종료공유 자원 정리가 안 될 수 있음
지연 취소스레드가 취소 가능 지점을 확인 후 종료안전하지만 즉각적이지 않음

보통 지연 취소가 권장된다. 공유 자원을 안전하게 정리할 수 있기 때문이다.


Thread-Local Storage (TLS)

스레드마다 독립적으로 갖는 데이터 공간이다. 전역 변수처럼 어디서든 접근 가능하지만, 각 스레드가 자신만의 복사본을 가진다.

구분지역 변수TLS전역 변수
범위해당 함수 내해당 스레드 전체모든 스레드 공유
생명 주기함수 종료 시 소멸스레드 종료 시 소멸프로세스 종료 시 소멸

fork()와 exec()의 스레드 문제

멀티스레드 프로세스에서 fork()를 호출하면 두 가지 선택이 있다.

  • 모든 스레드를 복사 : 자식 프로세스도 멀티스레드로 생성
  • 호출한 스레드만 복사 : 자식은 단일 스레드 프로세스

exec()를 곧바로 호출할 거라면 어차피 덮어씌워지므로 호출한 스레드만 복사하는 것이 일반적이다.


4.7 프로세스 vs 스레드 최종 비교

구분프로세스스레드
메모리 공간독립적프로세스 내에서 공유
생성 비용높음낮음
문맥 교환 비용높음 (주소 공간 전환 포함)낮음 (스택·레지스터만 전환)
통신 방법IPC (공유 메모리, 메시지 전달)공유 메모리 직접 접근
독립성완전히 독립같은 프로세스 내 의존
장애 영향프로세스 간 영향 없음한 스레드 오류가 전체 프로세스에 영향

정리

핵심 내용
4.1스레드 = CPU 이용의 기본 단위. 코드·데이터·파일 공유, 스택·PC·레지스터는 독립
4.2동시성(번갈아 실행)≠병렬성(동시 실행). Amdahl의 법칙: 순차 구간이 한계를 결정
4.3Many-to-One / One-to-One / Many-to-Many. 현대 OS는 One-to-One 채택
4.4Pthreads(Unix), Windows Threads, Java Threads
4.5암묵적 스레딩: Thread Pool(재사용), Fork-Join(분할 후 합산), OpenMP(pragma 지시어)
4.6스레드 취소(지연 취소 권장), TLS(스레드 전용 전역 변수), fork/exec 조합 주의
profile
# h

0개의 댓글