久久99精品久久久久久琪琪,久久人人爽人人爽人人片亞洲,熟妇人妻无码中文字幕,亚洲精品无码久久久久久久

進程同步與互斥練習

時間:2019-05-15 13:19:08下載本文作者:會員上傳
簡介:寫寫幫文庫小編為你整理了多篇相關的《進程同步與互斥練習》,但愿對你工作學習有幫助,當然你在寫寫幫文庫還可以找到更多《進程同步與互斥練習》。

第一篇:進程同步與互斥練習

進程同步與互斥

練習題

選擇題

1.任何兩個并發進程之間存在著()的關系。

A.各自完全獨立

B.擁有共享變量

C.必須互斥

D.可能相互制約

2.并發進程執行的相對速度是()。

A.由進程的程序結構決定的B.由進程自己來控制的C.在進程被創建時確定的D.與進程調度策略有關的3.并發進程執行時可能會出現“與時間有關的錯誤”,這種錯誤是由于并發進程()引起的。

A.使用共享資源

B.執行的順序性

C.要求計算時間的長短

D.程序的長度

4.并發進程中與共享變量有關的程序段稱為()。

A.共享子程序

B.臨界區

C.管理區

D.公共數據區

5.用來實現進程同步與互斥的PV操作實際上是由()過程組成的。

A.一個可被中斷的B.一個不可被中斷的C.兩個可被中斷的D.兩個不可被中斷的6.進程從運行態變為等待態可能由于()。

A.執行了V操作

B.執行了P操作

C.時間片用完

D.有高優先級進程就緒

7.用PV操作管理互斥使用的資源時,信號量的初值應定義為()。

A.任意正整數

B.1

C.0

8.用P、V操作管理臨界區時,互斥信號量的初值應定義為()。

A.任意值

B.1

C.0

D.-

19.現有n個具有相關臨界區的并發進程,如果某進程調用P操作后變為等待狀態,則調用P操作時信號量的值必定為()。

A.≤0

B.1

C.n-1

D.n

10.用PV操作管理臨界區時把信號量的初值定義為1,現已有一個進程在臨界區,但有n個進程在等待進人臨界區,這時信號量的值為()。

A.-1

B.1

C.-n

D.n

11.用V操作喚醒一個等待進程時,被喚醒進程的狀態應變成()狀態。

A.執行

B.就緒

C.運行

D.收容

12.進程間的同步是指進程間在邏輯上的相互()關系。

A.聯接B.制約

C.繼續D.調用

多項選擇題

1.有關并發進程的下列敘述中,()是正確的。

A.任何時刻允許多個進程在同一CPU上運行

B.進程執行的速度完全由進程自己控制

C.并發進程在訪問共享資源時可能出現與時間有關的錯誤

D.同步是指并發進程中存在的一種制約關系

E.各自獨立的并發進程在執行時不會相互影響

2.一個正在運行的進程調用P(s)后,若S的值為(),則該進程可以繼續運行。

A.S>0

B.S<0

C.S≠0

E.S≤0

判斷題

1.有交往的并發進程一定共享某些資源。()

2.如果不能控制并發進程執行的相對速度,則它們在共享資源時一定會出現與時間有關的錯誤。()

3.并發進程的執行結果只取決于進程本身,不受外界影響。()

4.多道程序設計必然導致進程的并發執行。()

有m個進程共享同一臨界資源,若使用信號量機制實現對資源的互斥訪問,則信號量值的變化范圍是________________。

對于兩個并發進程,設互斥信號量為mutex,若mutex=0,則________

A 表示沒有進程進入臨界區B 表示有一個進程進入臨界區

C表示有一個進程進入臨界區,另一個進程等待進入

D 表示有兩個進程進入臨界區

設系統中有n(n>2)進程,且當前不在執行進程調度程序,試考慮下述4種情況哪種不能發生:

A沒有運行進程,有2個就緒進程,n-2個進程處于等待狀態。

B有1個運行進程,沒有就緒進程,n-1個進程處于等待狀

C有1個運行進程,有1個就緒進程,n-2個進程處于等待狀態

D有1個運行進程,有n-1個就緒進程,沒有進程處于等待狀態

設有一個作業由四個進程組成,這四個進程在運行時必須按圖所示的順序,用P、V原語操作表達四個進程的同步關系。

應用題

設系統中只有一臺打印機,有三個用戶的程序在執行過程中都要使用打印機輸出計算結果。設每個用戶程序對應一個進程。問:這三個進程間有什么樣的制約關系?試用P、V操作寫出這些進程使用打印機的算法。

判斷下面的同步問題的算法是否正確?若有錯,請指出錯誤原因并予以改正

(1)設A、B兩進程共用一個緩沖區Q,A向Q寫入信息,B則從Q讀出信息,算法框圖如圖所示。

設A、B為兩個并發進程,它們共享一臨界資源。其運行臨界區的算法框圖如圖所示。

某套裝服裝廠有甲乙兩個制作室和一個配套室。兩個制作室分別生產上衣和褲子,每制作一件上衣或褲子后制作室工人都要分別把它們送到配套室的衣架F1和褲架F2上,衣架F1上存放上衣,褲架F2上存放褲子,衣架最多能放50件上衣,褲架最多能放50條褲子。配套室工人每次從架上取一件上衣和一條褲子,然后將它們配成套裝,并進行包裝。為防止操作出錯,甲制作室工人及配套室工人對衣架F1的存取動作應互斥進行,乙制作室工人及配套室工人對褲架F2的存取動作應互斥進行。用P、V原語進行正確管理,分別描述甲制作室工人、乙制作室工人以及配套室工人的工作過程。

解:

(1)設公用信號量mutex1和mutex2控制進程對衣架和褲架的互斥操作

設私用信號量empty1和empty2分別表示衣架和褲架的空位數,full1表示衣架上的衣服數,full2表示褲架上的褲子數

(2)初始化mutex1=1,mutex2=1,empty1=50,empty2=50,full1=0,full2=0

(3)描述:

甲制作室工人工作過程:乙制作室工人工作過程:

L1:生產一件上衣L2:生產一條褲子

P(empty1)P(empty2)

P(mutex1)P(mutex2)

將上衣放到衣架上將褲子放到褲架上

V(mutex1)V(mutex2)

V(full1)V(full2)

Goto L1Goto L2

配套工人工作過程:

L3:P(full1)

P(full2)

P(mutex1)

P(mutex2)

分別取上衣和褲子進行配套

V(mutex1)

V(mutex2)

V(empty1)

V(empty2)

Goto L

3在一個盒子里,混裝了數量相等的黑白圍棋子。現在利用自動分揀系統把黑子、白子分開,設分揀系統有兩個進程P1和P2,其中進程P1揀白子;進程P2揀黑子。規定每個進程一次揀一子,當一個進程在揀時不允許另一個進程去揀,當一個進程揀了一子時,必須讓另一個進程去揀。試寫出進程P1和P2能夠正確并發執行的程序。

設私有信號量S1=1;S2=0

P1(){P2(){

P(S1);P(S2);

揀白子;揀黑子;V(S2);}V(S1);}

有一個倉庫,可存放X、Y兩種產品,倉庫的存儲空間足夠大,但要求:(1)每次只能存入一種產品X或Y,(2)滿足-N

設互斥信號量mutex=1;私有信號量sx=M-1;sy=N-1;

storeX(){storeY(){

P(sx);P(sy);

P(mutex);P(mutex);

將X產品入庫;將X產品入庫;

V(mutex);V(mutex);

V(sy);}V(sx);}

答案

1.D 2.D 3.A 4.B 5.D 6.B 7.B 8.A 9.C 10.B 11.B 12.B 13.A 14.C 15.C 16.D 17.A 18.B

二、多項選擇題

1.[分析]任何一臺CPU在每一時刻只能解釋執行一條指令,因而,不可能在同一時刻為多個進程服務。進程可同時執行的含義是一個進程的工作沒有全部完成之前另一進程就可開始工作。所以,實際上多個進程是輪流占用CPU運行的。到底哪個進程能占用處理器不僅與進程自身有關,且受外界因素的影響;當多個進程競爭CPU時,必須由進程調度來決定當前哪個進程可以占用CPU;故每個進程都是走走停停的,進程執行的速度不能完全由進程自己來控制。

并發進程相互之間可能是無關的,即它們是各自獨立的,這些進程中每一個進程的執行既不依賴于其它進程也不會影響其它進程的執行。但是,有些并發進程需使用共享資源,為保證進程執行的正確性,對共享資源的使用必須加以限制。同步就是并發進程中的一種制約關系,一個進程能否使用共享資源取決于其它進程的消息,只有指定的消息到達才可使用共享資源。如果無約束地使用共享資源,則可能出現多個進程交替地訪問共享資源,于是就可能會出現與時間有關的錯誤。故本題的答案為C、D、E。

[題解]C、D、E。

2.[分析]根據P操作的定義,當調用P操作時, P操作把信號量S減去1,若結果小于0則調用者將等待信號量,否則可繼續運行。因而,若調用P(S)后S的值為>=0則進程可以繼續運行,故應選擇A和D。要注意不能選擇C,因S<>0包含了S>0和S<0,當S<0時進程將成為等待狀態而不能運行。[題解]A,D。

3.[題解]A,C,E。

4.[題解]A,B,C,D,E。

三、判斷題 1.[題解]是。2.[分析]如果不控制并發進程執行的相對速度,則它們在共享資源時可能會出現兩種情況:一種是并發進程交替使用共享資源,這樣就可能會發生與時間有關的錯誤;另一種是并發執行的速度沒有致使它們交替使用共享資源,這時就不會出現與時間有關的錯誤。因而,本題的結論“一定會出現與時間有關的錯誤”是不對的。[題解]否。

3.[分析]所謂防止死鎖是指采用了某種方法后系統一定不會發生死鎖。但是,使用PV操作不一定能防止死鎖,教材中的五個哲學家問題就是例證。所以, PV操作可以防止死鎖的說法是錯誤的。

[題解]否。

4.[分析]如果一個進程單獨執行時,那么執行結果只取決于進程本身,不受外界影響。但多個進程并發執行時,無論是進程本身的原因還是外界的因素都會影響到進程的執行速度。如果并發進程有共享變量且其執行速度造成了它們交替訪問共享變量,那么進程的執行結果可能不惟一。故本題的闡述不確切。[題解]否。

5.[題解]是。

6.[題解]是。

7.[分析]限制共享資源互斥使用后仍可能引起系統死鎖,可舉例說明。例如,教材中五個哲學家問題,采用了PV操作來保證共享資源的互斥使用,但還是發生了循環等待,且這種等待永遠不能結束,引起了死鎖。所以,資源的互斥使用不能保證系統不會死鎖。[題解]否。

8.[分析]若任何一個進程在申請新資源前總是先歸還已得到的資源,則任何進程都不會發生“占有且等待資源”的情況。也就是說,這種資源分配策略能破壞形成死鎖的四個必要條件中的第二個條件,故可防止死鎖。[題解]是。

四、填空題

1.封閉性,可再現性 2.并發進程 3.與時間有關的 4.臨界區

5.P, V

6.競爭(或互斥),協作(或同步)

7.P, V

8.等待信號量,就緒

9.[分析]因規定該資源只能互斥使用,因而信號量的初值應定義為1。當n個進程各調用一次P操作時將使信號量的值為最小。[題解]1,(1-n)或-(n-1)。

10.[分析]由于初值為10,因而調用了18次P操作后的值為(l0-18)=-8。再調用15次V操作的話則信號量的值為(-8+15)=7。「題解」7。

11.send(或發送),receive(或接收)12.發送者的信件,信箱

13.互斥使用資源,循環等待資源 14 死鎖防止,死鎖避免 15.防止

16.靜態分配,按序分配,剝奪式分配 17.不安全 18.銀行家

19.安全

20.處理器,主存儲器 21.循環等待資源 22.靜態

四、填空題

1.封閉性,可再現性 2.并發進程 3.與時間有關的 4.臨界區

5.P, V

6.競爭(或互斥),協作(或同步)

7.P, V

8.等待信號量,就緒

9.[分析]因規定該資源只能互斥使用,因而信號量的初值應定義為1。當n個進程各調用一次P操作時將使信號量的值為最小。[題解]1,(1-n)或-(n-1)。

10.[分析]由于初值為10,因而調用了18次P操作后的值為(l0-18)=-8。再調用15次V操作的話則信號量的值為(-8+15)=7。「題解」7。

11.send(或發送),receive(或接收)12.發送者的信件,信箱

13.互斥使用資源,循環等待資源 14 死鎖防止,死鎖避免 15.防止

16.靜態分配,按序分配,剝奪式分配 17.不安全 18.銀行家

19.安全

20.處理器,主存儲器 21.循環等待資源 22.靜態

第二篇:進程同步典型例題(操作系統)

進程同步練習題

1.在公共汽車上,司機和售票員的工作流程如圖所示。為保證乘客的安全,司機和售票員應密切配合協調工作。請用信號量來實現司機與售票員之間的同步。

司機 售票員 啟動車輛 關車門 正常行車 售票 到站停車 開車門

司機和售票員工作流程圖

① 約束:怎么密切配合協調工作才能保證安全呢?

a)關車門之后再啟動車輛;利用前驅圖解釋 b)到站停車之后再開車門; ② 根據約束定義信號量;

關車門和啟動車輛需要一個信號量進行同步S1;到站停車和開車門之間需要一個信號量進行同步S2; ③ 建立幾個進程呢?

a)為司機建立一個進程Driver; b)為售票員建立一個進程Conductor; Driver:

Repeat

啟動車輛;

正常行駛;

到站停車;

Until false;Conductor:

Repeat 關車門;

售票;

開車門;

Until false;

④ 加入同步關系:

Var s1,s2:semorphore=0,0;

Driver:

Repeat

Wait(s1);

啟動車輛;

正常行駛;

到站停車;

Signal(s2)Until false;Conductor:

Repeat 關車門;

Signal(s1);

售票; Wait(s2)

開車門;

Until false;main(){

Driver();

Conductor();} 2.桌子上有一只盤子,盤子中只能放一只水果。爸爸專向盤子中放蘋果,媽媽專向盤子中放橘子,一個兒子專等吃盤子中的橘子,一個女兒專等吃盤子中的蘋果。用PV操作實現他們之間的同步機制。分析: ①約束:

a)爸爸和媽媽競爭盤子,往盤子放水果,爸爸在放時,媽媽等待,或者相反; b)爸爸和女兒要同步,即爸爸放完蘋果之后通知女兒來吃;同時女兒吃完之后要通知盤子可用;

c)媽媽和兒子要同步,即媽媽放完橘子之后通知兒子來吃;同時兒子吃完之后要通知盤子可用;

② 經上述分析可知:

需要3個信號量:S1表示臨界資源盤子,初值1;爸爸和女兒需要一個信號量進行同步S2=0 媽媽和兒子需要一個信號量進行同步S3=0;③ 建立進程?

爸爸:

媽媽:

女兒:

兒子:

Repeat

repeat

repeat

repeat

取一個蘋果;

取一個橘子;

從盤子取一個蘋果;

從盤子取一個橘子;

放入盤子;

放入盤子

吃蘋果;

吃橘子;

Until false;

Until false;

Until false;

Until false;④ 加入同步關系。

爸爸:

媽媽:

女兒:

兒子:

Repeat

repeat

repeat

repeat

wait(S2);

wait(S3);取一個蘋果;

取一個橘子;

從盤子取一個蘋果;

從盤子取一個橘子;

Wait(S1);

Wait(S1);

signal(S1);

signal(S1);

放入盤子;

放入盤子

吃蘋果;

吃橘子;

Signal(S2);

Signal(S3);

Until false;

Until false;

Until false;

Until false;

3.a,b兩點之間是一段東西向的單行車道,現要設計一個自動管理系統,管理規則如下:(1)當ab之間有車輛在行駛時同方向的車可以同時駛入ab段,但另一方向的車必須在ab段外等待;

(2)當ab之間無車輛在行駛時,到達a點(或b點)的車輛可以進入ab段,但不能從a點和b點同時駛入;

(3)當某方向在ab段行駛的車輛駛出了ab段且暫無車輛進入ab段時,應讓另一方向等待的車輛進入ab段行駛。

請用信號量為工具,對ab段實現正確管理以保證行駛安全。分析: ① 約束:

a)ab兩點的單行車道是一種臨界資源;兩端的車輛對該資源進行競爭; b)同步關系:(1),(3); ② 經上述分析可知:

首先,設置互斥信號量Sab=1,用于a、b點的車輛互斥進入ab段;

然后,分別設置共享變量ab=0用于記錄當前ab段上由a點進入的車輛數量;共享變量ba=0用于記錄當前ab=段上由b點進入車輛的數量;

最后,設置互斥信號量S1=1用于ab段的車輛互斥訪問共享變量ab;設置互斥信號量S2=1用于ba段的車輛互斥訪問共享變量ba ③建立進程?

semaphore S1=1,S2=1,Sab=1;int ab=ba=0;Pab:

pba: Repeat

repeat Wait(S1)

Wait(s2)

abcount=abcount+1;

bacount=bacount+1;if abcount==1 then wait(sab)

if bacount==1 then wait(sab)signal(S1)

signal(s2)進入車道行駛;

進入車道行駛; Wait(s1)

Wait(s2)abcount=abcount-1;

bacount=bacount-1;if abcount==0 then signal(sab)

if bacount==0 then signal(sab)signal(s1)

signal(s2);

until false;

until false;main(){

Pab();

Pba();}

5.一條河上架設了由若干個橋墩組成的一座橋。若一個橋墩只能站一個人,過河的人只能沿著橋向前走而不能向后退。過河時,只要對岸無人過,就可以過。但不允許河對岸的兩個人同時過,以防止出現死鎖。請給出兩個方向的人順利過河的同步算法。分析: ① 約束:

a)橋屬于臨界資源,兩岸的人對該資源進行競爭;

b)橋上的人數是有限制的,設這個橋由N個橋墩構成,橋上同時只能有N個人過橋,其它人要進行等待。相當于共享資源數。

② 設置信號量

信號量s:互斥使用橋,初值為1 變量count1:方向1上過河人計數器 變量count2:方向2上過河人計數器

信號量scount1:對方向1上過河人計數器count1的互斥使用,初值為1 信號量scount2:對方向2上過河人計數器count2的互斥使用,初值為1 信號量scount:代表橋上過河人的計數信號量,初值為橋墩個數N ③ 建立進程

Semaphore s, scount1, scount2, scount;int count1, count2;s=1;scount1=1;scount2=1;scount=N;count1=0;count2=0;

void direct1(int i){ wait(scount1);count1++;if(count1==1)

wait(s);signal(scount1);

wait(scount);

上橋,過橋,下橋; signal(scount);

wait(scount1);count1--;if(count1==0)

signal(s);signal(scount1);}

void direct2(int i){ wait(scount2);count2++;if(count2==1)

wait(s);signal(scount2);

wait(scount);上橋,過橋,下橋; signal(scount);

wait(scount2);count2--;if(count2==0)

signal(s);signal(scount2);}

main(){

cobegin{

direct1(1);

direct1(n);

direct2(1);

direct2(m);

} } 6.有一個倉庫,可以存放A和B兩種產品,但要求:(1)每次只能存入一種產品(A或B);

(2)-N<A產品數量-B產品數量<M。其中,N和M是正整數。試用同步算法描述產品A與產品B的入庫過程。分析: ① 約束:

a)倉庫是一種臨界資源,兩種產品為之競爭;

b)A產品數量不能比B產品數量多M個以上即A產品數量比B產品數量最多多M-1個;A產品數量不能比B產品數量少N個以上即B產品數量比A產品最多多N-1個。② 設置信號量

設置互斥信號量mutex互斥使用倉庫; 設置兩個信號量來控制A、B產品的存放數量,sa表示當前允許A產品比B產品多入庫的數量(當前允許A產品入庫數量); sb表示當前允許B產品比A產品多入庫的數量(當前允許B產品入庫數量)。

初始時,sa為M一1,sb為N一1。當往庫中存放入一個A產品時,則允許存入B產品的數量也增加1;當往庫中存放入一個B產品時,則允許存入A產品的數量也增加1。

③ 建立進程

semaphore mutex=1,sa=M-1,sb=N-1;process puta(){ while(1)

{ 取一個產品;

wait(sa);wait(mutex);將產品入庫;

signal(mutex);signal(sb);}

} process putb(){ while(1)

{ 取一個產品;

wait(sb);wait(mutex);將產品入庫;

signal(mutex);signal(sa);

} } main(){ cobegin{ puta();putb();} }

4.將只讀數據的進程稱為“讀者”進程,而寫或修改數據的進程稱為“寫者”進程。允許多個“讀者”同時讀數據,但不允許“寫者”與其他“讀者”或“寫者”同時訪問數據。另外,要保證:一旦有“寫者”等待時,新到達的“讀者”必須等待,直到該“寫者”完成數據訪問為止。試用P、V操作正確實現“讀者”與“寫者”的同步。(第二類讀者寫者問題,信號量解決方法)

分析: ① 約束:

a)寫者與寫者之間需要互斥訪問;

b)讀者與寫者之間需要互斥;(有一個讀者在讀就讓寫者等待),因此,此時需要一個計數變量記錄讀者的數量。c)允許多個讀者同時讀數據;

d)一旦有“寫者”等待時,新到達的“讀者”必須等待,直到該“寫者”完成數據訪問為止。

② 建立進程 Write: Repeat 執行讀操作 Until false;Read: Repeat 執行寫操作; Until false;③ 設置信號量

a)設置互斥信號量mutex=1實現寫者與寫者之間的互斥訪問; Write: Repeat

Wait(mutex)

執行讀操作;

Signal(mutex);Until false;

b)實現讀者與寫者之間的互斥,設置整型變量readcount=0記錄讀者數量,if readcount==1 then wait(mutex)Read: Repeat readcount++;if(readcount==1)wait(mutex);

執行讀操作;

readcount--;if(readcount==0)signal(mutex);

until false;由于readcount 是共享變量,所以讀者之間要互斥訪問,因此設置一個互斥信號量rmutex=1.Read: Repeat Wait(rmutex)readcount++;if(readcount==1)wait(mutex);signal(rmutex)執行讀操作; Wait(rmutex)readcount--;if(readcount==0)signal(mutex);signal(rmutex)until false;

c)要想實現d)的互斥,需讓讀者和寫者再共享一個互斥信號量s,因此設置互斥信號量s=1,一旦有寫者等待時,就wait(s)讓讀者等待。Write: Repeat wait(wmutex);writecount++;if(writecount==1)wait(s);signal(wmutex);

Wait(mutex)

執行讀操作;

Signal(mutex);

wait(wmutex);writecount--;if(writecount==0)signal(s);signal(wmutex);

Until false;Read:

Repeat

Wait(s);Wait(rmutex)readcount++;if(readcount==1)wait(mutex);signal(rmutex)signal(s);執行讀操作; Wait(rmutex)readcount--;if(readcount==0)signal(mutex);signal(rmutex)until false;

④ 完整代碼 Process reader(){ while(1)

{ wait(s);wait(rmutex);if(readcount==0)wait(mutex);readcount++;signal(rmutex);signal(s);

perform read operation;

wait(rmutex);readcount--;if(readcount==0)signal(mutex);signal(rmutex);} } Process writer(){ while(1)

{ wait(wmutex);writecount++;

if(writecount==1)wait(s);signal(wmutex);

wait(mutex);perform write operation;signal(mutex);

wait(wmutex);writecount--;if(writecount==0)signal(s);signal(wmutex);} } Main(){ cobegin

{ reader();

writer();

} }

1、在公共汽車上,司機和售票員的工作流程如圖所示。為保證乘客的安全,司機和售票員應密切配合協調工作。請用信號量來實現司機與售票員之間的同步。

司機 售票員 啟動車輛 關車門 正常行車 售票 到站停車 開車門

司機和售票員工作流程圖

【答案】

設置兩個資源信號量:S1、S2。S1表示是否允許司機啟動汽車,其初值為0;S2表示是否允許售票員開門,其初值為0.semaphoere S1=S2=0;void Driver(){

while(1)

{

wait(S1);

啟動車輛;

正常行車;

到站停車;

signal(S2);

} } void Busman(){

while(1)

{

關車門;

signal(S1);

售票;

wait(S2);

開車門;

}

} main(){

cobegin{

Driver();

Busman();

} } 2.桌子上有一只盤子,盤子中只能放一只水果。爸爸專向盤子中放蘋果,媽媽專向盤子中放橘子,一個兒子專等吃盤子中的橘子,一個女兒專等吃盤子中的蘋果。用PV操作實現他們之間的同步機制。

【答案】

信號量S用來實現盤子的互斥訪問,S1表示盤子中蘋果個數,S2表示盤子中橘子的個數。

semaphore S=1,S1=S2=0;void father(){

while(1)

{

準備蘋果;

wait(S);

將蘋果放在盤子內;

signal(S1);

} } void mother(){

while(1)

{

準備橘子;

wait(S);

將橘子放在盤子內;

signal(S2);

} } void daughter(){

while(1)

{

wait(Sl);

從盤子里拿走蘋果;

signal(S);

吃蘋果;

} } void son(){

while(1)

{

wait(S2);

從盤子里拿走橘子;

signal(S);

吃橘子;

} } main(){

cobegin{

father();

mother();

daughter();

son();

} }

3.a,b兩點之間是一段東西向的單行車道,現要設計一個自動管理系統,管理規則如下:(1)當ab之間有車輛在行駛時同方向的車可以同時駛入ab段,但另一方向的車必須在ab段外等待;

(2)當ab之間無車輛在行駛時,到達a點(或b點)的車輛可以進入ab段,但不能從a點和b點同時駛入;

(3)當某方向在ab段行駛的車輛駛出了ab段且暫無車輛進入ab段時,應讓另一方向等待的車輛進入ab段行駛。

請用信號量為工具,對ab段實現正確管理以保證行駛安全。【答案】

此題是讀者-寫者問題的變形。設置3個信號量S1、S2和Sab,分別用于從a點進入的車互斥訪問共享變量ab(用于記錄當前ab段上由a點進入車輛的數量),從b點進入的車互斥訪問共享變量ba(用于記錄當前ab段上由b點進入車輛的數量)和a、b點的車輛互斥進入ab段。3個信號量的初值分別為1、1和1,兩個共享變量ab和ba的初值分別為0、0。

semaphore S1=1,S2=1,Sab=1;int ab=ba=0;void Pab(){

while(1)

{

wait(S1);

if(ab==0)

wait(Sab);

ab=ab+1;

signal(S1);

車輛從a點駛向b點;

wait(S1);

ab=ab-1;

if(ab==0)

signal(Sab);

signal(S1);

} } void Pba(){

while(1)

{

wait(S2);

if(ba==0)

wait(Sab);

ba=ba+1;

signal(S2);

車輛從b點駛向a點;

wait(S2);

ba=ba-1;

if(ba==0)

signal(Sab);

signal(S2);

} } main(){

cobegin{

Pab();

Pba();

} }

4.將只讀數據的進程稱為“讀者”進程,而寫或修改數據的進程稱為“寫者”進程。允許多個“讀者”同時讀數據,但不允許“寫者”與其他“讀者”或“寫者”同時訪問數據。另外,要保證:一旦有“寫者”等待時,新到達的“讀者”必須等待,直到該“寫者”完成數據訪問為止。試用P、V操作正確實現“讀者”與“寫者”的同步。(第二類讀者寫者問題,信號量解決方法)

【答案】

為了使寫者優先,可在原來的讀優先算法的基礎上增加一個互斥信號量s,初值為1,使得當至少有一個寫者準備訪問共享對象時,它可以使后續的讀者進程等待;

整型變量writecount,初值為0,用來對寫者進行計數;

互斥信號量wmutex,初值為1,用來實現多個寫者對writecount進行互斥訪問。Process reader(){ while(1)

{ wait(s);wait(rmutex);if(readcount==0)wait(mutex);readcount++;signal(rmutex);signal(s);

perform read operation;

wait(rmutex);readcount--;if(readcount==0)signal(mutex);signal(rmutex);

} } Process writer(){ while(1)

{ wait(wmutex);if(writecount==0)wait(s);writecount++;signal(wmutex);

wait(mutex);perform write operation;signal(mutex);

wait(wmutex);writecount--;if(writecount==0)signal(s);signal(wmutex);} } Main(){ cobegin

{ reader();

writer();

} }

5.一條河上架設了由若干個橋墩組成的一座橋。若一個橋墩只能站一個人,過河的人只能沿著橋向前走而不能向后退。過河時,只要對岸無人過,就可以過。但不允許河對岸的兩個人同時過,以防止出現死鎖。請給出兩個方向的人順利過河的同步算法。

【答案】

信號量s:互斥使用橋,初值為1 信號量scount1:對方向1上過河人計數器count1的互斥使用,初值為1 信號量scount2:對方向2上過河人計數器count2的互斥使用,初值為1 信號量scount:代表橋上過河人的計數信號量,初值為橋墩個數N 變量count1:方向1上過河人計數器

變量count2:方向2上過河人計數器 Semaphore s, scount1, scount2, scount;int count1, count2;s=1;scount1=1;scount2=1;scount=N;count1=0;count2=0;

void direct1(int i){ wait(scount1);if(count1==0)

wait(s);count1++;signal(scount1);

wait(scount);

上橋,過橋,下橋; signal(scount);

wait(scount1);count1--;if(count1==0)

signal(s);signal(scount1);}

void direct2(int i){ wait(scount2);if(count2==0)

wait(s);count2++;signal(scount2);

wait(scount);上橋,過橋,下橋; signal(scount);

wait(scount2);count2--;if(count2==0)

signal(s);signal(scount2);} main(){

cobegin{

direct1(1);

direct1(n);

direct2(1);

direct2(m);

} }

6、有一個倉庫,可以存放A和B兩種產品,但要求:(1)每次只能存入一種產品(A或B);(2)-N<A產品數量-B產品數量<M。其中,N和M是正整數。試用同步算法描述產品A與產品B的入庫過程。

【答案】

A產品的數量不能比B產品的數量少N個以上,A產品的數量不能比B產品的數量多M個以上.

設置兩個信號量來控制A、B產品的存放數量,sa表示當前允許A產品比B產品多入庫的數量(當前允許A產品入庫數量),即在當前庫存量和B產品不入庫的情況下,還可以允許sa個A產品入庫;

sb表示當前允許B產品比A產品多入庫的數量(當前允許B產品入庫數量),即在當前庫存量和A產品不入庫的情況下,還可以允許sb個B產品入庫。

初始時,sa為M一1,sb為N一1。當往庫中存放入一個A產品時,則允許存入B產品的數量也增加1;當往庫中存放入一個B產品時,則允許存入A產品的數量也增加1。

semaphore mutex=1,sa=M-1,sb=N-1;process puta(){ while(1)

{ 取一個產品;

wait(sa);wait(mutex);將產品入庫;

signal(mutex);signal(sb);}

} process putb(){ while(1)

{ 取一個產品;

wait(sb);wait(mutex);將產品入庫;

signal(mutex);signal(sa);

} } main(){ cobegin{ puta();putb();} }

第三篇:新版進程同步典型例題(操作系統)

進程同步練習題

1.在公共汽車上,司機和售票員的工作流程如圖所示。為保證乘客的安全,司機和售票員應密切配合協調工作。請用信號量來實現司機與售票員之間的同步。

司機 售票員 啟動車輛 關車門 正常行車 售票 到站停車 開車門

司機和售票員工作流程圖

2.桌子上有一只盤子,盤子中只能放一只水果。爸爸專向盤子中放蘋果,媽媽專向盤子中放橘子,一個兒子專等吃盤子中的橘子,一個女兒專等吃盤子中的蘋果。用PV操作實現他們之間的同步機制。

3.a,b兩點之間是一段東西向的單行車道,現要設計一個自動管理系統,管理規則如下:(1)當ab之間有車輛在行駛時同方向的車可以同時駛入ab段,但另一方向的車必須在ab段外等待;

(2)當ab之間無車輛在行駛時,到達a點(或b點)的車輛可以進入ab段,但不能從a點和b點同時駛入;

(3)當某方向在ab段行駛的車輛駛出了ab段且暫無車輛進入ab段時,應讓另一方向等待的車輛進入ab段行駛。

請用信號量為工具,對ab段實現正確管理以保證行駛安全。

4.將只讀數據的進程稱為“讀者”進程,而寫或修改數據的進程稱為“寫者”進程。允許多個“讀者”同時讀數據,但不允許“寫者”與其他“讀者”或“寫者”同時訪問數據。另外,要保證:一旦有“寫者”等待時,新到達的“讀者”必須等待,直到該“寫者”完成數據訪問為止。試用P、V操作正確實現“讀者”與“寫者”的同步。(第二類讀者寫者問題,信號量解決方法)

5.一條河上架設了由若干個橋墩組成的一座橋。若一個橋墩只能站一個人,過河的人只能沿著橋向前走而不能向后退。過河時,只要對岸無人過,就可以過。但不允許河對岸的兩個人同時過,以防止出現死鎖。請給出兩個方向的人順利過河的同步算法。6.有一個倉庫,可以存放A和B兩種產品,但要求:(1)每次只能存入一種產品(A或B);

(2)-N<A產品數量-B產品數量<M。其中,N和M是正整數。試用同步算法描述產品A與產品B的入庫過程。

1、在公共汽車上,司機和售票員的工作流程如圖所示。為保證乘客的安全,司機和售票員應密切配合協調工作。請用信號量來實現司機與售票員之間的同步。

司機 售票員 啟動車輛 關車門 正常行車 售票 到站停車 開車門

司機和售票員工作流程圖

【答案】

設置兩個資源信號量:S1、S2。S1表示是否允許司機啟動汽車,其初值為0;S2表示是否允許售票員開門,其初值為0.semaphoere S1=S2=0;void Driver(){

while(1)

{

wait(S1);

啟動車輛;

正常行車;

到站停車;

signal(S2);

} } void Busman(){

while(1)

{

關車門;

signal(S1);

售票;

wait(S2);

開車門;

} } main(){

cobegin{

Driver();

Busman();

} } 2.桌子上有一只盤子,盤子中只能放一只水果。爸爸專向盤子中放蘋果,媽媽專向盤子中放橘子,一個兒子專等吃盤子中的橘子,一個女兒專等吃盤子中的蘋果。用PV操作實現他們之間的同步機制。

【答案】

信號量S用來實現盤子的互斥訪問,S1表示盤子中蘋果個數,S2表示盤子中橘子的個數。

semaphore S=1,S1=S2=0;void father(){

while(1)

{

準備蘋果;

wait(S);

將蘋果放在盤子內;

signal(S1);

} } void mother(){

while(1)

{

準備橘子;

wait(S);

將橘子放在盤子內;

signal(S2);

} } void daughter(){

while(1)

{

wait(Sl);

從盤子里拿走蘋果;

signal(S);

吃蘋果;

} } void son(){

while(1)

{

wait(S2);

從盤子里拿走橘子;

signal(S);

吃橘子;

} } main(){

cobegin{

father();

mother();

daughter();

son();

} }

3.a,b兩點之間是一段東西向的單行車道,現要設計一個自動管理系統,管理規則如下:(1)當ab之間有車輛在行駛時同方向的車可以同時駛入ab段,但另一方向的車必須在ab段外等待;

(2)當ab之間無車輛在行駛時,到達a點(或b點)的車輛可以進入ab段,但不能從a點和b點同時駛入;

(3)當某方向在ab段行駛的車輛駛出了ab段且暫無車輛進入ab段時,應讓另一方向等待的車輛進入ab段行駛。

請用信號量為工具,對ab段實現正確管理以保證行駛安全。【答案】 此題是讀者-寫者問題的變形。設置3個信號量S1、S2和Sab,分別用于從a點進入的車互斥訪問共享變量ab(用于記錄當前ab段上由a點進入車輛的數量),從b點進入的車互斥訪問共享變量ba(用于記錄當前ab段上由b點進入車輛的數量)和a、b點的車輛互斥進入ab段。3個信號量的初值分別為1、1和1,兩個共享變量ab和ba的初值分別為0、0。

semaphore S1=1,S2=1,Sab=1;int ab=ba=0;void Pab(){

while(1)

{

wait(S1);

if(ab==0)

wait(Sab);

ab=ab+1;

signal(S1);

車輛從a點駛向b點;

wait(S1);

ab=ab-1;

if(ab==0)

signal(Sab);

signal(S1);

} } void Pba(){

while(1)

{

wait(S2);

if(ba==0)

wait(Sab);

ba=ba+1;

signal(S2);

車輛從b點駛向a點;

wait(S2);

ba=ba-1;

if(ba==0)

signal(Sab);

signal(S2);

} } main(){

cobegin{

Pab();

Pba();

} }

4.將只讀數據的進程稱為“讀者”進程,而寫或修改數據的進程稱為“寫者”進程。允許多個“讀者”同時讀數據,但不允許“寫者”與其他“讀者”或“寫者”同時訪問數據。另外,要保證:一旦有“寫者”等待時,新到達的“讀者”必須等待,直到該“寫者”完成數據訪問為止。試用P、V操作正確實現“讀者”與“寫者”的同步。(第二類讀者寫者問題,信號量解決方法)

【答案】

為了使寫者優先,可在原來的讀優先算法的基礎上增加一個互斥信號量s,初值為1,使得當至少有一個寫者準備訪問共享對象時,它可以使后續的讀者進程等待;

整型變量writecount,初值為0,用來對寫者進行計數;

互斥信號量wmutex,初值為1,用來實現多個寫者對writecount進行互斥訪問。Process reader(){ while(1)

{ wait(s);wait(rmutex);if(readcount==0)wait(mutex);readcount++;signal(rmutex);signal(s);

perform read operation;

wait(rmutex);readcount--;if(readcount==0)signal(mutex);signal(rmutex);} } Process writer(){ while(1)

{ wait(wmutex);if(writecount==0)wait(s);writecount++;signal(wmutex);

wait(mutex);perform write operation;signal(mutex);

wait(wmutex);writecount--;if(writecount==0)signal(s);signal(wmutex);} } Main(){ cobegin

{ reader();

writer();

} }

5.一條河上架設了由若干個橋墩組成的一座橋。若一個橋墩只能站一個人,過河的人只能沿著橋向前走而不能向后退。過河時,只要對岸無人過,就可以過。但不允許河對岸的兩個人同時過,以防止出現死鎖。請給出兩個方向的人順利過河的同步算法。

【答案】

信號量s:互斥使用橋,初值為1 信號量scount1:對方向1上過河人計數器count1的互斥使用,初值為1 信號量scount2:對方向2上過河人計數器count2的互斥使用,初值為1 信號量scount:代表橋上過河人的計數信號量,初值為橋墩個數N 變量count1:方向1上過河人計數器 變量count2:方向2上過河人計數器 Semaphore s, scount1, scount2, scount;int count1, count2;s=1;scount1=1;scount2=1;scount=N;count1=0;count2=0;

void direct1(int i){ wait(scount1);if(count1==0)

wait(s);count1++;signal(scount1);

wait(scount);

上橋,過橋,下橋; signal(scount);

wait(scount1);count1--;if(count1==0)

signal(s);signal(scount1);}

void direct2(int i){ wait(scount2);if(count2==0)

wait(s);count2++;signal(scount2);

wait(scount);上橋,過橋,下橋; signal(scount);wait(scount2);count2--;if(count2==0)

signal(s);signal(scount2);} main(){

cobegin{

direct1(1);

direct1(n);

direct2(1);

direct2(m);

} }

6、有一個倉庫,可以存放A和B兩種產品,但要求:(1)每次只能存入一種產品(A或B);(2)-N<A產品數量-B產品數量<M。其中,N和M是正整數。試用同步算法描述產品A與產品B的入庫過程。

【答案】

A產品的數量不能比B產品的數量少N個以上,A產品的數量不能比B產品的數量多M個以上.

設置兩個信號量來控制A、B產品的存放數量,sa表示當前允許A產品比B產品多入庫的數量(當前允許A產品入庫數量),即在當前庫存量和B產品不入庫的情況下,還可以允許sa個A產品入庫;

sb表示當前允許B產品比A產品多入庫的數量(當前允許B產品入庫數量),即在當前庫存量和A產品不入庫的情況下,還可以允許sb個B產品入庫。

初始時,sa為M一1,sb為N一1。當往庫中存放入一個A產品時,則允許存入B產品的數量也增加1;當往庫中存放入一個B產品時,則允許存入A產品的數量也增加1。

semaphore mutex=1,sa=M-1,sb=N-1;process puta(){ while(1)

{ 取一個產品;

wait(sa);wait(mutex);將產品入庫;

signal(mutex);signal(sb);}

} process putb(){ while(1)

{ 取一個產品;

wait(sb);wait(mutex);將產品入庫;

signal(mutex);signal(sa);

} } main(){ cobegin{ puta();putb();} }

第四篇:互斥事件(示范教案)

案例4 對互斥事件的教學設計

[設計者] 房之華(江蘇省蘇州大學附屬中學)

設計符合現代教育理念和新課程標準的教學方案,是當前教育探討的熱門話題,而概率又是新增加的高中數學內容,具有一定的難度,學生在學習中會產生許多困惑,為了讓學生能正確地理解并掌握,精心地設計教學方案顯得格外重要.筆者就概率中較難學習的一節內容“互斥事件有一個發生的概率”給出教學方案的一個設計,供大家參考.[課題] 互斥事件有一個發生的概率

[教學目標] 通過探究式教學,使學生能正確地理解并掌握“互斥事件”、“彼此互斥”和“對立事件”等概念,理解并掌握當AB互斥時“事件A+B”的含義及其概率的求法,了解對立事件的概率的和為1的結論,會應用所學知識解決實際問題.通過探究式教學,引導學生學會學習“互斥事件有一個發生的概率”,學會如何觀察、推理和評價,潛移默化地激發學生的情感,使學生形成一種積極的態度和正確的人生價值觀.通過探究式教學,讓學生養成手、口、眼、耳、腦五官并用的良好習慣,強化動作技能的熟練.(點評:教學目標是對教學行動結果的預期.教學目標一般涉及三大領域:認知領域、情感領域和動作領域,認知領域的目標是現代學校教育最重要的領域,根據教學目標是重視學生的學習結果還是過程,教學目標又可分為行為目標和過程目標,我們在確定教學目標時應全方位地加以考慮.)

[教學重點] 互斥事件的概念及其概率的求法

[教學難點] 對立事件與互斥事件的關系,事件A+B的概率的計算方法.[教學模式] 以探究為主導策略的教學模式,“幫助學生發展理智素養和理智技能”.(點評:在探究模式中,大部分時間由教師控制,但仍需要學生積極參與活動,教師的主要任務是為學生的探究活動去精心地創設問題情境,并對學生的探究結果給出客觀性的評價)

[教學程序]

1、創設情境,讓學生的思維“動”起來

[問題1] 在一個盒子內放有10個大小相同的小球,其中有7個紅球,2個綠球,1個黃球.若從盒中摸出1個紅球記為事件A,從盒中摸出1個綠球記為事件B,從盒中摸出1個黃球記為事件C,則事件A、B、C之間存在怎樣的關系(如圖1)?

思考1:如果從盒中摸出1個是紅球,則說明事件A怎么樣?

思考2:如果從盒中摸出的1個球是綠球,即事件B發生,則說明事件A又如何呢? 思考3:通過對1、2的探究你發現了什么?

(點評:以上幾個思考題不能和盤托出,應逐個拋出,并留給學生思維的空間,讓學生的頭腦動起來.)學生展開思維活動,并將探索出來的結論加以歸納概括.[探究結論1] 事件A與B不可能同時發生,這種不可能同時發生的兩個事件叫做互斥事件.同理,事件B與C、事件A與C都是互斥事件.思考4:若事件A、B、C中任何兩個都是互斥事件,則就事件A、B、C彼此互斥,那么,三個以上的事件是否也能存在這樣的關系呢?若能,請你把它推廣到n個事件的情形.(點評:引導學生的思維向縱深發展,由特殊的情形去大膽地猜想一般的情形是否也存在,從而培養學生由特殊到一般的推理思維方式.)

2、廣泛聯想,讓學生的思維“活”起來

為了加深對概念的深刻理解,更清楚地認識事物的本質屬性,迅速地建構起知識的認知結構,教師應引導學生展開廣泛的聯想.(點評:集合是數學中基本概念之一,是聯系中學數學中眾多不同知識的紐帶,當從集合的角度去認識排列、組合和概率時,求排列數、組合數和概率,都可看成一個全集下的某個子集到數的集合的不同的映射,這樣有助于揭示這些概念的本質及其內在聯系,可見廣泛的聯想能讓學生的思維活躍起來.)

[設問1] 聯想集合的知識,想一想,能用集合的知識來解釋互斥事件的概念嗎?若能,請給出互斥事件的集合意義.[聯想與思考] 要求學生在聯想與獨立思考的基礎上開展小組討論,并歸納概括出建立在集合意義上的互斥事件的形象解釋.[探究結論3] 從集合的角度看,幾個事件彼此互斥,是指由各個事件所含的結果組成的集合彼此不相交,即交集是空集,如圖1所示.[設問3] 互斥事件與對立事件存在著怎樣的關系? 學生思考、討論與概括可得如下的探究結論:

[探究結論5] 一般地,兩個事件對立是兩個事件互斥的充分條件,但不是必要條件.[反饋訓練]判別下列每對事件是否是互斥事件:

從一堆產品(其中正品與次品都多于2個)中任取2件,其中:(1)恰有1件次品和恰有2件次品;(2)至少有1件正品和全是次品;(3)至少有1件正品和至少有1件次品;(4)至少有1件次品和全是正品; 先由學生獨立思考與求解,再請一名學生公布所做的答案,讓大家來評判與討論,直至得到正確答案.(點評:及時反饋是檢驗概念掌握情況的有效措施,通過練習來糾正學生對概念理解中的錯誤,從而強化概念的理解與掌握.)

3、變式教學,讓學生的思維“跳”起來 對問題不斷地進行變換,在變換中增加思維的難度,讓學生的思維“跳一跳”才能夠得著,以便培養學生探究與創新的能力.[變換1] 對上面的問題1稍作變形:“若從盒中摸出1個球,得到紅球或綠球的概率是多少?”(點評:經變換后的問題,顯然增加了思維的難度,為了讓學生“跳一跳”能夠得著,有必要把問題加以分解,為問題的解決搭設思維的臺階,本題難在其事件的結果為若干個,而不是單一的.)

為了解答這個問題,我們可以設計系列思考題,從而降低問題的難度.思考1:滿足怎樣的條件,才表示這個事件發生? 思考2:這個事件是否能分解為若干個基本事件? 思考3:若把這個事件記作A+B,則A+B的概率如何求? 引導學生思考與討論,可得出如下結論:

4、注重反思,讓學生的思維“深”下去

解決問題不能只追求得出一個答案,應注重解題后的反思,這樣才能從題海中解脫出來,達到舉一反

三、觸類旁通的功效,才能訓練學生思維的深刻性.例1 某地區的年降水量在下列范圍內的概率如下表所示:

引導學生分析與探究,并讓學生登臺講解,然后引導學生反思,歸納求解的方法與步驟,以及應當注意的問題.[反思1] 設定義過的事件A、B、C、D是彼此互斥的事件組,要結合題意分析清楚互斥的原因;所求事件是關于互斥事件A、B、C、D中兩個或幾個的和的事件,不符合這兩點,就不能運用互斥事件的概率加法公式.[反思2] 解題步驟可歸結為如下四步:

(1)用數學符號來表示問題中的有關事件;(2)判斷各事件間的互斥性;(3)應用概率加法公式進行計算;(4)寫出答案.例2 在20件產品中,有15件一級品,5件二級品,從中取3件,其中至少有1件為二級品的概率是多少?

引導學生分析,求解與反思.[反思1] 當問題所涉及的事件包含若干個事件時,要注意進行合理的分類討論,如:“至少有1件為二級品”可分解為3個事件:示3件全是二級品的事件.[反思2] 在求某些稍復雜的事件的概率時,通常有兩種方法:一是將所求事件的概率化成一些彼此互斥的事件的概率的和,二是先去求此事件的對立事件的概率,前者是直接法,后者為逆向思維法,即間接法.5、學會建構,讓學生的思維得以升華

零散的知識點,不易被人們所接受和記憶,教師要引導學生對所學的內容給予高度的抽象和概括,建構精煉的知識結構的框架,便于記憶和應用.本教案的教學設計試圖依據新課程所倡導的教學理念,注重課程的發生和開發過程,注重師生交往、互動、共同發展的過程,關注學生的發展和情感體驗.參考文獻:

1.陳希平.實驗直觀 抽象 目標 評價 調控.數學通報.2002,6

表示恰有1件為二級品的事件,表示恰有2件為二級品的事件,表2.房之華.對互斥事件的教學設計.數學教學.2004,4 3.傅建明.課堂教學基本技能訓練.杭州大學出版社,1995,11 4.奚定華.數學教學設計.華東師范大學出版社,2001,1 5.徐英俊.教學設計,教育科學出版社,2001.9 6.王書臣,劉長華,蔣永晶.數學新課程教學設計,遼寧師范大學出版社,2002.5 7.張景斌.中學數學教學教程.科學出版社2000,12

第五篇:售票員和汽車司機的進程同步問題

計算機操作系統實驗報告

一、實驗名稱:售票員和汽車司機的進程同步問題

二、實驗內容:創建兩個進程模擬售票員和汽車司機的同步行為。具體內容如下:

1.司機的活動:啟動車輛,正常行車,到站停車。2.售票員活動:關車門,售票,開車門。

3.當發車時間到,售票員關好車門后,司機才能啟動車輛,售票員才開始售票。當到站時,司機停穩車后,售票員才能打開車門,車上乘客先下車,然后站牌乘客上車。

三、問題分析與設計

分析:司機與售票員要協同工作:一方面只有售票員把門關好之后司機才可開車,因此售票員關好門之后要通知司機開車,然后售票;另一方面,也只有司機把車停下之后售票員才能開門讓乘客下車和上車,因此,此時司機應通知售票員。汽車當前正在始發站停車讓乘客讓乘客上車,因此,必須設置一定的信號量來實現他們之間的同步問題。

設計:設置司機與售票員的信號量為全局變量,并且客車的人數:現在人數、下車人數、上車人數為全局變量;設置司機與售票員的線程。考慮到第一站和最后一站的問題,應單獨處理,故在各自的線程中分情況討論:

具體的思路是下面的圖示。其中S1是司機的信號量,S2是售票員的信號量。

程序的實現(代碼): #include #include #include #include #define Total_num 50 //客車的最大容量 #define Total_pork 8 //總的站數 //全局變量

int Recent_num=0;//某一時刻的客車上的人數 int Get_on_num;//上車的人數 int Get_off_num;//下車的人數 int pork=1;//客車到達路線的站數 HANDLE Semaphore_driver;//Driver的信號量 HANDLE Semaphore_conductor;//Conductor的信號量 //產生一定范圍的隨機數,可避免下面程序的判斷是否超出客車的最大容量問題

int Get_random(int min,int max){ int a;srand((int)time(0));while(1){ a=rand()%(Total_num+1);if(a>=min && a<=max)return a;} } //Driver的線程

DWORD WINAPI Thread_Driver(LPVOID Driver){ while(pork<=Total_num){ if(pork==Total_pork){ WaitForSingleObject(Semaphore_driver,INFINITE);printf(“終點站到了,謝謝乘坐該公交車,祝您愉快!n”);printf(“到達終點站時汽車上還有 %d 人。n”,Recent_num);ReleaseSemaphore(Semaphore_conductor,1,NULL);return 0;} else { if(pork==1)printf(“發車時間到,現在是第 %d 站n”,pork);else printf(“ %d 站到了n”,pork);if(pork!=1)printf(“司機已停車。n”);

ReleaseSemaphore(Semaphore_conductor,1,NULL);// 增加信號量

WaitForSingleObject(Semaphore_driver,INFINITE);printf(“已關門,汽車開始行使。n”);ReleaseSemaphore(Semaphore_conductor,1,NULL);} Sleep(1000);} return 0;} //Conductor的線程

DWORD WINAPI Thread_Conductor(LPVOID Conductor){ while(1){ if(pork < Total_pork){

WaitForSingleObject(Semaphore_conductor,INFINITE);if(pork==1){

Get_on_num=Get_random(0,Total_num-Recent_num);printf(“ %d 人已經從該站上車。n”,Get_on_num);Recent_num+=Get_on_num;} else { printf(“售票員請開門讓乘客上下車!n”);Get_off_num=Get_random(0,Recent_num);printf(“%d人從第 %d 站下車。n”,Get_off_num,pork);Sleep(1000);//避免了時間的問題帶來的不是隨機數的現象

Recent_num-=Get_off_num;Get_on_num=Get_random(0,Total_num-Recent_num);printf(“%d人從該第 %d 站上車。n”,Get_on_num,pork);Recent_num+=Get_on_num;} printf(“此時車上共有:%d人n”,Recent_num);printf(“上車或下車完畢,售票員請關門!n”);ReleaseSemaphore(Semaphore_driver,1,NULL);

WaitForSingleObject(Semaphore_conductor,INFINITE);printf(“現在售票員開始售票。n”);printf(“nnnn”);pork++;} if(pork==Total_pork){ ReleaseSemaphore(Semaphore_driver,1,NULL);

WaitForSingleObject(Semaphore_conductor,INFINITE);printf(“售票員請開門讓乘客下車!n”);return 0;} Sleep(1000);} return 0;} //主函數 int main(){ HANDLE Driver;HANDLE Conductor;

Semaphore_driver=CreateSemaphore(NULL,0,1,“semaphore_driver”);//創建Driver的信號量

Semaphore_conductor=CreateSemaphore(NULL,0,1,“semaphore_conductor”);//創建Conductor的信號量

Driver=CreateThread(NULL,0,Thread_Driver,&Driver,0,NULL);//創建Driver的線程

Conductor=CreateThread(NULL,0,Thread_Conductor,&Conductor,0,NULL);//創建Conductor的線程

CloseHandle(Driver);//關閉Driver的線程 CloseHandle(Conductor);//關閉Conductor的線程 //GetLastError();while(1);system(“pause”);return 0;}

程序執行結果:

實驗心得與反思:

通過本次實驗,加深了我們對進程同步與互斥的理解,而且懂WaitForSingleObject函數的作用,它相當于P操作;而ReleaseSemaphore函數相當于V操作,用這兩個函數來實現P,V操作,以改變信號量的值,從而實現進程同步。實驗過程中,我們發現以下是我們應該反思的:

1:線程的創建的函數的參數的理解還不太懂,主要是沒學過,對于其中的一些調用函數不太懂里面的意思。

2:線程的設計要考慮到各個情況,第一站和最后一戰,還有其中的全局的變量的運算的放到的是售票員的線程中,也就是其中的一些操作的位置問題,要考慮到同步的兩個線程之間的關系。3:關于信號量的問題,其要的是全局變量。

4:最最重要的是一些Win32 API 中的庫函數有關線程的創建等的理解,對其中的函數參量的理解有待進一步學習理解。

09信管(2)班

何美西 109253030212 樊麗彬 109253030215 孔娜 109253030218

下載進程同步與互斥練習word格式文檔
下載進程同步與互斥練習.doc
將本文檔下載到自己電腦,方便修改和收藏,請勿使用迅雷等下載。
點此處下載文檔

文檔為doc格式


聲明:本文內容由互聯網用戶自發貢獻自行上傳,本網站不擁有所有權,未作人工編輯處理,也不承擔相關法律責任。如果您發現有涉嫌版權的內容,歡迎發送郵件至:645879355@qq.com 進行舉報,并提供相關證據,工作人員會在5個工作日內聯系你,一經查實,本站將立刻刪除涉嫌侵權內容。

相關范文推薦

    九年級道德與法治上冊第3單元推進政治文明第6課建設法治中國第1框感受法治進程同步練習北師大版

    感受法治進程 1.中國特色社會主義法治體系不包括( ) A.完備的法律規范體系 B.高效的法治實施體系 C.周到的法律服務體系 D.完善的黨內法規體系 2.下列哪個原則不是我們在推進......

    操作系統課程設計--基于Windows進程互斥實現機制

    學生姓名:班 學 號:193121 指導教師:袁國斌 中國地質大學計算機學院 2013年 12 月 4 日 操作系統課程實驗報告 實習題目:基于Windows進程互斥實現機制 【需求規格說明】 基于Mic......

    一般過去時 與練習

    一般過去時專項練習 一般過去時 1.一般過去時表示過去某個時間發生的動作或存在的狀態,常和表示過去的時間狀語連用。一般過去時也表示過去經常或反復發生的動作感謝。 2.Be動......

    整理與練習4

    整理與練習3 教學內容:開展“探索與實踐”和“評價反思”,完成書本第35頁第8、9題。 教學目標: 1、在實際操作中再次感受長方體和正方體頂點和棱的特征。 2、使學生進一步體會......

    廉頗與藺相如練習

    《廉頗藺相如列傳》復習學案 1、字音 繆公避匿 繆賢 湯鑊 雖駑 肉袒盆缶澠池 詐佯列觀皆靡 傳舍甚倨不懌衣褐睨柱 2.通假字 欲予秦,秦城恐不可得。 君不如肉袒伏斧質請罪。......

    第四章思考與練習

    第四章 思考與練習一、判斷題 1.法規和規章都是規范化、制度化管理的文書,二者只是叫法不同,都是一回事。( × ) 2.規章制度是國家行政機關針對企事業單位制定的,國家公務員......

    標點符號與病句練習

    標點符號與病句一、常見標點錯誤:1今天去呢?還是明天去呢?我實在是拿不定主意。2“大橋就要通車了,”他環視了一下會場說:“請大家咬緊牙關,作最后的沖刺。”3昨天開校會,校長宣布:......

    政治與生活練習

    《政治與生活》第二單元檢測題 班級1.長期以來,一些地方已經養成了一種邏輯:政府行為只要代表公共利益,就是天然合法的,甚至可以無所約束,無所顧忌。上述邏輯是錯誤的,這是因為 A......

主站蜘蛛池模板: 亚洲综合熟女久久久40p| 欧美人与动牲交app视频| 亚洲一区av无码专区在线观看| 性欧美欧美巨大69| 麻豆亚洲av成人无码久久精品| 日本sm/羞辱/调教/捆绑视频| 色综合伊人色综合网站| 国产亚洲精品第一综合麻豆| 国产高清一国产av| www插插插无码免费视频网站| 三年在线观看免费大全下载| 精品久久久久久久久久久国产字幕| 精品福利视频一区二区三区| 狠狠色丁香婷婷亚洲综合| 国产成人午夜福利免费无码r| 亚洲中文字幕无码一区二区三区| 午夜免费男女aaaa片| 日本免费更新一二三区不卡| 亚洲国产成人久久综合下载| 国产精品久久久久久久久久久久午衣片| 亚洲国产精品一区二区成人片不卡| 精品无码一区在线观看| 无套内射无矿码免费看黄| 久在线中文字幕亚洲日韩| 免费久久99精品国产自在现线| 亚洲国产精品成人精品无码区在线| 久久精品久久久久久噜噜| 国产精品天天狠天天看| 亚洲熟女少妇一区二区| 少妇厨房愉情理伦bd在线观看| 亚洲欧洲av无码专区| 精品无码综合一区二区三区| 亚洲精品国产第一综合99久久| 老女人老熟女亚洲| 亚洲人成网站观看在线播放| 国产喷水1区2区3区咪咪爱av| 国模无码视频一区| 成人区精品一区二区不卡av免费| 日本无码人妻波多野结衣| 福利100合集 在线播放| 欧美裸体xxxx极品|