Semaphore는 여러 프로세스의 접근을 제어하는 동기화 기법이다.
정수 변수와 두 개의 연산을 사용한다.
S: 사용 가능한 자원의 개수 또는 진입 가능 여부를 나타내는 정수 값이다.wait(): 자원을 획득하거나, 자원이 없으면 대기한다.signal(): 자원을 반환하고, 대기 중인 프로세스가 있으면 깨운다.
wait()
signal()
wait(P)
S를 1 감소시키고, S < 0이면 사용할 자원이 없으므로 block한다.
S--;
if(S < 0)
block();
signal(V)
S를 1 증가시키고, S <= 0이면 대기 중인 프로세스가 있으므로 wakeup한다.
S++;
if(S <= 0)
wakeup();
Binary Semaphore
이름에서도 나오듯이 0과 1만 사용해서 관리한다.
S = 1
Mutex와 유사하게 사용한다.
Counting Semaphore
S = N
동시에 N개 프로세스까지 허용한다.
예시는 다음과 같다.
- DB Connection Pool
- Producer Consumer Problem
Semaphore 종류 비교
| 종류 | 값의 범위 | 사용 목적 |
|---|---|---|
| Binary Semaphore | 0 또는 1 | mutex처럼 한 번에 하나만 접근하게 제한한다. |
| Counting Semaphore | 0 이상 정수 | 동시에 여러 개의 동일 자원을 제한된 수만큼 허용한다. |