1,敘述程式和程式的主要區別。
解:程式和程式是兩個既有聯絡又有區別的兩個概念,它們的主要區別如下:
(1)程式是指令的有序集合,其本身沒有任何執行的含義,它是一個靜態的概念。而程式是程式在處理機上的一次執行過程,它是一個動態的概念。
(2)程式的存在是永久的。而程式是有生命期的,它因建立而產生,因排程而執行,因得不到資源而暫停,因撤消而消亡。
(3)程式僅是指令的有序集合。而程式則由程式,資料和程式資料塊組成。
(4)程式與程式之間不是一一對應的,即同一個程式同時執行與若干不同的資料集合上,它將屬於若干個不同的程式;而一個程式可以執行多個程式。
2,在測量控制系統中,資料採集任務把所採集的資料送入一單緩衝區;計算任務從該單緩衝區中取出資料進行計算。試寫出利用訊號量機制實現兩者共享單緩衝區的同步演算法。
解:在本題中,應設定兩個訊號量SF SE ,訊號量SF表示快取區中是否有可供列印的計算結果,其初值為0;訊號量SE 用於表示緩衝區有無空位置存放新的資訊,其初值為1。
本題的同步描述如下:
1 semaphore se=1; 2 semaphore sf=0; 3 main() 4 { 5 cobegin 6 get(); 7 compute(); 8 coend 9 } 10 get() 11 { 12 while(採集工作未完成) 13 { 14 採集一個資料; 15 p(se); 16 將資料送入緩衝區中; 17 v(sf) 18 } 19 } 20 compute() 21 { 22 while(計算工作未完成) 23 { 24 p(sf) 25 從緩衝區中取出資料; 26 v(se); 27 進行資料計算; 28 } 29 }
3、下圖給出了四個程式合作完成某一任務的前趨圖,試說明這四個程式間的同步關係,並用p,v操作作描述它。
解:圖說明任務啟動後S1先執行。當S1結束後,S2,S3可以開始執行。S2,S3完成後,S4才能開始執行。為了確保這一執行順利,設3個同步訊號量b2,b3,b4分別表示程式S2,S3,S4是否可以開始執行,其初值均為0。這四個程式的同步描述如下:
1 semaphore b2=0 2 semaphore b3=0 3 semaphore b4=0 4 Main() 5 { 6 Cobegin 7 S1(); 8 S2(); 9 S3(); 10 S4(); 11 Coend 12 } 13 S1() 14 { 15 V(b2); 16 V(b3); 17 } 18 19 S2() 20 { 21 P(b2); . 22 V(b4) 23 } 24 S3() 25 { 26 P(b3) . 27 V(b4) 28 } 29 S4() 30 { 31 P(b4); 32 P(b4); 33 }
4.某系統的程式狀態轉換圖如下圖所示,請說明:
(1) 引起各種狀態轉換的典型事件有哪些?
(2) 當我們觀察系統中某些程式時,能夠看到某一程式產生的一次狀態轉換能引起另一程式作一次狀態轉換,在什麼情況下,當一個程式發生轉換3時能立即引起另一個程式發生轉換1?
(3) 試說明是否會發生下述因果轉換:
2---->1
3---->2
4---->1
解:(1)在本題所給的程式狀態圖中,存在四種狀態轉換.
當程式排程程式從就緒佇列中選取一個程式投入執行引起轉換, 1;
正在執行的程式如因時間片用完而被暫停執行就會引起轉換2;
正在執行的程式因等待的事件尚未發生而無法執行(如程式請求完成I/O)則會引起轉換3;
當程式等待的事件發生時(如I/O完成)則會引起轉換4.
(2) 如果就緒佇列非空,則一個程式的轉換3會立即引起另一個程式的轉換1.這是因為一個程式發生轉換3意味著正在執行的程式由執行狀態變為阻塞狀態1.這時處理機空閒,程式排程程式必然會從就緒佇列選取一個程式並將他投入執行,因此只要就緒佇列非空,一個程式的轉換3能立即引起另一個程式的轉換1.
(3)所謂因果轉換指的是有兩個轉換,一個轉換的發生會引起另一個轉換的發生,前一個轉換稱為因,後一個稱為國,這兩個轉換稱為因果轉換,當然這種因果關係並不是什麼時候都能發生,而是在一定條件下才會發生.
2---->1當程式發生轉換2時,就必然引起另一程式的轉換1.因為當發生轉換2時,正在執行的程式從執行狀態轉變為就緒狀態,程式排程程式必然會從就緒佇列選取一個程式投入執行,即發生轉換1.
3---->2某個程式的轉換3決不可能引起另一程式發生轉換2,這是因為當前執行程式從執行狀態變為阻塞狀態,不可能又從執行狀態轉變為就緒狀態,
4---->1當處理機空閒且就緒佇列為空是,某一程式的轉換4就會引起該程式的轉換1,因為此時從阻塞狀態變為就緒狀態,因而排程程式就會將就緒佇列中的此程式投入執行
5 在單處理機的分時系統中,分配給程式P的時間片用完後,系統進行切換,結果排程到的仍然是程式P,有可能出現上述情形嗎?如果可能請說明理由?
解,有可能出現上述情況。例如,若在程式P時間片用完後,被追回到就緒佇列時,就緒佇列為空,這樣程式P 就是就緒佇列中唯一的一個程式,於是排程程式選種的程式必然是程式P,
又如在按優先順序排程的系統中,就緒佇列按程式優先順序排列,在程式P時間片用完後回到就緒佇列時,若其優先順序高於當前就緒佇列中的其它程式,則它排在就緒佇列之首,從而再次被排程程式選種並投入執行。
6 桌上有一個空盤,允許存放一隻水果。爸爸可向盤中放蘋果,也可以向盤中放橘子,兒子專等吃盤中的橘子,女兒專等吃盤中的蘋果。規定當盤空時只能放一隻水果供吃著取用,請用p,v原語實現爸爸,兒子,女兒三個併發程式的同步。
解,在本題中,應設定三個訊號量S,SO,Sa,訊號量S表示盤子是否為空,
訊號量So表示盤子是否有橘子,訊號量Sa表示盤子是否有蘋果,其初值為0。同步描述如下:
1 semaphore s=1; 2 semaphore sa=0; 3 semaphore so=0; 4 main() 5 { 6 cobegin 7 father(); 8 son(); 9 daughter(); 10 coend 11 } 12 father() 13 { 14 while(1) 15 { 16 p(S) 17 將水果放入盤中: 18 if(放入的是橘子) v(So); 19 else 20 v(Sa); 21 } 22 } 23 son() 24 { 25 while(1) 26 { 27 p(So) 28 從盤子中取出橘子; 29 v(s); 30 吃橘子; 31 } 32 } 33 daughter() 34 { 35 while(1) 36 { 37 p(Sa) 38 從盤子中取出橘子; 39 v(s); 40 吃蘋果; 41 } 42 }
7 (上海交通大學1996年試題)哲學家甲請哲學家乙,丙,丁到某處討論問題,約定全體到齊後開始討論;在討論的間隙四位哲學家進餐,每位進餐是都需要使用刀,叉各一把,餐桌上的佈置如圖2.9所示。請用訊號量及p,v原語操作說明四位哲學家的同步,互斥過程。
解,在本題中,應設定四個訊號量fork1,fork2,knife1,knife2,其初值均為1,分別表示叉1,叉2,刀1,刀2是否可用。同步描述如下:(注意和5位哲學家就餐問題的區分,同時注意每次都是先拿刀後拿叉)
1 semaphore fork1=1; 2 semaphore fork2=1; 3 semaphore knife1=1; 4 semaphore knife2=1; 5 main() 6 { 7 cobegin 8 Pa(); 9 Pb(); 10 Pc(); 11 Pd(); 12 coend 13 } 14 Pa() 15 { 16 while(1) 17 { 18 p(knife1); 19 P(fork1); 20 進餐; 21 V(knife1); 22 V(fork1); 23 討論問題; 24 } 25 } 26 Pb() 27 { 28 while(1) 29 { 30 p(knife2); 31 P(fork1); 32 進餐; 33 V(knife2); 34 V(fork1); 35 討論問題 36 } 37 } 38 Pc() 39 { 40 while(1) 41 { 42 p(knife2); 43 P(fork2); 44 進餐; 45 V(knife2); 46 V(fork2); 47 討論問題; 48 } 49 } 50 Pd() 51 { 52 while(1) 53 { 54 p(knife1); 55 P(fork2); 56 進餐; 57 V(knife1); 58 V(fork2); 59 討論問題 60 } 61 }
8.某資料庫有一個寫程式,多個讀程式,他們之間讀,寫操作的互斥要求是:寫程式正在寫該資料庫時不能有其他程式讀該資料庫,讀程式之間不互斥,可以同時讀該資料庫.請用訊號量P.V操作描述這一組程式的工作程式.
解:在本題中,允許讀程式同時讀資料庫,但寫程式正在寫資料庫時不允許其他程式讀資料庫,也不允許其他程式寫該資料庫.為了解決讀,寫程式之間的同步,應設定兩個訊號量和一個共享變數:讀互斥訊號量rmutex,用於使讀程式互斥地訪問共享變數count,其初值為1;寫互斥訊號量wmutex,用於實現寫程式與讀程式的互斥及寫程式與寫程式的互斥,其初值為1;共享變數count,用於紀錄當前正在讀資料庫的讀程式數目,初值為0.其工作、過程如下:
1 semaphore rmutex=1; 2 semaphore wmutex=1; 3 int count=0; 4 main() 5 { 6 cobegin 7 reader(); 8 writer(); 9 coend; 10 } 11 reader() 12 { 13 while(1) 14 { 15 p(rmutex); 16 if (count==0) p(wmutex); 17 count++; 18 v(rmutex); 19 讀資料庫; 20 p(rmutex); 21 count--; 22 if (count==0) v(wmutex); 23 v(rmutex); 24 } 25 } 26 27 writer() 28 { 29 while (1) 30 { 31 p(wmutex); 32 寫資料庫; 33 v(wmutex); 34 } 35 }
在本題中,要注意對訊號量rmutex意義的理解.rmutex是一個互斥訊號量,用於使讀程式互斥地訪問共享變數count,該訊號量並不表示讀程式的數目,表示讀程式的數目的是共享變數count.當一個讀程式要讀資料庫時,應將讀程式計數count加1;如果此前資料庫無讀程式,還應對寫程式互斥訊號量wmutex做p操作,這樣,若資料庫中無寫程式,則通過p操作阻止寫程式寫,若資料庫有無寫程式,則通過p 操作讓讀程式等待.
9 (華中理工大學1999年試題)設公共汽車上,司機和售票員的活動分別表示是:
司機的活動:啟動車輛;
正常行車;
到站停車;
售票員的活動:
在汽車不斷的到站,停車,行使過程中,這兩個活動有什麼 同步關係?用訊號量及p,v操作實現它們的同步。
解,在汽車行使過程中,司機活動和售票員活動之間的同步關係為:售票員關車門後,向司機發開車訊號,司機接到開始訊號後開始啟動車輛,在汽車正常行使工程中售票員售票,到站時司機停車,售票員在車停後開車門讓乘客上下車。因此司機啟動車輛的動作必須與售票員關車取得同步,售票員開車門的動作也必須與司機停車的動作取得同步,
在本題中,應設定兩個訊號量,S1,S2,S1表示是否允許司機啟動車輛,其初值為0,S2表示是否允許售票員開門,其初值為0。用p,v原語描述如下:
1 semaphore S1=0; 2 semaphore S2=0; 3 main() 4 { 5 cobegin 6 driver(); 7 busman(); 8 coend 9 } 10 11 driver() 12 { 13 while(1) 14 { 15 p(S1); 16 啟動車輛; 17 正常行車; 18 到站停車; 19 V(s2); 20 } 21 } 22 busman() 23 { 24 while(1) 25 { 關車門; 26 v(s1); 27 售票; 28 p(s2); 29 開車門; 30 上下乘客; 31 } 32 }
用p,v操作來控制現實生活中的操作流程是一類常見的試題。這類試題要求解題者能將生活中的控制流程用形式化的方式表達出來。
11.設有一個傳送者程式,其流程圖如圖2.10 所示. S 是用於實現程式同步的訊號量,MUTEX 用於實現程式互斥的訊號量.試問流程圖中的 A B C D 四框中應填寫什麼?假定緩衝區有無限多個, S 和 MUTEX 的初值應為多少?
解:由上述分析可知, A B C D 四框應分別填入:
A框 P(MUTEX)
B框 V(MUTEX)
C框 P(S)
D框 P(MUTEX)
開始時,訊息鏈上沒有可供接收的資訊,所以 S 的初值為0 ;互斥訊號量 MUTEX 的初值應為1.