Sleeping barber
- 최초 등록일
- 2010.12.22
- 최종 저작일
- 2009.04
- 4페이지/ 한컴오피스
- 가격 1,500원
소개글
이발소에는 이발사 한 명, 한 개뿐인 이발용 의자, 그리고 기다리는 속님을 위한 의자 n개가 있다. 손님이 없으면 이발사는 그림과 같이 잠을 잔다. 손님이 오면 이발사는 잠에서 깨어난다. 이발을 하는 동안에 손님이 도착하면 대기용 의자에 앉아 기다리고 이 의자도 차 있으면 이발소를 떠나버린다. 문제는 이발사와 손님이 경쟁조건에 빠지지 않도록 프로그램을 짜는 일이다.
해결책으로는 세 개의 세마포어를 이용한다. 기다리지 않고 바로 이발할 수 있는 손님을 제외하고 기다리는 속님의 수를 계산하는 customers, 손님을 기다리며 쉬고 있는 이발사의 수를 나타내는 barbers(0 또는 1), 그리고 상호배제를 위하여 이용하는 mutex 등이 있다. 그리고 기다리는 손임을 카운트하는 waiting 이란 변수가 필요하다. 물론 이 변수값은 customers의 복사본이다. 이 변수를 갖는 이유는 세마포어의 현재 값을 읽어낼 방법이 없기 때문이다. 이 해결책에서 이발소에 오는 손님은 기다리는 손님을 헤아려야 한다. 만일 의자가 수가 손님의 수보다 여유가 있으면 앉아서 기다리지만, 의자가 모두 차 있으면 이발소를 떠난다.
만일, 여분의 의자가 있으면 정수 변수 waiting을 증가시킨다. 그런 후 세마포어 customers에서 up을 실행한다. 이 시점에서 이발사와 손님은 모두 깨어 있다. 이 손님이 mutex을 해제할 때 이발사는 비로소 이발을 시작한다. 이발이 끝나면 손님은 프로시저를 종료하고 이발소를 떠난다. 앞의 예와는 달리, 이발을 하는 손님은 각각 한 번의 이발을 하기에 루프를 갖지 않는다. 그러나 이발사는 루프에서 다음 손님에 대하여 반복 실행한다. 만약 손님이 없다면 이발사는 또 잠을 자야 한다.
컴파일 실행환경
baci
참고 자료
없음