본문 바로가기

Concurrency

Mutex vs Semaphore

 

Mutex

Mutex 라는 이름은 Mutual Exclustion (상호배제) 를 의미하며 critical section 의 shared data 를 보호하기 위해 사용된다.

 

Mutex 는 한 번에 오직 한개의 thread 가 resource 에 접근하는 것을 허용하며 Java 에서 Mutex 의 전형적인 예시는 Synchronized block 이다.

 

 

Semaphore

  1. Semaphore 는 mutex 와는 다르게 resource 에 제한된 접근을 하기 위해 사용된다.
  2. Semaphore 는 제한된 숫자의 허가증을 가지고 있다고 생각하자.
  3. 만약 Semaphore 가 가지고 있는 허가증을 모두 사용했을 경우, 허가증을 사용한 이전 thread 가 허가증을 return 할 때까지 신규 thread 의 허가 요청 진입은 block 된다.
  4. Semaphore 의 전형적인 예시는 “Database Connection Pool” 이다.
    1. 만약 10개의 허가증을 가진 DBCP 에 50 개의 request thread 가 들어온다면, 10개의 접속만을 허용하고 나머지 request 는 대기하고 있다가 정해진 시간에 접속을 허용시키게 된다.
  5. 오로지 하나의 허가증을 가진 Semaphore 를 Binary Semaphore 라고 부른다.
  6. Binary Semaphore 는 보통 Mutex 와 같다고 생각하기 쉬운데 완전히 같다고 볼수는 없다.
  7. Semaphore 는 오직 thread 간의 signaling 을 위해 사용될 수도 있는데, 이것은 thread 들끼리 협력을 허용하는한다는 점에서 중요한 구별요소이다.
    1. 예를 들어, Producer / Consumer Pattern 에서 Consumer thread 에게 새롭게 생성된 메세지를 Consume 해야 한다는 것을 알려주기 위해 Semaphore Count 를 증가시킴으로써 그 수 만큼 Consumer 가 메세지를 Consume 할 수 있다.
  8. Mutex 는 반면에 race thread 들 끼리의 접근을 오직 순차접근만 가능하게 엄격하게 제한한다.

'Concurrency' 카테고리의 다른 글

Critical Section & Race Condition  (0) 2024.04.13
Deadlock, liveness, Live lock, Starvation  (0) 2024.04.13
뮤텍스(Mutex) VS 모니터(Monitor)  (0) 2021.03.28