CS

[OS] 세마포어(Semaphore)와 뮤텍스(Mutex)

KJihun 2023. 10. 7. 11:40
728x90

 

세마포어(Semaphore)와 뮤텍스(Mutex)

다중 프로세스 또는 스레드 환경에서 공유된 자원에 대한 접근을 조절하기 위한 동기화 기법

 



세마포어 (Semaphore)

공유 자원에 대한 접근을 여러 프로세스 또는 스레드가 조절하기 위한 방법
   - 주로 특정 리소스의 사용을 관리하고, 동시에 여러 프로세스/스레드가 접근할 수 있는 수를 제한하는 데 사용
   - 일반적으로 0 이상의 값을 가지며, 해당 값은 동시 접근을 허용하는 허용치를 나타낸다.

   - 소유권이 없다(세마포어를 해제할 수 있는 프로세스나 스레드가 다를 수 있다)

   - 공유 자원이 한정되어 있는 상황에서 사용한다(특정 리소스의 최대 동시 접근 허용량을 제어할 때 사용)

   - 상대적으로 많은 오버헤드를 가진다.(정수 카운터 관리 등)
 


작동 방식
   - `P()` (Wait)와 `V()` (Signal) 두 가지 연산을 사용한다.
   - `P()`: 세마포어 값을 감소시키고, 이 값이 0보다 작아질 경우 대기 상태로 전환
   - `V()`: 세마포어 값을 증가시키고, 대기 중인 프로세스나 스레드를 실행 상태로 전환

 

 


 


뮤텍스 (Mutex)

상호 배제(Mutual Exclusion)를 위한 동기화 기법
   - 공유 자원에 대한 접근을 단 하나의 프로세스 또는 스레드에게만 허용하여 데이터의 일관성을 보장
   - 이진 상태를 가지며(Lock, Unlock) 임계 영역이 잠겨있는지 여부를 나타낸다.

   - 소유권을 가진다. 뮤텍스의 상태변화는 한 스레드 또는 프로세스만 가능하다.

   - 공유 자원이 하나이고 여러 프로세스나 스레드가 접근하려고 할 때 임계구역 보호를 위해 사용된다.

   - 세마포어 보다 오버헤드가 적다(이진 상태 체크)


작동 방식
   - 뮤텍스를 소유하고 있는 스레드 또는 프로세스만이 뮤텍스를 해제하거나 잠그는 것이 가능하다.
   - 한 스레드가 뮤텍스를 잠그면, 다른 스레드는 해당 뮤텍스를 얻을 때까지 대기한다.

 

 


 

 

 

세마포어의 값이 1인 경우, 상호 배제를 위한 용도(뮤텍스와 같은 용도)로 사용될 수 있다.

그러나 세마포어가 설계된 목적을 벗어나기 때문에 일반적으로 뮤텍스를 사용하는 것이 더 명확하고 안전하다.
따라서 세마포어를 뮤텍스로 사용하는 것은 가능하지만, 뮤텍스가 상호 배제를 위해 더 적합한 동기화 기법이다.