세마포어 (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 용도로 사용할 수 없다. |
'OS' 카테고리의 다른 글
하이퍼바이저 (hypervisor) 의 이해 (0) | 2019.09.16 |
---|---|
CRLF / LF / CR 에 대한 이해 (0) | 2019.08.20 |