뮤텍스 (Mutex)

공유된 자원의 데이터를 여러 스레드가 접근하는 것을 막는 것

상호배제라고도 하며, Critical Section 을 가진 스레드의 Running time 이 서로 겹치지 않도록 각각 단독으로 실행하게 하는 기술이다.

  • Critical Section: 각 프로세스에서 공유 자원을 액세스하는 프로그램 코드 부분

다중 프로세스들의 공유 리소스에 대한 접근을 조율하기 위해 synchronized 또는 lock 을 사용한다.

  • 즉, 뮤텍스 객체를 두 스레드가 동시에 사용할 수 없다.

B) 세마포어 (Semaphore)

현재 공유 자원에 접근할 수 있는 스레드 또는 프로세스의 수를 나타내는 값을 설정하여 상호배제를 달성하는 기법

  • 세마포어는 리소스 상태를 나타내는 간단한 카운터를 사용하며, 이는 OS 또는 Kernel 에서 지정된 값이다.

일반적으로 비교적 긴 시간을 확보하는 리소스에 대해 이용한다.

각 프로세스는 세마포어 값은 확인하고 변경할 수 있다.

  • 사용 중이지 않는 자원의 경우 그 프로세스가 즉시 자원을 사용할 수 있다.
  • 이미 다른 프로세스에 의해 사용 중이라는 사실을 알게 되면 재시도하기 전에 일정 시간을 기다려야 한다.
  • 세마포어를 사용하는 프로세스는 그 값을 확인하고, 자원을 사용하는 동안에는 그 값을 변경함으로써 다른 세마포어 사용자들이 기다리도록 해야한다.

C) Mutex Vs Semaphore

  1. 가장 큰 차이점은 관리하는 동기화 대상의 개수

    • Mutex 는 동기화 대상이 오직 하나뿐일 때, Semaphore 는 동기화 대상이 하나 이상일 때 사용한다.
  2. 여러개의 Mutex 로 Semaphore 를 구현할 수 있고, 값이 1 인 Semaphore 가 Mutex 다.

  3. Mutex 의 경우 Mutex 를 소유하고 있는 스레드가 이 Mutex 를 해제할 수 있다. 하지만 Semaphore 의 경우 이러한 Semaphore 를 소유하지 않는 스레드가 Semaphore 를 해제할 수 있다.

  4. Semaphore 는 시스템 범위에 걸쳐있고 파일시스템상의 파일 형태로 존재하는 반면, Mutex 는 프로세스 범위를 가지며 프로세스가 종료될 때 자동으로 Clean up 된다.