뮤텍스와 세마포어는 Critical Sescition에 접근하는 여러 스레드 중 하나의 스레드만 접근할 수 있게 하는 동기화 도구이다.
*Critical Sescition: 프로그램 코드 상에서 공유 자원에 접근하는 부분
뮤텍스
공유된 자원에 단 하나의 프로세스/스레드만 접근할 수 있게 막아주는 동기화 객체
뮤텍스(Mutex)는 이진 세마포어(binary semaphore)와는 다른, 잠금(locking) 메커니즘을 제공하는 객체이다.
Mutex는 Mutual Exclusion Object의 약자로, Critical Sescition*을 한 번에 하나의 프로세스(또는 스레드)만 접근하도록 상호 배제를 제공할 때 주로 사용된다.
장점
- 경쟁 조건(race condition) 발생 방지
- 데이터 일관성과 무결성 유지
- 간단한 잠금 메커니즘으로, 임계 구역(Critical Section) 진입/종료 시 lock/unlock 가능
단점
- 임계 구역에 들어간 후 스레드가 슬립(sleep) 하거나 높은 우선순위 프로세스에게 선점되면 다른 스레드는 진입 불가 → 기아 상태(starvation) 발생 가능
- 임계 구역 해제 전까지 다른 스레드는 접근 불가
- 구현 시 busy waiting 발생 가능 → CPU 낭비
세마포어
세마포어는 여러 스레드가 공유하는 음이 아닌 정수형 변수로, 신호 전달 매커니즘에 기반한다.
한 스레드는 다른 스레드로부터 신호(signal)를 받을 수 있다.
장점
- 여러 스레드가 동시에 임계 구역 접근 가능
- 기계 독립적(machine-independent)
- 유연한 자원 관리 가능
- 세마포어는 임계 구역에 한 프로세스만 접근 보장하지만, 여러 스레드 동시 허용 가능
단점
- 우선순위 역전 발생 가능
- Wait, Signal 구현 실수 시 교착 상태(deadlock) 발생 가능
- 대규모 시스템에서 모듈화 유지 어려움
- 프로그래밍 오류 가능성 높음 → 상호 배제 위반 가능
- 운영체제가 모든 Wait/Signal 호출 추적 필요
뮤텍스 ≠ 이진 세마포어
구조적인 유사점
- 뮤텍스와 이진 세마포어 모두 값이 0 또는 1로 제한된다.
- 둘 다 상호 배제(Mutual Exclusion)를 구현하는 데 사용할 수 있다.
- 임계 구역(Critical Section)에 한 번에 하나의 스레드만 들어가도록 할 수 있다.
그래서 “뮤텍스 = 이진 세마포어”라고 생각하는 사람들이 많다.
근본적인 차이는 소유권
| 구분 | 뮤텍스 | 이진 세마포어 |
|---|
| 소유권 | 뮤텍스를 획득(lock)한 스레드만 해제(unlock) 가능 | 세마포어를 wait한 스레드와 다른 스레드도 signal 가능 |
| 목적 | 상호 배제: 특정 자원에 하나의 스레드만 접근하도록 보장 | 신호/자원 관리: 스레드 간 작업 순서 조정 또는 자원 카운팅 |
- 뮤텍스는 “누가 잠갔는지”를 명확히 알고 있어야 한다.
→ 잘못된 스레드가 unlock 하면 에러 발생.
- 세마포어는 소유권이 없어서, 어떤 스레드든 signal을 호출 가능.
→ 즉, 스레드 간 신호 전달(Signaling) 용도로도 사용 가능.
사용 의도 차이
- 뮤텍스: 단순히 임계 구역을 보호하고, 동시에 접근하는 스레드를 제한하고자 할 때 사용.
- 세마포어: 단순 상호 배제뿐 아니라, 다수 자원의 접근 관리, 스레드 간 순서 제어, 생산자-소비자 문제 등 다양한 동기화 시나리오에 사용.
예시
Thread A: lock mutex → 임계 구역 진입
Thread B: lock mutex → 대기
Thread A: unlock mutex → Thread B 진입
임계 구역 진입한 스레드만 unlock 가능
Thread A: wait(sema) → 임계 구역 진입
Thread B: wait(sema) → 대기
Thread C: signal(sema) → Thread A/B 중 하나 진입 가능
신호를 보내는 스레드가 누구든 상관 X
스레드 간 신호 전달용으로 활용 가능
즉, 겉보기엔 비슷하지만, 뮤텍스는 “잠근 스레드만 풀 수 있는 잠금”이고, 세마포어는 소유권이 없는 카운팅 신호라는 점이 결정적 차이다.
정리
- 뮤텍스 = 이진 세마포어라고 생각할 수 있으나 목적이 다르다.
- 뮤텍스는 잠금 메커니즘으로 한 작업(스레드/프로세스)만 접근 가능하며 소유자만 해제 가능.
- 세마포어는 신호 메커니즘으로, 여러 작업이 자원 접근을 효율적으로 조정 가능.