대기중인 프로세스를 FIFO큐에 넣고 기다린 순서대로 깨우는 것이다.
if(S > 0)
S--;
else 이 프로세스의 실행을 대기시킨다. FIFO 큐의 tail에 넣는다.
if(이 세마포를 대기중인 프로세스가 있다)
큐의 head에 있는 프로세스를 깨운다.
else S++;
이전 포스트에서 언급한 세마포이다.
while(S <= 0);
S--;
S++
spinlock이라고도 하는데 lock을 기다리는 동안 context swtich가 없으며 짧은 시간동안 수행할 때는 spinlock이 유용하다. 하지만 spinlock은 CPU를 낭비해서 멀티프로세스 시스템에서는 유용하다. (lock은 공유자원으로 볼 수 있다.)
이 세마포를 해결하는 것으로 Blocked set과 위에서 언급한 Blocked-queue가 있다.
.
.
.
.
세마포를 공평성 측면에서 분류를 하면 Strongly-fair semaphore와 Weakly-fair semaphore가 있다.
Strongly-fair semaphore
blocked-queue semaphore가 Strongly-fair semaphore 중 하나이다. 공평성이 세다는 것은 만약 세마포가 무한정으로 Signal, V한다면 결국 모든 대기 프로세스가 끝날 것이라는 말이다. 또, 만약 프로세스가 무한정으로 요청을 한다면 결국 임계영역에 들어갈 것이라는 말이다.
Weakly-fair semaphore
busy-wait semaphore가 Weakly-fair semaphore 중 하나이다. 만약 세마포가 0보다 큰 값이라면 결국 모든 대기중인 프로세스가 완료될 것이다. 또, 만약 프로세스가 임계영역에 진입하려는 것을 계속 시도한다면 결국 들어가게 될 것이다.