뮤텍스와 세마포어

ideafy·2025년 11월 22일

CS

목록 보기
14/17

뮤텍스와 세마포어는 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
스레드 간 신호 전달용으로 활용 가능

즉, 겉보기엔 비슷하지만, 뮤텍스는 “잠근 스레드만 풀 수 있는 잠금”이고, 세마포어는 소유권이 없는 카운팅 신호라는 점이 결정적 차이다.


정리

  • 뮤텍스 = 이진 세마포어라고 생각할 수 있으나 목적이 다르다.
  • 뮤텍스는 잠금 메커니즘으로 한 작업(스레드/프로세스)만 접근 가능하며 소유자만 해제 가능.
  • 세마포어는 신호 메커니즘으로, 여러 작업이 자원 접근을 효율적으로 조정 가능.
profile
재밌게 공부하고 싶어요

0개의 댓글