(轉)關於PV操作理解的例子


P就是請求資源,V就是釋放資源。
  問題1 一個司機與售票員的例子
  在公共汽車上,為保證乘客的安全,司機和售票員應協調工作:
  停車后才能開門,關車門后才能行車。用PV操作來實現他們之間的協調。
  S1:是否允許司機啟動汽車的變量
  S2:是否允許售票員開門的變量
  driver()//司機進程
  {
  while (1)//不停地循環
  {
  P(S1);//請求啟動汽車
  啟動汽車;
  正常行車;
  到站停車;
  V(S2); //釋放開門變量,相當於通知售票員可以開門
  }
  }
  busman()//售票員進程
  {
  while(1)
  {
  關車門;
  V(S1);//釋放開車變量,相當於通知司機可以開車
  售票
  P(S2);//請求開門
  開車門;
  上下乘客;
  }
  }
注意:busman() driver() 兩個不停循環的函數
問題2 圖書館有100個座位,每位進入圖書館的讀者要在登記表上登記,退出時要在登記表上注銷。要幾個程序?有多少個進程?(答:一個程序;為每個讀者設一個進程)
(1) 當圖書館中沒有座位時,后到的讀者在圖書館為等待(阻塞)
(2) 當圖書館中沒有座位時,后到的讀者不等待,立即回家。
解(1 )
設信號量:S=100; MUTEX=1
P(S)
P(MUTEX)
登記
V(MUTEX)
閱讀
P(MUTEX)
注銷
V(MUTEX)
V(S)
解(2)
設整型變量 COUNT=100;
信號量:MUTEX=1;
P(MUTEX);
IF (COUNT==0)
{ V(MUTEX);
RETURN;
}
COUNT=COUNT-1;
登記
V(MUTEX);
閱讀
P(MUTEX);
COUNT=COUNT+1;
V(MUTEX);
RETURN;
問題3 有一座東西方向的獨木橋;用P,V操作實現:
(1) 每次只允許一個人過橋;
(2) 當獨木橋上有行人時,同方向的行人可以同時過橋,相反方向的人必須等待。
(3) 當獨木橋上有自東向西的行人時,同方向的行人可以同時過橋,從西向東的方向,只允許一個人單獨過橋。(此問題和讀者與寫者問題相同,東向西的為讀者,西向東的為寫者)。
(1)解
設信號量 MUTEX=1
P (MUTEX)
過橋
V (MUTEX)
(2)解
設信號量: MUTEX=1 (東西方互斥)
MD=1 (東向西使用計數變量互斥)
MX=1 (西向東使用計數變量互斥)
設整型變量: CD=0 (東向西的已上橋人數)
CX=0 (西向東的已上橋人數)
從東向西:
P (MD)
IF (CD=0)
{P (MUTEX) }
CD=CD+1
V (MD)
過橋
P (MD)
CD=CD-1
IF (CD=0)
{V (MUTEX) }
V (MD)
從西向東:
P (MX)
IF (CX=0)
{P (MUTEX) }
CX=CX+1
V (MX)
過橋
P (MX)
CX=CX-1
IF (CX=0)
{V (MUTEX) }
V (MX)
(3) 解:從東向西的,和(2)相同;從西向東的和(1)相同。
問題4 有一個俱樂部,有甲乙兩個服務員,當顧客有請求時,甲負責送煙,乙負責送火,無顧客請求時,服務員睡眠。顧客自己不能帶煙和火,當顧客要抽煙時,可請求服務員送煙和火,煙和火還未送到時,顧客必須等待。
設信號量:SY, SH,CY,CH:初值都為0
甲服務員
REPEAT
P(SY)
送煙
V(CY)
UNTIL FALSE
乙服務員
REPEAT
P(SH)
送火
V(CH)
UNTIL FALSE
顧客
V(SY)
V(SH)
P(CY)
P(CH)
抽煙
問題5一家四人父、母、兒子、女兒圍桌而坐;桌上有一個水果盤;
(1) 當水果盤空時,父親可以放香蕉或者母親可以放蘋果,但盤中已有水果時,就不能放,父母等待。當盤中有香蕉時,女兒可吃香蕉,否則,女兒等待;當盤中有蘋果時,兒子可吃,否則,兒子等待。
解 設信號量:SE=1 (空盤子);SA=0 (放了蘋果的盤子);SB=0 (放了香蕉的盤子)
父親
REPEAT
剝香蕉
P(SE)
放香蕉
V(SB)
UNTIL FALSE
母親
REPEAT
削蘋果
P(SE)
放蘋果
V(SA)
UNTIL FALSE
兒子
P(SA)
拿蘋果
V(SE)
吃蘋果
女兒
P(SB)
拿香蕉
V(SE)
吃香蕉
(2) 把(1)改為:兒子要吃蘋果時,請母親放蘋果,女兒要吃香蕉時,請父親放香蕉,(還是盤子為空時才可以放)。
(2)解:再增加兩個信號量:SF=0, SM=0
父親
REPEAT
P(SF)
剝香蕉
P(SE)
放香蕉
V(SB)
UNTIL FALSE
母親
REPEAT
P(SM)
削蘋果
P(SE)
放蘋果
V(SA)
UNTIL FALSE
兒子
V(SM)
P(SA)
拿蘋果
V(SE)
吃蘋果
女兒
V(SF)
P(SB)
拿香蕉
V(SE)
吃香蕉
問題6有一個超市,最多可容納N個人進入購物,當N個顧客滿員時,后到的顧客在超市外等待;超市中只有一個收銀員。可以把顧客和收銀員看作兩類進程,兩類進程間存在同步關系。寫出用P;V操作實現的兩類進程的算法(2003年系統設計員考試的題目)
解:設信號量:S=0,C=0 (顧客與收銀員的同步信號量),M=N
收銀員
P(S)
收銀
V(C)
顧客
P(M)
進入店內購物
V(S)
P(C)
V(M)
問題7有一個理發店,店內共有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)
接受理發
如果此題改為:滿座時,顧客等待空座位:則 顧客進程的程序修改如下:
把SM設為信號量 SM=20
顧客
P(SM) ---------------------申請一個座位,無則等待
V(S)――――――――通知理發師,增加了一個顧客,如理發師在等待則喚醒他
P(C) ———————等理發師叫自己理發
V(SM)
接受理發
問題8一個盒子,內有黑白兩種棋子(數量相等),甲每次從盒子中取出一顆黑子,乙每次從盒子中取出一顆白子,一人取了棋子后,必須等另一方取過棋子方可再取,(可假設甲先取)。
解: 設信號量:SJ=1,SY=0

REPEAT
P(SJ)
取一顆黑子
V(SY)
UNTIL 盒子中無黑子

REPEAT
P(SY)
取一顆白子
V(SJ)
UNTIL 盒子中無白子
(八)按要求完成下面的程序。設有三個進程,input進程、compute進程和output進程;它們通過共享一個緩沖區buf的合作關系如下:
(1)input進程每次輸入數據后,把數據送到buf,供compute進程計算和output進程打印;
(2)comput進程每次從buf取出已輸入的可計算的數據進行計算,並當output進程把輸入數據打印完成后,把計算結果送入buf供output進程打印;
(3)output進程每次按順序把buf中的輸入數據和計算結果在打印機上輸出。
解:
設信號量:sa=1,sb=sc=sd=0, 請把能正確實現這三個進程同步關系的P、V 操作的語句填入下面的程序。
procedure input
begin
local data
repeat
get(data);
p(sa);
buf=data;
(1)
V ( sc )
v(sb);
until false
end;
procedure compute
begin
locol data
repeat
(2)
P ( sb )
data=buf;
計算data並把結果保存在data;
(3)
P ( sd )
buf=data;
v(sc);
until false
end;
procedure output
begin
local data
repeat
P(sc)
打印 buf;
(4)
V ( sd )
p(sc)
打印 buf;
v(sa);
until false
end;
5.今有三個進程R、M、P,它們共享一個緩沖區。R負責從輸入設備讀信息,每次讀出一個記錄並把它存放在緩沖區中:M在緩沖區加工讀入的記錄;P把加工后的記錄打印輸出。輸入的記錄經加工輸出后,緩沖區中又可存放下一個記錄。請用P、V操作為同步機構寫出他們並發執行時能正確工作的程序。
答:三個進程共用一個緩沖區,他們必須同步工作,可定義三個信號量:
S1:表示是否可把讀人的記錄放到緩沖區,初始值為1.
S2:表示是否可對緩沖區中的記錄加工,初始值為0.
S3:表示記錄是否加工好,可以輸出,初始值也為0.
三個進程可如下設計:
Begin
S1,S2,S3:semaphore;
S1:=l;S2:=S3:=0;
cobegin
process R
begin 
L1:讀記錄;
P(S1);
記錄存入緩沖區;
V(S2);
goto L1;
end;
process M
begin
L2:P(S2);
加工記錄;
V(S3);
goto L2;
end;
process P
begin
L3:P(S3);
輸出加工后的記錄;
V(S1);
goto L3;
end;
coend;
end.
6.現有4個進程R1,R2,W1,W2,它們共享可以存放一個數的緩沖器B.進程R1每次把從鍵盤上投入的一個數存放到緩沖器B中,供進程W1打印輸出;進程R2每次從磁盤上讀一個數放到緩沖器B中,供進程W2打印輸出。當一個進程把數據存放到緩沖器后,在該數還沒有被打印輸出之前不准任何進程再向緩沖器中存數。在緩沖器中還沒有存入一個新的數之前不允許任何進程加快從緩沖區中取出打印是怎樣才能使這四個進程在並發執行是協調的工作?
答:這四個進程實際上是兩個生產者 R1,R2和兩個消費者 W1,W2.各自生成不同的產品中各自的消費對象去消費,他們共享一個的緩沖器。由於緩沖器只能存放一個數,所以,R1和R2在存放數時必須互斥。而R1和W1、R2和W2之間存在同步。為了協調它們的工作可定義三個信號量:
S:表示能否把數存人緩沖器B,初始值為1.
S1:表示R1是否已向緩沖器存入從鍵盤上讀入的一個數,初始值為0.
S2:表示R2是否已向緩沖器存入從磁盤上讀入的一個數,初始值為0.
Begin
S,S1,S2:semaphore;
S:=1;S1:=S2:=0;
Cobegin
process R1
xl :integer
begin
L1:從鍵盤讀一個數;
x1:=讀入的數;
P(S);
P(S);
B:=xl
V(S1);
goto L1;
end;
process R2
 x2:integer;
begin
L2:從磁盤讀一數;
x2:=讀入的數;
 x2:=讀入的數;
 P(S);
B:=x2;
V(S2);
goto L2;
end;
 process W1
y:integer;
begin
L3:P(S1);
y:=B;
 V(S);
打印y中的數;
goto L3;
end;
process W2
z:integer
 begin
 L4:P(S2);
z:=B;
V(S);
打印z中的數;
 goto L4;
end;
coend;
end.

轉載

http://blog.sina.cn/dpool/blog/s/blog_7121ea680100u3g1.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM