1. 程式人生 > >現代作業系統 第六章 死鎖 習題

現代作業系統 第六章 死鎖 習題

Chapter 06 死鎖 習題


知識點小記

  1. 從死鎖中恢復:1.利用搶佔恢復2.利用回滾恢復3.通過殺死程序恢復;
  2. 安全狀態:即使所有程序突然請求對資源的最大需求,也仍然存在某種排程次序能夠使得每一個程序執行完畢。 不安全狀態:任何分配資源實力的序列都無法保證工作的完成。 安全狀態和不安全狀態的區別是:從安全狀態出發,系統能夠保證所有程序都能完成;而從不安全狀態出發,就沒有這樣的保證。
  3. 死鎖預防:
  • 破壞互斥條件:一 切都使用假離線技術 。實現可能性較小,思路是避免分配那些不是絕對必須的資源;
  • 破壞佔有並等待條件: 在開始就請求全部資源
     。一種實現方法是一次性分配請求所需的全部資源(資源利用率低);另一種方法是,當一個程序請求資源時,先暫時是放棄當全佔用的所有資源,然後再嘗試一次獲得所需的全部資源;
  • 破環不可搶佔條件: 搶佔資源
  • 破壞環路等待條件: 對資源按序編號 。將所有資源統一編號,程序可以在任何時刻提出資源請求,但是所有請求必須按照資源編號的順序提出,按此規則資源分配途中肯定不會出現環;(變種)取消必須按升序請求資源的限制,而僅僅要求不許程序請求比當前所佔有資源編號低的資源。
  1. 通訊死鎖協同同步的異常情況; 資源死鎖競爭性同步的問題。
  2. 活鎖
    指的是任務或者執行者沒有被阻塞,由於某些條件沒有滿足,導致一直重複嘗試—失敗—嘗試—失敗的過程。處於活鎖的實體是在不斷的改變狀態,活鎖有可能自行解開。

1.給出一個由策略產生的死鎖的例子。

A:在美國,考慮總統選舉,三個或更多的候選人正在爭取某個政黨的提名。初選結束後,當代表們到達黨的選舉大會時,可能沒有候選人獲得多數票,也沒有任何代表願意改變自己的投票。這是一個死鎖。每個候選人都有一些資源(選票),但需要更多的選票才能勝出。在議會中有多個政黨的國家,每個政黨都支援不同版本的年度預算,但無法通過召集多數黨來通過預算。這也是一個死鎖。


2.學生們在機房的個人計算機上將自己要列印的檔案傳送給伺服器,伺服器會將這些檔案暫存在它的硬碟上。如果伺服器磁碟空間有限,那麼,在什麼情況下會產生死鎖?這樣的死鎖應該怎樣避免?

A:磁碟緩衝區是有限的資源。每一個新到達的任務都需要請求更多的資源。如果具備10MB的緩衝空間,如何10個2MB的任務的一半到來,磁碟緩衝區將會填滿,沒有更多的空間可以儲存,就會發生一個死鎖。死鎖可以通過讓一個任務在緩衝區填滿之前就開始列印,並且在列印完成後釋放空間。這樣一來,任務實際上會列印完成,然後下一個可以做同樣的事情。如果在緩衝區被填滿前,任務還不能開始列印,死鎖是可能的。


3.在前一題中,哪些資源是可搶佔的,哪些資源是不可搶佔的?

A:印表機不可搶佔,磁碟空間可搶佔。


4.在圖6-1中,資源釋放的順序與獲得的順序相反,以其他的順序釋放資源能否得到同樣的結果?

A:可以,沒有區別。


5.一個資源死鎖的發生有四個必要條件(互斥使用資源、佔有和等待資源、不可搶佔資源和環路等待資源)。舉一個例子說明這些條件對於一個資源死鎖的發生不是充分的。何時這些條件對一個資源死鎖的發生是充分條件?

A:假設有三個程序A,B和C和兩種資源型別R和S。並假設有一個R的例項和兩個S的例項。考慮下面的場景:A請求R並得到它;B請求S並得到它;C請求S並得到它(有兩個S例項);B請求R但被阻塞;A請求S被阻塞。在這個階段四條件都成立。但是,沒有發生死鎖。當C完成時,S的一個例項被釋放到分配給A。現在A可以完成執行然後釋放R,並分配給B,然後B可以完成其執行。如果有每種型別的資源只有一個例項,這4個條件就是充分的。


6.城市街道很容易遇到迴圈阻塞的情況,我們稱之為“僵局”。“僵局”是一個資源死鎖和同步競爭的問題。紐約市的預防演算法稱為“非阻塞盒子”,除非一個交叉路口的後續空間是非阻塞的,否則禁止汽車進入這個交叉路口。這是哪種預防演算法?你能否提供其他的預防演算法來解決“僵局”問題?

A:屬於“破壞佔有並等待條件”,因為我們假設汽車可以在交叉路口後進入街道空間,從而釋放交叉路口。另一種策略可能允許汽車暫時停在車庫裡,釋放出足夠的空間來解決交通堵塞。一些城市有交通管制政策來塑造交通;隨著城市街道變得更加擁擠,交通監督員調整紅燈的設定,以限制進入嚴重擁擠地區的交通。流量越小,資源競爭越少,從而降低了發生交通堵塞的可能性。


7.假設四輛汽車同時從四個不同的方向是向同一個交叉路口,路口的每個拐角處都有一個停車標誌。假設交通規則要求當兩輛汽車同時接近相鄰的停車標誌時,左邊的車必須讓右邊的車先行。那麼當四輛車同時接近停車標誌時,每輛車都會讓右邊的車先行。這是否是一個異常的通訊死鎖?這是否是一個資源死鎖?

A:上述異常情況不是通訊死鎖,因為這些汽車彼此獨立,如果沒有競爭發生,它們會以最小的延遲通過交叉路口。這不是資源死鎖,因為沒有一輛汽車持有另一輛汽車請求的資源。資源預分配或資源搶佔機制也無助於控制這種異常。然而,這種異常是競爭同步的一種,在這種情況下,汽車在迴圈鏈中等待資源,交通限制可能是一種有效的控制策略。為了區別於資源死鎖,這種異常可能被稱為“排程死鎖”。類似的僵局可能會發生在一項法律規定,要求兩列火車合併到一條共享鐵路軌道上,等待另一列火車繼續行駛。請注意,一名警察用訊號通知其中一輛競爭的汽車或火車繼續行駛(而不是其他汽車或火車),可以打破這種停滯狀態,而無需回滾或任何其他開銷。


8.有沒有可能一個資源死鎖涉及一個型別的多個單位和另一個型別的一個單位?如果有可能,請給出一個例子。

A:一個程序可能儲存一種資源型別的一些或所有單元,並請求另一種資源型別,而另一個程序儲存第二種資源,同時請求第一種資源型別的可用單元。如果沒有其他程序可以釋放第一種資源型別的單元,並且資源不能被搶佔或同時使用,則系統處於死鎖狀態。例如,兩個程序都是實際儲存系統中分配的儲存單元。(我們假設不支援頁面或程序的交換,同時支援對記憶體的動態請求。)第一個程序鎖定另一個資源——可能是資料單元。第二個程序請求鎖定的資料並被阻止。第一個過程需要更多記憶體來執行程式碼以釋放資料。假設系統中沒有其他程序可以完成和釋放記憶體單元,則系統中存在死鎖。


9.圖6-3給出了資源分配圖的概念,試問是否存在不合理的資源分配圖,即資源分配圖在結構上違反了使用資源的模型?如果存在,請給出一個例子。

A:是的,不合理的資源分配圖存在。我們指出資源只能由一個程序獲取。從方框代表的資源到圓代表的程序的弧表示程序擁有該資源。因此,一個方框如果指向兩個或兩個以上的圓意味著所有這些程序都持有該資源,這違反了規則。因此,在一個圖中多個弧從一個方框指向不同的圓違反了規則,除非有多個資源的副本。從方框到方框或從圓到圓的弧線也違反規則。


10.考慮圖6-4.假設在圖6-4o中,C請求S而不是請求R,這是都會導致死鎖?假設它同時請求S和R,情況又如何?

A:都不會導致死鎖。


11.假設一個系統中存在一個資源死鎖。舉一個例子說明死鎖的程序集合中可能包括了不在相應的資源分配圖中迴圈鏈中的程序。

A:考慮三個過程A,B和C和兩個資源R和S。假設A等待B持有的S,B等待A持有的S,和C是等待A持有的R。所有這三個程序,A,B和C發生死鎖。然而,只有A和B屬於迴圈鏈。


12.為了控制流量,網路路由器A週期性地向鄰居B傳送訊息,告訴它增加或者減少能夠處理的包的數目。在某個時間點,路由器充斥著流量,因此A向B傳送訊息,通過指定B傳送的資料量(A的視窗大小)為0來告訴它停止傳送流量。流量高峰期過去之後,A向B傳送一個新訊息,通過將A的視窗大小從0增加到一個正數來告訴它重新啟動資料傳輸。但是這條訊息丟失了。如前所述,兩方都不會傳輸資料。這是哪種型別的死鎖?

A:通訊死鎖。可以通過超時並在一段時間後重新發送啟用訊息(增加視窗大小的訊息)來控制(啟發式)。然而,B可能已經收到了原始訊息和重複訊息。如果視窗大小的更新是以絕對值而不是差異給出的,那麼不會有任何傷害。此類訊息上的序列號對於檢測重複也很有效。


13.鴕鳥演算法中提到了填充程序表表項或者其他系統表的可能。能否給出一種能夠使系統管理員從這種狀況下恢復系統的方法?

A:這些資源的一部分只能由管理員擁有的程序保留使用,所以管理員總是可以執行一個shell和程式來評估死鎖並決定哪些程序要被殺死以便系統再次可用。


14.使用6.4.2節中描述的死鎖檢測演算法來說明該系統中存在一個死鎖。並識別在死鎖中的程序。

A:P1和P4會處於死鎖。


15.解釋系統是如何從前面問題的死鎖中恢復的,使用a)搶佔,b)回滾,c)終止程序。

A: 通過搶佔恢復的過程:P2和P3完成後,程序P1可以強制搶佔1個RS3 資源。這將使A =(0 2 1 3 2),並讓程序P4完成。一旦P4完成並釋放其資源P1可能完成。 通過回滾恢復的過程:P1回滾到請求RS3之前的狀態。 通過殺死程序恢復的過程:殺死P1。


16.假設在圖6-6中,對某個i有Cij+Rij>Ej, 這意味著什麼?

A:這個過程需要比系統更多的資源。它沒有可能可以得到這些資源,所以它永遠無法完成,即使沒有其他程序需要任何資源。


17.圖6-8中的所有軌道都是水平的或者垂直的,你能否設想一種情況,使同樣存在斜軌跡的可能。

A:如果系統有兩個或多個CPU,兩個或多個程序可以並行,也會導致斜軌跡。


18.圖6-8所示的資源軌跡模式是否可用來說明三個程序和三個資源的死鎖問題? 如果可以,它是怎樣說明的?如果不可以,請解釋為什麼。

A:可以。在三個維度中考慮。z軸代測量第三程序請求的資源數。


19.理論上,資源軌跡圖可以用於避免死鎖。通過合理的排程,作業系統可避免進人不安全區域。請列舉一個在實際運用這種方法時會帶來的問題。

A:該方法僅能在提前知道資源被請求的確切時刻時才能用於指導排程,但在實踐中,這種情況很少。


20.一個系統是否可能處於既非死鎖也不安全的狀態?如果可以,舉出例子,如果不可以,請證明所有狀態只能處於死鎖或安全兩種狀態之一。

A:有些狀態既不安全也不是死鎖,但是會導致死鎖。例如,假設有四個資源:磁帶,繪圖儀,掃描器和CD-ROM,如下表所示,有三個程序存在競爭。可能存在以下情況: 擁有 需要 可用 A: 2 0 0 0 1 0 2 0 01 2 1 B: 1 0 0 0 0 1 3 1 C: 0 1 2 1 1 0 1 0 這種狀態不是死鎖,因為許多操作還可以發生,例如A仍然可以得到兩臺印表機。但是,如果每個程序請求其剩餘的要求,就會產生死鎖。


21. 仔細考察圖6-11b,如果D再多請求1個單位,會導致安全狀態還是不安全狀態?如果換成C提出同樣請求,情形會怎樣?

A:D再多請求1個單位,還是安全狀態;若C提出同樣的請求,變成不安全狀態。


22.某一系統有兩個程序和三個相同的資源。每個程序最多需要兩個資源。這種情況下有沒有可能發生死鎖?為什麼?

A:該系統不可能發生死鎖。假設每個程序都擁有一個資源。有一個資源是空閒的。任何一個程序可以要求它,並獲得它,在這種情況下,它可以完成和釋放這兩種資源。因此,死鎖是不會發生的。


23.再考慮上一個問題,但現在有p個程序,每個程序最多需要m個資源,並且有r個資源可用。什麼樣的條件可以保證死鎖不會發生?

A:如果程序有m個資源,它可以完成並且不會發生死鎖。因此,最糟糕的情況是每個程序都有m-1個資源,需要另外一個資源。如果剩下一個資源,一個程序可以完成和釋放所有資源,讓其餘的程序完成。因此,避免死鎖的條件為r≥p(m-1)+ 1。


24.假設圖6-12中的程序 A請求最後一臺磁帶機,這一操作會引起起死鎖嗎?

 A:不會,程序D還能完成,當它完成時,它返回足夠的資源以允許程序E(或程序A)完成,等等。


25. 銀行家演算法在一個有m個資源型別和n個程序的系統中執行。當m和n都很大時,為檢査狀態是否安全而進行的操作次數正比於m^a和n^b,a和b的值是多少?

A:將矩陣中的一行與可用資源的向量進行比較,可以進行m次操作,此步驟必須按順序重複n次,以找到可以完成的程序並對其進行標記。因此,按照順序標記一個程序需要進行mn步。對所有n個程序重複該演算法意味著運算元為mn2。因此a = 1和b = 2。


26.一個系統有4個程序和5個可分配資源,當前分配和最大需求如下:

若保持該狀態是安全狀態,x的最小值是多少?

A:需求矩陣如下: 0 1 0 0 2 0 2 1 0 0 1 0 3 0 0 0 0 1 1 1 如果x為0,會立即死鎖。如果x為1,則程序D可以執行完成。完成後,可用的資源為1 1 2 2 1,不幸的是,現在已經死鎖了。如果x為2,程序D執行後,可用資源為1 1 3 2 1,程序C可以執行完成,並返回其資源,可用的資源為2 2 3 3 1,這將允許程序B執行和完成,然後程序A執行並完成。因此,避免死鎖的x的最小值是2。


27.一個消除環路等待的方法是用規則說明一個程序在任意時刻只能得到一個資源。舉例說明在很多情況下這個限制是不可接受的。

A:考慮一個需要將大型檔案從磁帶複製到印表機的過程。因為記憶體量是有限的,整個檔案不能直接複製到這個記憶體,所以該程序必須迴圈遍歷以下語句直到整個檔案被打印出來: 獲取磁帶機 將檔案的下一部分複製到記憶體中(限制記憶體大小) 釋放磁帶機 獲取印表機 從記憶體列印檔案 釋放印表機 這將延長程序的執行時間。此外,由於印表機在每次列印步驟之後被釋放,所以不能保證檔案的所有部分都將被列印在連續的頁面上。


28.兩個程序A和B,每個程序都需要資料庫中的3個記錄1、 2、 3。如果A和B都以1、2、3的次序請求,將不會發生死鎖。但是如果B以3、2、1的次序請求,那麼死鎖就有可能會發生。對於這3種資源,每個程序共有3!(即6)種次序請求,這些組合中有多大的可能可以保證不會發生死鎖?

A:假設程序A以a,b,c的順序請求記錄。如果程序B首先請求a,其中一個程序將獲得a,另一個將阻塞。這種情況總是不會死鎖的,因為贏家現在可以完成而沒有干擾。在其他四種組合中,有些可能導致死鎖,有些可能不會導致死鎖。六種情況如下: a b c無死鎖 a c b無死鎖 b a c可能死鎖 b c a可能死鎖 c a b可能死鎖 c b a可能死鎖 由於六種情況中的四種可能導致死鎖,所以有1/3的機會避免死鎖和2/3的機會導致死鎖。


29.一個使用信箱的分散式系統有兩條 IPC原語:send和receive。receive原語用於指定從哪個程序接收訊息,並且如果指定的程序沒有可用訊息,即使有從其他程序發來的訊息,該程序也等待。不存在共享資源,但是程序由於其他原因需要經常通訊。死鎖會產生嗎?請討論這一問題。

A:會。假設所有的郵箱最初都是空的。現在A傳送訊息到B並等待回覆,B傳送到C並等待回覆,C傳送到A並等待回覆。通訊死鎖的所有條件現在已經滿足了。


30.在一個電子資金轉賬系統中,有很多相同程序按如下方式工作:每一程序讀取一行輸人,該輸入給出一定數目的款項、貸方賬戶、借方賬戶。然後該程序鎖定兩個賬戶,傳送這筆錢,完成後釋放鎖。由於很多程序並行執行,所以存在這樣的危險:鎖定x會無法鎖定y,因為y已被一個正在等待x的程序鎖定。設計一個方案來避免死鎖。在沒有完成事務處理前不要釋放該賬戶記錄。(換句話說,在鎖定一個賬戶時,如果發現另一個賬戶不能被鎖定就立即釋放這個已鎖定的賬戶。)

A:為了避免迴圈等待,使用資源(帳戶)的號碼進行編號。讀取輸入行後,程序首先鎖定較小編號的帳戶,然後在成功鎖定該賬戶後(可能需要等待)再去鎖定另一個帳戶。由於沒有任何程序等待一個編號小於現有賬戶的賬戶,所以永遠不會構成迴圈等待,因此永遠不會發生死鎖。


31.一種預防死鎖的方法是去除佔有和等待條件。在本書中,假設在請求一個新的資源以前,程序必須釋放所有它已經佔有的資源(假設這是可能的)。然而,這樣做會引入這樣的危險性:使競爭的程序得到了新的資源但卻丟失了原有的資源。請給出這一方法的改進。

A:更改請求新資源的語義如下。如果一個程序請求一個新的資源並且該資源是可用的,它就獲取該資源並保持它已經擁有的資源。如果新資源不可用,則該程序所有已經佔有的資源都將被釋放。在這種情況下,死鎖是不會發生的,並且沒有新的資源獲得後原有的資源丟失的危險性。當然這個程序只能工作在資源能夠釋放的情況下(你可以在頁之間釋放掃描器,CD之間釋放CD燒錄機)。


32.算機系學生想到了下面這個消除死鎖的方法。當某一程序請求一個資源時,規定一個時間限。如果程序由幹得不到需要的資源而阻塞,定時器開始執行。當超過時間限時,程序會被釋放掉,並且允許該程序重新執行。如果你是教授,你會給這樣的學生多少分?為什麼?

A:我會給它一個F(失敗)的成績。程序會做什麼?很顯然由於它需要資源,所以它再次詢問並再次阻塞,這不如保持阻塞。事實上,可能會更糟糕的是,系統可能會跟蹤競爭程序等待了多長時間,並將新釋放的資源分配給等待時間最長的程序。通過定期釋放和重新執行,一個程序丟失了它已經等待的時間的記錄。


33.記憶體單元被叫喚去和虛擬記憶體系統搶佔。處理器在分時環境中被搶佔。你認為這些搶佔方法是為了處理資源死鎖還是有其他的目的?它們的開銷有多大?

A:開發虛擬記憶體和分時系統主要是為了幫助系統使用者。虛擬化硬體除了防止死鎖之外,還保護使用者免受預準備需求、資源分配和覆蓋的細節影響。然而,上下文切換和中斷處理的成本相當高。需要專門的暫存器、快取記憶體和電路。僅僅為了防止死鎖,可能不會產生這種成本。


34. 解釋死鎖、活鎖和飢餓的區別。

A:當一組程序被阻塞等待只有該集合中的其他程序可以釋放的事件時,會發生死鎖。另一方面,活鎖中的程序不會被阻塞。相反,它們會繼續檢查永遠不會成立的執行條件是否成立。因此,除了持有的資源之外,活動中的程序繼續消耗寶貴的CPU時間。最後,會發生程序的飢餓,由於存在其他程序以及新的程序流,最終會導致餓死高優先順序的程序。不像死鎖或活鎖,飢餓可以自己終止,例如當具有較高優先順序的現有程序終止並且沒有更高優先順序的新程序到來時。(這裡答案的翻譯有問題,應該是“飢餓是由於存在其他程序以及新進入的程序流,這些程序的優先順序比飢餓的程序高。”,並不是高優先順序的程序被餓死。)


35.假設兩個程序發出查詢命令來改變訪問磁碟的機制,並啟動讀命令。每個程序在執行讀命令之前被中斷,並且發現另外一個程序已經移動了磁碟。它們都重新發出查詢命令,但又同時被對方中斷。這個序列不斷的重複。這是一個資源死鎖還是活鎖?你推薦用什麼方法來解決這個異常。

A:這種停滯狀態是競爭同步的異常,可以通過資源預分配來控制。然而,程序不會被資源阻擋。此外,已經按線性順序請求資源。這種異常不是資源死鎖;這是一個活鎖。資源預分配將防止這種異常。作為一種啟發,如果程序沒有在某個時間間隔內完成,它們可能會超時並釋放資源,然後進入睡眠一段時間,然後再試一次。


36.區域網使用一種叫做CSMA/CD的媒體訪問方法。在這個方法中,站點之間共享一條匯流排,並且能夠感知傳輸媒介以及檢測傳輸和衝突。在乙太網協議中,站點請求共享通道時如果感知到傳輸通道是忙碌的,那麼它們不會傳輸幀。當傳輸結束的時候,等待的站點會繼續傳輸幀。同時傳輸兩個幀會產生衝突。如果站點在檢測到衝突之後立即重複傳輸這些幀,則又會連續地產生衝突。

(a)這是一個資源死鎖還是活鎖?

(b)你能否為這種異常提出一個解決方法?

(c)這種情況下會產生飢餓嗎?

A: (a)這是競爭同步異常。這也是一個活鎖。我們可以稱之為排程活鎖。這不是資源活鎖或死鎖,因為站點不儲存其他人請求的資源,因此不存在儲存資源同時請求其他人的站點的迴圈鏈。這不是通訊死鎖,因為站是獨立執行的,將按順序完成傳輸。” (b)在重傳之前必須等待隨機數量的時隙。每次連續碰撞後,選擇時隙的時間間隔加倍,動態調整以適應繁重的交通負荷。在十六次連續重傳之後,一幀被丟棄。 (c)有可能產生飢餓。因為接入通道是概率性的,並且因為新到達的站點可以在已經重發了幾次的站點之前競爭並被分配通道。


37.一個程式在合作和競爭機制的順序上存在著錯誤,導致消費者程序在阻塞空緩衝區之前就鎖定了互斥量(互斥訊號量)。生產者程序能夠將資料放在空緩衝區上已經喚醒消費者程序之前被阻塞在互斥量上。因此生產者程序和消費者程序都被一直阻塞,生產者程序等待互斥量被解鎖,消費者程序等待生產者程序發出的訊號。這是一個資源死鎖還是通訊死鎖?請提出一種辦法來解決程序之間的控制問題。

A:這種異常不是資源死鎖。雖然程序共享互斥量,即競爭機制,但是資源預分配和死鎖避免方法對於這種死態都是無效的。線性排序的資源也是無效的。事實上,人們可以爭辯說,線性順序可能是問題所在;執行互斥應該是進入前的最後一步,也應該是離開關鍵部分後的第一步。迴圈停滯狀態確實存在,其中兩個程序都等待只能由另一個程序引起的事件。這是通訊死鎖。為了取得進展,如果超時搶佔消費者的互斥量,它將會打破這種僵局。編寫謹慎的程式碼或使用監視器進行互斥是更好的解決方案。


38.Cinderella和Prince要離婚,為分割財產,他們商定了以下演算法。 每天早晨每個人發函給對方律師要求財產中的一項。由於郵遞信件需要一天的時間,他們商定如果發現在同一天兩人請求了同一項財產,第二天他們會發信取消這一要求。他們的財產包括狗Woofer、Woofer的狗屋、金絲雀Tweeter和Tweeter的鳥籠。由於這些動物喜愛它們的房屋,所以又商定任何將動物和它們房屋分開的方案都無效,且整個分配從頭開始。Cinderella和Prince都非常想要Woofer,於是他們分別去度假,並且每人都編寫程式用一臺個人計算機處理這一談判工作。當他們度假回來時,發現計算機仍在談判,為什麼?產生死鎖了嗎?產生飢餓了嗎?請討論。

A:如果兩個程式首先要求Woofer,那麼電腦會無休止的飢餓:請求Woofer,取消請求,請求Woofer,取消請求等。如果其中一個請求狗窩,另一個請求狗,會發生死鎖,雙方會檢測到該死鎖,然後取消,但會在下一個迴圈中重複發生。無論哪種方式,如果兩臺計算機都被程式設計為首先去請求狗或狗屋,那麼飢餓或死鎖就會發生。兩者之間沒有太大的區別。在大多數死鎖問題中,飢餓似乎並不嚴重,因為引入隨機延遲通常會使它不太可能發生,但這種方法在這裡不起作用。


39.一個主修人類學、輔修電腦科學的學生參加了一個研究課題,調查是否可以教會非洲狒拂理解死鎖。他找到一處很深的峽谷,在上邊固定了一根橫跨峽谷的繩索,這樣狒拂就可以攀住繩索越過峽谷。同一時刻,只要朝著相同的方向就可以有幾隻狒狒通過。但如果向東和向西的狒拂同時攀在繩索上那麼會產生死鎖(拂拂會被卡在中間),因為它們無法在繩索上從另一隻的背上翻過去。如果一隻狒拂想越過峽谷,它必須看當前是否有別的狒拂正在逆向通行。利用訊號量編寫一個避免死鎖的程式來解決該問題。不考慮連續東行的狒拂會使得西行的狒拂無限制地等待的情況。

A:

 

40.重複上一個習題,但此次要避免飢餓。當一隻想向東去的狒狒來到繩索跟前,但發現有別的狒狒正在向西越過峽谷時,它會一直等到繩索可用為止。但在至少有一隻狒拂向東越過峽谷之前,不允許再有拂狒開始從東向西越過峽谷。


41.編寫銀行家演算法的模擬程式。該程式應該能夠迴圈檢查每一個提出請求的銀行客戶,並且能判斷這一請求是否安全。請把有關請求和相應決定的列表輸出到一個檔案中。


42.寫一個程式實現每種型別多個資源的死鎖檢測演算法。你的程式應該從一個檔案中讀取下面的輸入:程序數、資源型別數、每種存在型別的資源數(向量E)、 當前分配矩陣C (第一行,接著第二行,以此類推)、需求矩陣R(第一行,接著第二行,以此類推)。你的程式輸出應表明在此係統屮是否有死鎖。如果系統中有死鎖,程式應該打印出所有死鎖的程序id號。


43.寫一個程式使用資源分配圖檢測系統中是否存在死鎖。你的程式應該從一個檔案中讀取下面的輸入:程序數和資源數。對每個程序,你應該讀取4個數:程序當前持有的資源數、它持有的資源的ID、它當前請求的資源數、它請求的資源ID。程式的輸出應表明在此係統中是否有死鎖。如果系統中有死鎖,程式應該打印出所有死鎖的程序id號。