뮤텍스 (Mutex)
공유된 자원의 데이터를 여러 스레드가 접근하는 것을 막는 것
상호배제라고도 하며, Critical Section 을 가진 스레드의 Running time 이 서로 겹치지 않도록 각각 단독으로 실행하게 하는 기술이다.
- Critical Section: 각 프로세스에서 공유 자원을 액세스하는 프로그램 코드 부분
다중 프로세스들의 공유 리소스에 대한 접근을 조율하기 위해 synchronized 또는 lock 을 사용한다.
- 즉, 뮤텍스 객체를 두 스레드가 동시에 사용할 수 없다.
B) 세마포어 (Semaphore)
현재 공유 자원에 접근할 수 있는 스레드 또는 프로세스의 수를 나타내는 값을 설정하여 상호배제를 달성하는 기법
- 세마포어는 리소스 상태를 나타내는 간단한 카운터를 사용하며, 이는 OS 또는 Kernel 에서 지정된 값이다.
일반적으로 비교적 긴 시간을 확보하는 리소스에 대해 이용한다.
각 프로세스는 세마포어 값은 확인하고 변경할 수 있다.
- 사용 중이지 않는 자원의 경우 그 프로세스가 즉시 자원을 사용할 수 있다.
- 이미 다른 프로세스에 의해 사용 중이라는 사실을 알게 되면 재시도하기 전에 일정 시간을 기다려야 한다.
- 세마포어를 사용하는 프로세스는 그 값을 확인하고, 자원을 사용하는 동안에는 그 값을 변경함으로써 다른 세마포어 사용자들이 기다리도록 해야한다.
C) Mutex Vs Semaphore
-
가장 큰 차이점은 관리하는 동기화 대상의 개수
- Mutex 는 동기화 대상이 오직 하나뿐일 때, Semaphore 는 동기화 대상이 하나 이상일 때 사용한다.
-
여러개의 Mutex 로 Semaphore 를 구현할 수 있고, 값이 1 인 Semaphore 가 Mutex 다.
-
Mutex 의 경우 Mutex 를 소유하고 있는 스레드가 이 Mutex 를 해제할 수 있다. 하지만 Semaphore 의 경우 이러한 Semaphore 를 소유하지 않는 스레드가 Semaphore 를 해제할 수 있다.
-
Semaphore 는 시스템 범위에 걸쳐있고 파일시스템상의 파일 형태로 존재하는 반면, Mutex 는 프로세스 범위를 가지며 프로세스가 종료될 때 자동으로 Clean up 된다.