동기화 원리
세마포어는 허용 개수를 세는 잠금이다
카운터가 남아 있으면 진입하고, 0이면 대기 큐에서 signal을 기다린다. 핵심은 wait와 signal이 원자적으로 실행되어 카운터가 중간에 깨지지 않는 것이다.
카운터 해석
S = 3
S = 1
S = 0
검사
S가 0보다 큰가
남은 허용 슬롯이 있으면 기다릴 이유가 없다.
wait
카운터 감소 후 진입
공유 자원을 사용하는 동안 슬롯 하나를 점유한다.
대기
S가 0이면 잠듦
CPU를 계속 태우지 않고 깨워 줄 신호를 기다린다.
signal
반납 또는 깨움
카운터를 늘리거나 대기 중인 실행 흐름 하나를 재개한다.
구분 의미 헷갈리기 쉬운 지점
뮤텍스 한 번에 하나만 들어가는 소유 기반 잠금 잠근 실행 흐름이 직접 풀어야 한다.
카운팅 세마포어 N개까지 동시 진입을 허용하는 자원 카운터 데이터베이스 커넥션 풀처럼 개수 제한에 잘 맞다.
바이너리 세마포어 값이 0 또는 1인 세마포어 뮤텍스처럼 보이지만 소유권 의미는 약하다.
원자성
wait와 signal 내부의 카운터 변경은 끊기면 안 된다.
큐 기준
S가 0인 동안 새 진입자는 자원 앞이 아니라 큐에서 대기한다.
신호 용도
상호 배제뿐 아니라 생산자와 소비자 사이의 이벤트 전달에도 쓴다.