세마포어 (Semaphore) / 뮤텍스 (Mutex) 의 이해

OS 2019. 8. 22. 23:30 posted by TechNote.kr


세마포어 (Semaphore) 

 

다중 프로세스 혹은 다중 쓰레드 간에 발생할 수 있는 교착 상태 (Deadlock) 에 대한 해법

(모든 교착 상태에 대한 해법을 제시하지는 못하지만 고전적인 해법 중 하나)

 

기본적으로 상호 배제 알고리즘 (Mutual Exclusion) 기반 세마포어는 원자적(atomic)으로 제어되는 정수 변수로 프로세스간 접근할 수 있기 위해 프로세스 외부에 존재한다. 


Counting semaphore

 

Semaphore S : 

 정수값을 가지는 변수로 P 와 V 라는 동작(operation)에 의해서만 접근할 수 있다. 세마포어 S는 현재 사용 가능한 자원 (resource)의 수를 의미한다. 이에 0 이면 접근 가능한 자원이 없는 것을 의미한다. 

 

P Operation : 임계 구역에 들어가기 전에 수행하는 동작

 세마포어에 의해 보호되는 자원이 사용 가능할 때 까지 waste time 하거나 sleep 을 한다.

 S != 0 이면 S = S - 1 을 한 후 자원을 사용한다. S == 0 이라면 모든 자원이 사용 중임으로 S 가 1 이상의 값이 될 때 까지 대기한다. 

 

V Operation : 임계 구역에서 나올 때 수행하는 동작

 S = S + 1 을 하여 자원이 사용 가능한 상태가 되었음을 나타낸다.

 

 

Binary semaphore

 

0 이나 1을 값으로 가지는 세마포어이다. (locked / unlocked 로 사용될 수도 있다.)

 

 변수값을 수정하는 연산은 모두 원자성을 만족해야 한다. (즉, 한 프로세스 또는 쓰레드에서 세마포어 값을 수정하는 동안 다른 포르세스가 동시에 이 값을 변경해서는 안된다. )

 


뮤텍스 (Mutex, Mutual exclusion 의 약자) 

 

 다중 쓰레드의 임계 구역을 제어하기 위한 목적으로 사용된다. 

lock / unlock 동작으로 구분한다. 

 

 

Semaphore 는 mutex 용도로 사용될 수 있지만 mutex는 semaphore 용도로 사용할 수 없다.