세마포어는 허용 개수를 세는 잠금이다

카운터가 남아 있으면 바로 진입하고, 0이면 대기 큐에서 signal을 기다린다. 핵심은 wait와 signal이 카운터를 원자적으로 바꾼다는 점이다.
S는 남은 진입권 수다 S가 0이면 자원 앞에서 버티지 않고 큐에서 잠든다.
카운터가 줄어드는 모습
S = 3
진입 진입 진입
세 실행 흐름까지 바로 통과
S = 1
사용 중 사용 중 진입
마지막 한 자리만 남음
S = 0
대기 대기 대기
signal이 올 때까지 큐에서 잠듦
wait, 남은 슬롯 있음
S > 0S--진입
wait, 슬롯 없음
S = 0큐 대기
signal
반납S++ 또는 1명 깨움
구분 의미 헷갈리기 쉬운 지점
뮤텍스 한 번에 하나만 들어가는 소유 기반 잠금 잠근 실행 흐름이 직접 풀어야 한다.
카운팅 세마포어 N개까지 동시 진입을 허용하는 자원 카운터 데이터베이스 커넥션 풀처럼 개수 제한에 잘 맞다.
바이너리 세마포어 값이 0 또는 1인 세마포어 뮤텍스처럼 보이지만 소유권 의미는 약하다.
원자성 wait와 signal 안의 카운터 변경은 끊기면 안 된다.
큐 기준 S가 0이면 새 진입자는 자원 앞이 아니라 큐에서 대기한다.
신호 용도 상호 배제뿐 아니라 생산자-소비자 이벤트 전달에도 쓴다.