🔍 Mutex, RLock, RWLock, 스핀락, 세마포어 비교 요약 정리
운영체제(OS)에서 멀티스레딩 동기화 기법으로 사용되는 뮤텍스(Mutex), 재진입 가능 락(RLock), 읽기-쓰기 락(RWLock), 스핀락(Spinlock), 세마포어(Semaphore) 의 차이를 정리했습니다.
1. 개념 요약
동기화 기법 |
개념 |
특징 |
사용 예시 |
Mutex (뮤텍스) |
하나의 스레드만 임계 영역 접근 가능 |
다른 스레드는 Lock이 해제될 때까지 대기 (Blocking) |
단순한 공유 자원 보호 |
RLock (재진입 가능 락) |
같은 스레드가 여러 번 Lock 가능 |
Lock 획득 횟수만큼 Unlock 필요 |
재귀 호출, OOP에서 동일 객체 내 여러 메서드 사용 |
RWLock (읽기-쓰기 락) |
여러 개의 스레드가 동시에 읽기 가능, 쓰기는 단일 스레드만 가능 |
읽기와 쓰기 작업을 분리하여 성능 향상 |
읽기 작업이 많은 환경 (DB 캐시, 파일 읽기) |
Spinlock (스핀락) |
Lock이 해제될 때까지 계속 CPU를 사용하며 대기 |
Busy-Waiting, 빠른 Lock 해제 시 유리 |
커널 락, 짧은 Lock 유지가 필요한 경우 |
Semaphore (세마포어) |
N개의 스레드가 동시에 접근 가능 |
Lock 개수를 조절 가능 (카운팅 기능) |
네트워크 연결, 리소스 제한 |
2. 동작 방식 비교
동기화 기법 |
Lock 동작 방식 |
Unlock 방식 |
주요 특징 |
Mutex |
한 번에 하나의 스레드만 Lock 가능 |
Lock을 획득한 스레드만 Unlock 가능 |
일반적인 동기화 기법 |
RLock |
같은 스레드가 여러 번 Lock 가능 |
획득한 Lock 개수만큼 Unlock 호출 필요 |
재귀 함수 및 객체 지향 프로그래밍에 적합 |
RWLock |
여러 개의 스레드가 읽기(Read) Lock 가능, 쓰기(Write) Lock은 단 하나만 가능 |
읽기/쓰기 각각 해제 필요 |
읽기 작업이 많은 경우 성능 향상 |
Spinlock |
Lock이 해제될 때까지 Busy-Waiting |
Lock 해제 즉시 다음 스레드가 획득 |
빠른 Lock 해제에 적합, CPU 자원 낭비 가능 |
Semaphore |
N개의 스레드가 접근 가능 (sem_wait) |
sem_post를 호출하면 다른 스레드가 접근 가능 |
동시 접근 제한 가능 |
3. 성능 및 사용 사례
동기화 기법 |
장점 |
단점 |
추천 사용 사례 |
Mutex |
단순하고 직관적, 기본적인 동기화 제공 |
한 번에 하나의 스레드만 접근 가능 → 성능 저하 가능 |
공유 변수 보호, 임계 영역 관리 |
RLock |
같은 스레드가 여러 번 Lock 가능 |
Unlock을 여러 번 호출해야 해제됨 |
재귀 함수, 클래스 기반 멀티스레딩 |
RWLock |
읽기 병렬 처리 가능 → 성능 향상 |
쓰기 작업이 많으면 성능 저하 |
데이터베이스 읽기, 로그 시스템 |
Spinlock |
빠른 Lock 해제 시 효과적, 커널 락에 적합 |
Lock 대기 중에도 CPU 사용 → 과부하 발생 가능 |
커널 락, 짧은 Lock 유지가 필요한 경우 |
Semaphore |
여러 개의 스레드가 동시에 접근 가능, 리소스 제한 가능 |
Count 값 설정이 어려울 수 있음 |
네트워크 연결 동기화, 생산자-소비자 문제 |
4. 언제 사용해야 할까?
사용 목적 |
추천 동기화 기법 |
단순한 공유 자원 보호 |
Mutex |
같은 스레드가 여러 번 Lock을 획득해야 함 |
RLock |
읽기 작업이 많고, 쓰기 작업이 적은 경우 |
RWLock |
빠르게 Lock을 획득/해제해야 함 |
Spinlock |
일정 개수의 스레드만 접근 가능하도록 제한해야 함 |
Semaphore |
5. Mutex, Spinlock, Semaphore 차이점 요약
기법 |
동작 방식 |
CPU 사용 방식 |
주요 용도 |
Mutex |
Lock이 해제될 때까지 대기 (Blocking Wait) |
CPU 사용 안 함 |
단일 스레드 보호 |
Spinlock |
Lock이 해제될 때까지 반복 확인 (Busy-Waiting) |
CPU 사용 (낭비 가능) |
짧은 Lock 유지가 필요한 경우 |
Semaphore |
Count만큼 스레드가 동시에 접근 가능 |
CPU 사용 안 함 |
동시 접근 제한 |
🔹 결론
- Mutex는 기본적인 동기화 기법으로, 하나의 스레드만 자원에 접근 가능.
- RLock은 같은 스레드가 여러 번 Lock을 획득해야 할 때 사용.
- RWLock은 읽기 작업이 많은 환경에서 성능을 최적화.
- Spinlock은 빠른 Lock 해제가 필요하지만 CPU 낭비를 감수해야 할 때 사용.
- Semaphore는 동시 접근을 제한해야 할 때 유용.