프로세스와 스레드
프로세스와 스레드 (Process & Thread)
프로세스 vs 스레드, 멀티스레드 스케줄링, 컨텍스트 스위칭, Race Condition, 동기화
프로세스 vs 스레드
| 구분 | 프로세스 (Process) | 스레드 (Thread) |
|---|---|---|
| 정의 | 실행 중인 프로그램, 자원 할당의 단위 | 프로세스 내 실행 흐름의 단위 |
| 메모리 | 독립적인 메모리 영역 할당 (Code/Data/Stack/Heap) | 프로세스 메모리 공유 (Stack 제외) |
| 자원 공유 | 공유하지 않음 → IPC 필요 | 공유함 |
| 오버헤드 | 생성·컨텍스트 스위칭 오버헤드 큼 | 생성·컨텍스트 스위칭 오버헤드 작음 |
| 안정성 | 한 프로세스 오류가 다른 프로세스에 영향 없음 | 한 스레드 오류가 전체 프로세스에 영향 |
- IPC (Inter-Process Communication): 프로세스 간 데이터 교환을 위한 통신 방법
멀티스레드 스케줄링
OS가 여러 스레드에 CPU 자원을 효율적으로 할당하는 기법
| 방식 | 설명 |
|---|---|
| 시분할 (Time-Sharing) | 각 스레드에 짧은 Time Quantum 할당 후 순서대로 전환 |
| 우선순위 (Priority Based) | 우선순위 높은 스레드에 먼저 CPU 할당 |
| 라운드 로빈 (Round Robin) | 우선순위 없이 모든 스레드가 공평하게 할당, 시간 초과 시 큐 맨 뒤로 이동 |
컨텍스트 스위칭 (Context Switching)
CPU가 현재 실행 중인 프로세스/스레드의 상태를 저장하고, 다음 프로세스/스레드 상태를 복원하는 과정
과정:
- 현재 스레드 A의 상태(레지스터, PC)를 PCB/TCB에 저장
- 다음 스레드 B의 상태를 TCB에서 복원
- 스레드 B 실행 재개
발생 시점: 인터럽트, 시스템 콜, 스케줄링 전환점
컨텍스트 스위칭 중 CPU는 아무 일도 하지 못함 → 과도하게 잦으면 성능 저하(Overhead)
스레드는 프로세스보다 오버헤드가 적음 (공유 메모리가 많아 저장·복원할 정보가 적음)
Race Condition (경쟁 상태)
둘 이상의 스레드가 공유 자원에 동시 접근하여 조작할 때, 실행 순서에 따라 결과가 달라지는 예측 불가능한 상황
- 발생 원인: 공유 변수에 대한
Read-Modify-Write연산의 동시 실행
동기화 기법
| 기법 | 설명 |
|---|---|
| Lock | 임계 영역(Critical Section) 진입 전 락 획득, 나올 때 해제. 락 보유 중 다른 스레드는 대기 |
| 뮤텍스 (Mutex) | 오직 하나의 스레드만 임계 영역 진입 허용. 락을 획득한 스레드만 해제 가능 |
| 세마포어 (Semaphore) | 지정된 N개의 스레드가 동시 접근 허용 |
세마포어 종류:
- 카운팅 세마포어: 허용 스레드 수가 N개 (예: 최대 5개 네트워크 커넥션)
- 이진 세마포어: 허용 스레드 수가 1개. 뮤텍스와 유사하나 락을 획득하지 않은 스레드도 해제 가능
큐 패턴 (Queue Patterns)
| 큐 종류 | 설명 | 특징 |
|---|---|---|
| SyncQueue | 생산자-소비자 간 속도 조절용 스레드 안전 큐 | 큐 가득 참 → 생산자 대기(Block), 큐 빔 → 소비자 대기(Block) |
| AsyncQueue | 비동기(이벤트 루프) 환경의 논블로킹 큐 | await와 함께 사용. 비어있으면 비동기 대기 후 재개 |
| DelayQueue | 각 아이템에 지연 시간 설정. 만료 시간이 지난 후에만 꺼낼 수 있음 | 캐시 만료 처리, 지연 작업 스케줄링에 유용 |