🧵 쓰레드와 동시성 제어 (Threads & Concurrency Control)
사용자 수준 쓰레드(ULT) vs 커널 수준 쓰레드(KLT)
-
사용자 수준 쓰레드 (User-Level Thread, ULT)
- 쓰레드의 생성, 종료 등 관리가 사용자 영역의 라이브러리에 의해 이루어짐.
- 장점: 커널 모드 전환이 없어 빠르고, 라이브러리 이식성이 좋다.
- 단점: 한 쓰레드가 블락(block)되면 프로세스 내 모든 쓰레드가 함께 블락되며, 다중 처리기에서 병렬 실행이 불가능하다.
-
커널 수준 쓰레드 (Kernel-Level Thread, KLT)
- 쓰레드 관리를 커널이 직접 수행.
- 장점: 커널이 모든 쓰레드를 인지하므로 CPU 활용률이 좋고 병렬 실행이 가능하다.
- 단점: 쓰레드 관리 시 모드 스위치 오버헤드가 발생하여 ULT보다 느리다.
동시성 기본 개념
- Critical Resource (임계 자원)
- 한 번에 하나의 thread만 접근할 수 있는 resource.
- Critical Section (임계 구역)
- Critical resource에 접근하는 code.
- Mutual Exclusion (상호 배제)
- 한 번에 하나의 thread만 critical section에서 실행되는 것을 보장.
- 이 구간은 순차 실행 영역이 되어 성능이 떨어질 수 있으므로, 정말 필요한 곳에만 적용해야 함.
동기화 도구 (Synchronization Primitives)
- Condition Variable (조건 변수)
- 프로세스가 어떤 특정 조건이 일어나기를 기다리게 하는 것.
- Spin Lock
while문으로 busy waiting하면서 lock을 기다리는 방식.- 구현이 간단하고 상호 배제를 보장.
- 단점: Fairness를 보장하지 않아 starvation(기아) 이 일어날 수 있으며, 특히 single-processor에서는 CPU 낭비가 심하다.
- Critical section이 짧으면 block/awake 방식보다 빠를 수 있다.
- Semaphore (세마포어)
P(wait)와V(signal) 연산을 사용하는 동기화 도구.
메모리 모델과 재배치
- Memory Model: 다중 처리기 환경에서 메모리가 어떻게 작동하는지에 대한 규칙.
- Sequential Consistency: 명령어 재배치(reordering)를 허용하지 않음.
- Relaxed Consistency: 성능 향상을 위해 명령어 재배치를 허용.
- Memory Barrier: 명령어 재배치를 막기 위한 명시적인 명령어.
💾 메모리 관리 (Memory Management)
메모리 할당 기법
- 고정 분할 (Fixed Partitioning)
- 미리 정해진 크기의 파티션으로 메모리를 나눔.
- 단점: 내부 단편화 발생, 파티션보다 큰 프로그램 실행 불가.
- 동적 분hal (Dynamic Partitioning)
- 실행 시간에(runtime) 프로그램이 요청하는 크기만큼 파티션을 생성.
- 단점: 프로세스가 빠져나가면서 총량은 충분하지만 작은 조각들로 나뉘어 할당 못하는 외부 단편화 발생.
- 배치 전략:
- First fit: 가장 먼저 발견하는 충분한 공간에 할당 (성능 좋음).
- Next fit: 마지막 할당 위치부터 검색 시작.
- Best fit: 요청 크기와 가장 비슷한 공간에 할당 (전체 검색으로 성능 나쁨).
- Buddy System
- 고정과 동적 방식의 하이브리드. 메모리를 2의 거듭제곱 크기로 분할(split)하고 합병(coalesce)함.
불연속 할당 기법
-
Paging (페이징)
- 프로세스를 페이지(Page) 라는 고정 크기 블록으로 나눔.
- 메모리는 페이지와 동일한 크기인 프레임(Frame) 으로 나눔.
- 페이지 테이블을 이용해 페이지와 프레임을 매핑.
- 장점: 외부 단편화가 없음.
- 단점: 마지막 페이지에서 약간의 내부 단편화 발생.
-
Segmentation (세그멘테이션)
- 프로세스를 Code, Data, Stack 등 논리적 단위인 세그먼트(Segment) 로 나눔.
- 세그먼트는 가변 크기를 가짐.
- 장점: 보호와 공유가 용이함.
- 단점: 외부 단편화 발생.
💻 가상 메모리 (Virtual Memory)
프로세스 실행에 필요한 부분만 메모리에 적재하는 기법.
가상 메모리 개요
- Page Fault (페이지 폴트)
- 실행하려는 페이지가 메인 메모리에 없을 때 발생하는 인터럽트.
- 느린 Disk I/O가 발생함.
- 프로그램의 지역성(Locality) 덕분에 효율적으로 동작 가능.
페이지 교체 알고리즘 (Page Replacement Algorithms)
빈 프레임이 없을 때 어떤 페이지를 내보낼지 결정.
- Optimal (최적 교체)
- 앞으로 가장 오랫동안 사용되지 않을 페이지를 교체. 이론상 최적이지만 구현 불가능.
- FIFO (First-In, First-Out)
- 가장 먼저 들어온 페이지를 교체. 구현은 쉽지만 비효율적.
- Belady’s Anomaly: 프레임을 늘려도 페이지 폴트가 증가하는 현상 발생 가능.
- LRU (Least Recently Used)
- 가장 오랫동안 사용되지 않은 페이지를 교체. 성능이 좋지만 오버헤드가 큼.
- Clock (Second-Chance)
- LRU의 근사 알고리즘. Reference bit를 사용하여 교체 대상을 결정.
상주 집합 관리 (Resident Set Management)
- Thrashing (쓰레싱)
- 프로세스에 할당된 프레임이 너무 적어 페이지 폴트가 빈번하게 발생하고, 시스템 성능이 급격히 저하되는 현상.
- Working Set Model
- 프로세스의 지역성에 기반하여, 특정 시간 동안 참조된 페이지 집합(Working Set)이 메모리에 유지되도록 프레임을 할당.
- Page Fault Frequency (PFF)
- 페이지 폴트 빈도를 측정하여 상한선을 넘으면 프레임을 더 할당하고, 하한선보다 낮으면 회수하는 동적 방식.
가상 메모리의 장점
- 더 많은 프로세스를 동시에 실행 가능.
- 실제 메모리보다 더 큰 프로세스 실행 가능.
- 메모리 보호에 용이.