1. 程式人生 > >作業系統 同步互斥題目

作業系統 同步互斥題目

互斥問題:

(一)   圖書館有100個座位,每位進入圖書館的讀者要在登記表上登記,退出時要在登記表上登出。要幾個程式?有多少個程序?

答:一個程式;為每個讀者設一個程序

思路:先找到互斥的關係,當多個人來的時候,服務檯只能為一個人進行登記或者是登出操作,所以需要為服務檯的登記和登出操作設一個互斥量。至於100個作為如何安排是不重要的,我們只要關係能否讓人進來就行。

這個時候就有兩種情況:

(1) 當圖書館已經有100人了,當第101個人來時,他可以選擇排隊等待。

       這種情況下,可以這樣寫程式碼

      

設訊號量 s=100,代表可用座位
設訊號量 M =1 ,代表當前服務檯是否在使用,M=1表示沒有人再用

登記程式碼:
P(s)  // s--
P(M) // 保證互斥,這個時候,應該不能有其他人蔘與服務檯
登記

V(M) //恢復 
閱讀

登出程式碼:
P(M)
登出
V(M)
V(s)

(2) 當圖書館人滿以後,第101個人不再等待,直接離開

          

設 count =100,此時count 只是單純的計數,不再做互斥訊號量
設訊號量M=1 ,意義和前面相同

這次不同的是當 count==0時,應該直接renturn
 
P(M)
if(count==0)
{
     V(M);
     return;
}

count-=1;
登記
V(M)

閱讀

P(M)
登出
count++;
V(M)

return ;

(二)  有一座東西方向的獨木橋;用P,V操作實現:

1       每次只允許一個人過橋;

2       當獨木橋上有行人時,同方向的行人可以同時過橋,相反方向的人必須等待。

3       當獨木橋上有自東向西的行人時,同方向的行人可以同時過橋,從西向東的方向,只允許一個人單獨過橋。(此問題和讀者與寫者問題相同,東向西的為讀者,西向東的為寫者)。

解: 1. 直接設一個M=1,即可實現互斥

            P(M)

             過橋

           V(M)

       2. 幾個關鍵點:(1)東西互斥,需要設定一個訊號量

                                   (2)   只有當東方的人數為0,時,西方才能進入(反之亦然),所以需要分別設定計數值

                                   (3)   同一時間點,只能一個個按順序進入,所以兩邊各設定一個管理進出的訊號量

             

東西方互斥 Mux=1
從東向西的管理訊號量 MD=1
從西向東的管理訊號量 MX=1
從東向西的人數 NumD=0
從西向東的人數NumX=0

下面寫從東向西的程式碼

P(MD)
if(NumD==0) //一開始NumD==0,所以進入判斷Mux的值就行
{
     P(Mux)
}
NumD++;
V(MD)
過橋

P(MD)
NumD--
if(NumD==0)
{
    V(Mux)  //當東到西的人數為0時,可以讓西到東方向通過人
}
V(MD)


下面寫從西向東的程式碼

P(MX)
if(NumX==0) //一開始NumD==0,所以進入判斷Mux的值就行
{
     P(Mux)
}
NumX++;
V(MX)
過橋

P(MX)
NumX--
if(NumX==0)
{
    V(Mux)  //當東到西的人數為0時,可以讓西到東方向通過人
}
V(MX)

3. 從東到西和第二問的一樣,從西到東呢,和第1問一樣

(三) 有一個俱樂部,有甲乙兩個服務員,當顧客有請求時,甲負責送煙,乙負責送火,無顧客請求時,服務員睡眠。顧客自己不能帶煙和火,當顧客要抽菸時,可請求服務員送煙和火,煙和火還未送到時,顧客必須等待。

思路方式:考慮事件是怎麼開始的,事件是怎麼結束的,不同物件,都給它一個程序。

兩組互斥關係: 1. 是否請求了送煙或送火請求。 2. 煙是否能抽(煙是否送達)

  設訊號量:SX表示是否有請求送煙請求,SY表示是否有送火請求,DX表示煙有沒有送達,DY表示火有沒有送達。

甲服務員

P(SX)
送煙
V(DX)



乙服務員
P(SY)
送火
V(DY)


顧客
V(SX)
V(SY)
等待
P(DY)
P(DX)
抽菸

(四)有一個超市,最多可容納N個人進入購物,當N個顧客滿員時,後到的顧客在超市外等待;超市中只有一個收銀員。可以把顧客和收銀員看作兩類程序,兩類程序間存在同步關係。寫出用P;V操作實現的兩類程序的演算法(2003年系統設計員考試的題目)

分析:對於顧客來說,它關心的是,有沒有空位能讓他進去,還有當前服務員是否在為別人服務(當前能不能出去)

         對於服務員來說,它關心的是,當前有沒有人想出來

設 s表示是否有顧客要出去,c表示當前服務員是否空閒
s=0,c=0
num=n,表示剩下的位置個數

顧客

P(num)
進去
V(s)
P(c)
出去
V(num)


服務員

P(s)
收銀
V(c)

(五)一家四人父、母、兒子、女兒圍桌而坐;桌上有一個水果盤;

1  當水果盤空時,父親可以放香蕉或者母親可以放蘋果,但盤中已有水果時,就不能放,父母等待。當盤中有香蕉時,女兒可吃香蕉,否則,女兒等待;當盤中有蘋果時,兒子可吃,否則,兒子等待。

分析:放東西是一個互斥量,至於吃東西,各有各的分工,所以在分別設兩個訊號量就行。

Mux表示到盤裡是否有東西
X表示是否有香蕉
Y表示是否 有 蘋果
Mux=1,表示空盤,x=y=0,表示啥都沒有

父親:

P(Mux)
放香蕉
V(X)


母親

P(Mux)
放蘋果
V(Y)


女兒
P(X)
拿香蕉
V(Mux)
吃


兒子

P(Y)
拿蘋果
V(Mux)
吃

2 把(1)改為:兒子要吃蘋果時,請母親放蘋果,女兒要吃香蕉時,請父親放香蕉,(還是盤子為空時才可以放)。

   分析:相對於第1問,只要在加上請求蘋果和請求香蕉的訊號量就行。

Mux=1
qx=0,qy=0
sx=0,sy=0;

女兒:
v(qx)
p(sx)
拿香蕉
v(Mux)
吃

兒子
v(qy)
p(sy)
拿蘋果
v(Mux)
吃


父親
p(qx)
剝香蕉

p(Mux)
放香蕉
v(sx)

母親

p(qy)
銷蘋果
p(Mux)
放蘋果
v(sy)

(六)一個盒子,內有黑白兩種棋子(數量相等),甲每次從盒子中取出一顆黑子,乙每次從盒子中取出一顆白子,一人取了棋子後,必須等另一方取過棋子方可再取,(可假設甲先取)。

設訊號量:SJ=1,SY=0

 

REPEAT

P(SJ)

取一顆黑子

V(SY)

UNTIL 盒子中無黑子

REPEAT

P(SY)

取一顆白子

V(SJ)

UNTIL 盒子中無白子

 

(七)有一個理髮店,店內共有20個座位供顧客等待理髮,(進入理髮店的顧客,都在此座位上等待理髮,正在理髮的顧客不佔用此座位),當20個座位坐滿了,後到的顧客不等待,立即回家。當沒有顧客時,理髮師睡眠等待。

解:設訊號量:S=0.C=0,MUTEX=1
	設整型變數  SM=20
	
理髮師
REPEAT
P(S) -------如無顧客,理髮師等待
V(C)     叫一個顧客理髮
理髮
UNTIL FALSE


顧客
P(MUTEX)
IF (SM=0)
{	V(MUTEX)――――滿座,離開,回家
	RETURN
ELSE
SM=SM-1―――――空座位數減 1
V(MUTEX)
}
V(S)――――――――通知理髮師,增加了一個顧客,如理髮師在等待則喚醒他
P(C) ———————等理髮師叫自己理髮
P(MUTEX)
SM=SM+1―――――被叫到,釋放一個空的座位
V(MUTEX)
接受理髮

 

總結:做同步互斥問題,第一步應該是想清楚,每個個體應該負責的事情,其次在分析存在哪些同步,互斥量。