CS/운영체제

뮤텍스, 세마포어, 모니터

프론트엔드코린이 2025. 5. 29. 19:04

경쟁상태를 해결하는 대표적인 방법으로는 뮤텍스, 세마포어, 모니터 3가지가 있다.

  • 이들은 상호배제, 한정대기, 진행의 융통성의 조건을 만족시키며 경쟁상태를 해결한다.
  1. 상호 배제(mutual exclusion) : 한 프로세스가 임계 영역에 들어갔을 때 다른 프로세스는 들어갈 수 없음
  2. 한정 대기(bounded wating) : 특정 프로세스가 임계영역 진입을 요청한 후 해당 요청이 승인되기 전까지 다른 프로세스가 임계 영역에 진입하는 횟수를 제한하는 것을 말하며 이를 통해 특정 프로세스가 영원히 임계 영역에 들어가지 못하게 하는 것을 방지함.
  3. 진행의 융통성(progress) : 만약 어떠한 프로세스도 임계영역을 사용하지 않는다면 임계영역 외부의 어떠한 프로세스도 들어갈 수 있으며 이 때 프로세스끼리 서로 방해하지 않는 것을 말함.

 

 

🔒 뮤텍스 (Mutex, Mutual Exclusion)

  • 정의:
    하나의 스레드만 임계영역에 진입할 수 있도록 보장하는 상호 배제 기법입니다.
    락(Lock)을 획득한 스레드만 해당 자원을 사용할 수 있으며, 나머지 스레드는 대기해야 합니다.
  • 특징:
    • 값이 0 또는 1인 이진 락 (Binary Lock)
    • 자원을 사용하는 동안은 다른 스레드가 접근 불가
    • 락을 획득(lock)작업 수행해제(unlock) 순서로 사용

⚖️ 세마포어 (Semaphore)

  • 정의:
    동시 접근 가능한 스레드 수를 제어하는 동기화 도구입니다.
    내부적으로 카운터를 가지고 있으며, 카운터 값이 0이면 대기 상태가 됩니다.
  • 종류:
    • 카운팅 세마포어: 여러 개의 리소스를 동시에 관리 (카운터 > 1)
    • 이진 세마포어: 뮤텍스처럼 동작 (카운터 0 또는 1)
  • 작동 방식:
    • wait() → 자원 요청 시 카운터 감소
    • signal() → 자원 반환 시 카운터 증가

🧩 모니터 (Monitor)

  • 정의:
    임계영역을 자동으로 관리하는 상호배제 메커니즘입니다.
    뮤텍스 + 조건 변수(Condition Variable)를 캡슐화한 고수준 추상화 도구입니다.
  • 특징:
    • 자원 접근 시 자동으로 락을 획득 및 해제
    • 내부에서 조건 변수로 스레드 간 통신 가능
    • Java의 synchronized, Python의 with threading.Lock() 등이 예시

 

 

* 뮤텍스와 세마포어의 차이점은 잠금 기반이냐? 신호 기반이냐? 라고 정의할 수 있을 거 같다.