프로세스(Process)와 스레드(Thread)
1. 프로세스(Process)
프로세스: 실행 중인 프로그램의 인스턴스
- CPU 스케줄링의 기본 단위
- 메모리에 로드되면 고유의 자원(메모리 공간, 파일 디스크립터 등)을 할당받음
1.1 프로세스 생성과 실행 흐름
- 생성 (New)
fork()
, exec()
호출로 새로운 PCB(Process Control Block) 생성
- 준비(Ready) / 대기(Waiting)
- CPU 할당 대기 (I/O나 이벤트 대기 시 Blocked)
- 실행(Running)
- CPU를 점유해 명령어 수행 (CPU burst)
- 중단(Suspended)
- 메모리 부족 등으로 스와핑(swapped out) → 디스크로 이동
- 대기 중단(Suspended Waiting)
- 종료(Terminated)
참고: 일부 단순/임베디드 OS는 “준비(Ready)” 상태를 생략하고 대기 ↔ 실행만 구분하기도 함.
2. 프로세스 메모리 구조
┌───────────────────────────┐
│ 코드 영역 │ (Text)
├───────────────────────────┤
│ 초기화된 전역 변수 │ (.data)
├───────────────────────────┤
│ 초기화되지 않은 전역 변수 │ (BSS)
├───────────────────────────┤
│ 힙(Heap) ↑ │ (동적 할당 영역)
│ … │
│ │
│ 스택(Stack) ↓ │ (함수 호출·지역 변수)
└───────────────────────────┘
- 코드(Text): 실행할 기계어 명령어
- .data: 초기값이 0이 아닌 전역·정적 변수
- BSS: 초기값이 0 이거나 생략된 전역·정적 변수
- 힙(Heap):
malloc
/new
등 동적 메모리
- 스택(Stack): 함수 호출 시 스택 프레임(매개변수, 반환 주소, 지역 변수)
힙은 낮은 주소에서 ↑로, 스택은 높은 주소에서 ↓로 자라며, 서로 충돌하면 할당 실패 또는 세그멘테이션 오류 발생.
3. PCB(Process Control Block)
- 역할: 프로세스 메타데이터(상태, 레지스터, 메모리 맵 등) 저장
- 주요 필드
- 프로세스 ID (PID)
- 상태 (New, Ready, Running, Blocked, Suspended, Terminated)
- 프로그램 카운터(PC)
- CPU 레지스터 집합
- 메모리 관리 정보 (페이지 테이블, 세그먼트 테이블)
- 스케줄링 우선순위, 계정 정보 등
4. 컨텍스트 스위칭(Context Switch)
- 현재 PCB 저장
- 스케줄러 실행
- 새 PCB 복원
- 실행 재개
오버헤드(레지스터 저장/복원, 캐시 미스 등)가 발생하므로 과도한 스위칭은 성능 저하 원인.
5. 스레드(Thread)와 멀티스레딩(Multi‑threading)
- 스레드: 프로세스 내에서 독립적으로 실행 가능한 최소 단위
- 코드, 데이터, 힙 영역 공유
- 스택과 레지스터 컨텍스트는 각자 별도
- 장점:
- 경량화 → 컨텍스트 스위칭 비용 ↓
- 자원 공유로 통신 비용 ↓
- 단점:
- 하나의 스레드 오류가 프로세스 전체에 영향
- 동기화 복잡도 ↑
6. 멀티프로세싱 vs 멀티스레딩
구분 | 멀티프로세싱 | 멀티스레딩 |
---|
메모리 공간 | 완전 독립 | 코드·데이터·힙 공유, 스택만 분리 |
오버헤드 | PCB 교체, 별도 주소 공간 → 높음 | 레지스터·스택 교체만 → 낮음 |
장애 격리 | 프로세스 간 독립 → 안정적 | 한 스레드 오류 시 전체 프로세스 영향 |
통신(IPC) | 별도 메커니즘 필요 (IPC) | 메모리 공유 → 간단하지만 동기화 필요 |
7. 프로세스 간 통신(IPC)
- 공유 메모리(Shared Memory)
- 공용 메모리 블록에 직접 읽기·쓰기
- 가장 빠름, 동기화(뮤텍스 등) 필요
- 파이프(Pipe / Named Pipe)
- 단방향(익명) 또는 양방향(이름 있는) 바이트 스트림
- 메시지 큐(Message Queue)
- 소켓(Socket)
- 네트워크/로컬 IPC 모두 가능, TCP/UDP 사용
8. 동기화와 임계 영역(Critical Section)
- 임계 영역: 공유 자원에 접근하는 코드 구간
- 경쟁 상태(Race Condition): 동시 접근 시 결과 불확실
8.1 뮤텍스(Mutex)
- 상호 배제(Mutual Exclusion) → 한 번에 하나만 진입
- lock() / unlock() API
8.2 세마포어(Semaphore)
- 카운팅 세마포어: 자원 개수만큼 동시 접근 허용
- 이진 세마포어: 뮤텍스와 유사
8.3 모니터(Monitor)
- 고수준 동기화 객체
- 뮤텍스 + 조건 변수(condition variable) 결합
- 자동 락/언락,
wait()
/signal()
지원
9. 교착 상태(Deadlock)
네 가지 필요 조건이 모두 성립 시 발생
1. 상호 배제 (Mutual Exclusion)
2. 점유 및 대기 (Hold and Wait)
3. 비선점 (No Preemption)
4. 순환 대기 (Circular Wait)
해결 기법
- 예방(Prevention): 필요 조건 하나 이상 차단
- 회피(Avoidance): 은행원 알고리즘 등으로 안전 상태 유지
- 탐지 및 복구(Detection & Recovery): 교착 발생 후 프로세스 강제 종료 또는 자원 회수