1. 程式人生 > >作業系統之死鎖的相關概念

作業系統之死鎖的相關概念

一、什麼是死鎖?

死鎖是在多道程式系統中,一組程序中的每一個程序均無限期地等待該組程序中的另一個程序所佔有並且永遠不會釋放的資源。

二 、死鎖產生的原因:

①競爭資源,系統提供的資源數量有限,不能滿足每個程序的需求, 

  如磁帶機、印表機等。只有對不可剝奪資源的競爭 才可能產生死鎖,對可剝奪資源的競爭是不會引起死鎖的。
②多道程式執行時,程序推進順序不合理

例如,併發程序 P1、P2分別保持了資源R1、R2,而程序P1申請資源R2,程序P2申請資源R1時,兩者都 會因為所需資源被佔用而阻塞。

三、產生死鎖的四個必要條件:互斥使用資源、請求和保持資源、不可搶奪資源和迴圈等待資源

四、解決死鎖的方法

(1)死鎖預防

通過設定某些嚴格的限制,破壞產生死鎖的條件(除第一個條件)以防止死鎖的發生,這一方法會導致系統資源利用率較低。

①破壞“不可剝奪”條件②破壞“請求和保持”條件③破壞“迴圈等待條件”

(2)死鎖避免

當程序提出資源申請時系統動態檢測資源分配情況,僅確保系統安全時才把資源分配給程序。

死鎖避免常用的演算法:銀行家演算法。(銀行家演算法有些保守,並且在使用時必須知道每個程序對資源的最大需求量)

銀行家演算法

這是一個著名的避免死鎖的演算法,是由Dijstra首先提出來並加以解決的。 

  [背景知識] 

  一個銀行家如何將一定數目的資金安全地借給若干個客戶,使這些客戶既能借到錢完成要乾的事,同時銀行家又能收回全部資金而不至於破產,這就是銀行家問題。這個問題同作業系統中資源分配問題十分相似:銀行家就像一個作業系統,客戶就像執行的程序,銀行家的資金就是系統的資源。

  [問題的描述]

  一個銀行家擁有一定數量的資金,有若干個客戶要貸款。每個客戶須在一開始就宣告他所需貸款的總額。若該客戶貸款總額不超過銀行家的資金總數,銀行家可以接收客戶的要求。客戶貸款是以每次一個資金單位(如1萬RMB等)的方式進行的,客戶在借滿所需的全部單位款額之前可能會等待,但銀行家須保證這種等待是有限的,可完成的。

  例如:有三個客戶C1,C2,C3,向銀行家借款,該銀行家的資金總額為10個資金單位,其中C1客戶要借9各資金單位,C2客戶要借3個資金單位,C3客戶要借8個資金單位,總計20個資金單位。某一時刻的狀態如圖所示。

C1 2(7)
C2 2(1)
C3 4(4)
餘額2
C1 2(7)
C3 4(4)

餘額4

C1 2(7)
餘額8

餘額10

    (a)

     (b)

     (c)

     (d)

                                       銀行家演算法示意

  對於a圖的狀態,按照安全序列的要求,我們選的第一個客戶應滿足該客戶所需的貸款小於等於銀行家當前所剩餘的錢款,可以看出只有C2客戶能被滿足:C2客戶需1個資金單位,小銀行家手中的2個資金單位,於是銀行家把1個資金單位借給C2客戶,使之完成工作並歸還所借的3個資金單位的錢,進入b圖。同理,銀行家把4個資金單位借給C3客戶,使其完成工作,在c圖中,只剩一個客戶C1,它需7個資金單位,這時銀行家有8個資金單位,所以C1也能順利借到錢並完成工作。最後(見圖d)銀行家收回全部10個資金單位,保證不賠本。那麼客戶序列{C1,C2,C3}就是個安全序列,按照這個序列貸款,銀行家才是安全的。否則的話,若在圖b狀態時,銀行家把手中的4個資金單位借給了C1,則出現不安全狀態:這時C1,C3均不能完成工作,而銀行家手中又沒有錢了,系統陷入僵持局面,銀行家也不能收回投資。

  綜上所述,銀行家演算法是從當前狀態出發,逐個按安全序列檢查各客戶誰能完成其工作,然後假定其完成工作且歸還全部貸款,再進而檢查下一個能完成工作的客戶,......。如果所有客戶都能完成工作,則找到一個安全序列,銀行家才是安全的。

  從上面分析看出,銀行家演算法允許死鎖必要條件中的互斥條件,佔有且申請條件,不可搶佔條件的存在,這樣,它與預防死鎖的幾種方法相比較,限制條件少了,資源利用程度提高了。

這是該演算法的優點。其缺點是:

   〈1〉這個演算法要求客戶數保持固定不變,這在多道程式系統中是難以做到的。   

   〈2〉這個演算法保證所有客戶在有限的時間內得到滿足,但實時客戶要求快速響應,所以要考慮這個因素。  

    〈3〉由於要尋找一個安全序列,實際上增加了系統的開銷。


(3)死鎖檢測和解除

死鎖解除的兩種方法: 剝奪資源  撤銷程序。