토픽 92 / 97·비교표
프로세스 동기화와 교착상태
뮤텍스 vs 세마포어 vs 스핀락
| 항목 | 뮤텍스 | 세마포어 | 스핀락 |
|---|---|---|---|
| 잠금 방식 | 이진 (lock/unlock) | 카운터 (P/V) | 이진 (busy-wait) |
| 대기 방식 | Sleep (블로킹) | Sleep (블로킹) | Busy-wait (CPU 점유) |
| 소유권 | 있음 (lock한 스레드만 unlock) | 없음 (누구나 V 가능) | 있음 |
| 자원 수 | 1개 | N개 | 1개 |
| 적합 | 사용자 공간, 긴 임계구역 | 자원 개수 제한, 동기화 | 커널, 짧은 임계구역 |
모니터 vs 세마포어
| 항목 | 모니터 | 세마포어 |
|---|---|---|
| 수준 | 고수준 (ADT) | 저수준 |
| 상호배제 | 자동 (enter/exit) | 수동 (P/V) |
| 오류 가능성 | 낮음 (캡슐화) | 높음 (P/V 순서 실수) |
| 언어 지원 | Java synchronized, Python | POSIX, 시스템 호출 |
| signal 의미 | Hoare (즉시) / Mesa (while 재확인) | V 연산 (깨움) |
RCU vs Reader-Writer Lock vs Mutex
| 항목 | RCU | Reader-Writer Lock | Mutex |
|---|---|---|---|
| 읽기 성능 | 무잠금 (최고) | 공유 잠금 | 완전 잠금 |
| 쓰기 복잡도 | 높음 (Copy-Update) | 중간 | 낮음 |
| 데드락 | 없음 | 가능 | 가능 |
| 적합 | 읽기 중심 워크로드 | 읽기 많은 경우 | 범용 |
경쟁 상태 vs 교착상태 vs 기아
| 항목 | Race Condition | Deadlock | Starvation |
|---|---|---|---|
| 본질 | 비결정적 결과 | 영구 블록 | 무한 대기 |
| 원인 | 동기화 미적용 | 순환 대기 (4조건) | 우선순위 편중 |
| 재현 | 어려움 (타이밍 의존) | 상대적 용이 | 상대적 용이 |
| 해결 | 뮤텍스/원자적 연산 | 예방/회피/탐지 | 에이징/공정 스케줄링 |
데드락 처리: 예방 vs 회피 vs 탐지/복구
| 항목 | 예방 (Prevention) | 회피 (Avoidance) | 탐지/복구 (Detection) |
|---|---|---|---|
| 시점 | 사전 (조건 제거) | 사전 (안전성 검사) | 사후 (발생 후 처리) |
| 오버헤드 | 낮음 | 중간 (O(m×n²)) | 탐지+복구 비용 |
| 자원 활용 | 낮음 | 중간 | 높음 |
| 실용성 | 제한적 | 최대요구량 필요 | 실용적 |
IPC 비교: 파이프 vs 공유메모리 vs 메시지큐 vs 소켓
| 항목 | 파이프 | 공유 메모리 | 메시지 큐 | 소켓 |
|---|---|---|---|---|
| 방향 | 단방향 | 양방향 | 양방향 | 양방향 |
| 범위 | 로컬 (관련 프로세스) | 로컬 | 로컬 | 로컬+원격 |
| 속도 | 빠름 | 최고 | 중간 | 느림 (네트워크) |
| 동기화 | 자동 (버퍼 블로킹) | 수동 (세마포어/뮤텍스) | 자동 | 자동 |
| 적합 | 부모-자식, 셸 | 대용량 데이터 | 비동기, 우선순위 | 네트워크, 범용 |
동시성 프로그래밍 모델 비교
| 항목 | 스레드 기반 | Actor 모델 | CSP | async/await |
|---|---|---|---|---|
| 통신 | 공유 메모리 | 메시지 전달 | 채널 | Future/Promise |
| 안전성 | 낮음 (경쟁 조건) | 높음 (캡슐화) | 높음 (동기적) | 중간 |
| 대표 언어 | Java, C++ | Erlang, Akka | Go | JavaScript, Rust |
| 적합 | 시스템 프로그래밍 | 분산 시스템 | 동시성 서버 | I/O 바운드 |