Semaphore

세마포어 허가 수

세마포어는 정수 값과 대기 queue로 여러 실행 흐름의 통과를 제어한다. mutex처럼 하나만 막을 수도 있고, 제한된 자원 개수를 표현할 수도 있다.

01

허가 의미 결정

세마포어 값이 남은 buffer 칸인지, 채워진 item 수인지, 진입권인지 먼저 이름 붙인다.

02

wait 순서를 배치한다

생산자-소비자에서는 empty, full, mutex의 wait/signal 순서가 deadlock과 race를 좌우한다.

03

대기자를 깨운다

signal은 값을 올리는 것뿐 아니라 잠든 실행 흐름이 다시 조건을 확인할 기회를 준다.

Binary
상호 배제 값이 1이면 진입 가능, 0이면 대기한다.
mutex와 유사하지만 소유권 규칙이 다를 수 있다.
Counting
자원 개수 buffer slot, connection pool처럼 여러 허가를 표현한다.
값의 의미를 문서화한다.
Producer
empty 기다림 빈 칸이 있어야 item을 넣을 수 있다.
full signal과 짝이다.
Consumer
full 기다림 채워진 item이 있어야 꺼낼 수 있다.
empty signal로 되돌린다.

초기값 · 순서 · 짝 점검

초기값 세마포어 초기 값이 실제 자원 개수와 맞는가.
순서 wait와 signal 순서가 deadlock을 만들지 않는가.
허가를 얻은 모든 경로가 결국 돌려주는가.

생산자 소비자

producer: wait(empty); wait(mutex); put(); signal(mutex); signal(full)
consumer: wait(full); wait(mutex); get(); signal(mutex); signal(empty)