OS Semaphore

세마포어 P/V 순서와 생산자-소비자, 독자-저자 패턴

세마포어는 카운터와 대기 큐로 자원 개수와 진입 순서를 제어하며 P(wait)와 V(signal)의 순서가 정확해야 한다.

01

카운터 초기화

사용 가능한 자원 개수나 빈 버퍼 칸 수를 세마포어 초기값으로 둔다.

count
02

P 연산

진입 전 카운터를 줄이고 음수가 되거나 0이면 대기 큐에서 잠든다.

wait
03

임계 작업

공유 버퍼나 자원에 접근할 때 mutex와 counting semaphore를 조합한다.

critical path
04

V 연산

작업 후 카운터를 늘리고 기다리는 스레드를 깨워 다음 진행을 허용한다.

signal
생산자-소비자
empty, full, mutex 세마포어 조합으로 bounded buffer를 제어한다. P 연산 순서가 틀리면 deadlock이나 overflow가 생긴다.
bounded buffer
독자-저자
여러 reader는 동시에 허용하고 writer는 단독 접근하게 한다. reader 우선 정책은 writer starvation을 만들 수 있다.
fairness policy
Binary
binary semaphore는 mutex처럼 보이지만 소유권 의미가 다를 수 있다. unlock 주체와 priority inheritance 지원 여부를 구분한다.
not always mutex

세마포어 순서 점검

획득 순서 여러 세마포어를 얻는 순서가 모든 코드 경로에서 같다.
해제 보장 예외나 조기 반환에서도 V 연산이 빠지지 않는다.
초기값 empty/full/count 초기값이 실제 버퍼 크기와 일치한다.

Bounded buffer

producer: P(empty) -> P(mutex) -> put -> V(mutex) -> V(full)
consumer: P(full) -> P(mutex) -> get -> V(mutex) -> V(empty)