(操作系統原理·第三章)理髮師問題

問題描述:

理髮店裏有一位理髮師、一把理髮椅和n 把供等候理髮的顧客坐的椅子。如果沒有顧客,理髮師便在理髮椅上睡覺;當一個顧客到來時,它必須叫醒理髮師;如果理髮師正在理髮時又有顧客來到,那麼,如果有空椅子可坐,顧客就坐下來等待,否則就離開理髮店。

分析:

引入3 個信號量和一個控制變量:控制變量waiting 用來記錄等候理髮的顧客數,初值均爲0;信號量customers 用來記錄等候理髮的顧客數,並用作阻塞理髮師進程,初值爲0;信號量barbers 用來記錄正在等候顧客的理髮師數,並用作阻塞顧客進程,初值爲0;信號量mutex 用於互斥,初值爲1。

算法:

var waiting : integer; /*等候理髮的顧客數*/
CHAIRS:integer; /*爲顧客準備的椅子數*/
customers, barbers,mutex : semaphore;
customers := 0; barbers := 0;
waiting := 0; mutex := 1;
procedure barber;
begin
while(TRUE); /*理完一人,還有顧客嗎?*/
P(customers); /*若無顧客,理髮師睡眠*/
P(mutex); /*進程互斥*/
waiting := waiting – 1; /*等候顧客數少一個*/
V(barbers); /*理髮師去爲一個顧客理髮*/
V(mutex); /*開放臨界區*/
cut-hair( ); /*正在理髮*/
end;
procedure customer
begin
P(mutex); /*進程互斥*/
if waiting < CHAIRS /*看看有沒有空椅子*/
begin
waiting := waiting + 1;/* 等候顧客數加1*/
V(customers); /*必要的話喚醒理髮師*/
V(mutex); /*開放臨界區*/
P(barbers); /*無理髮師,顧客坐着養*/
get-haircut( ); /*一個顧客坐下等理髮*/
end;
else V(mutex); /*人滿了,走吧!*/
end.

發佈了28 篇原創文章 · 獲贊 7 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章