什么是死鎖?如何避免死鎖的算法


所謂死鎖:是指兩個或兩個以上的進程在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去。此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的進程稱為死鎖進程。由於資源占用是互斥的,當某個進程提出申請資源后,使得有關進程在無外力協助下,永遠分配不到必需的資源而無法繼續運行,這就產生了一種特殊現象死鎖。

雖然進程在運行過程中,可能發生死鎖,但死鎖的發生也必須具備一定的條件,死鎖的發生必須具備以下四個必要條件。

1)互斥條件:指進程對所分配到的資源進行排它性使用,即在一段時間內某資源只由一個進程占用。如果此時還有其它進程請求資源,則請求者只能等待,直至占有資源的進程用畢釋放。

2)請求和保持條件:指進程已經保持至少一個資源,但又提出了新的資源請求,而該資源已被其它進程占有,此時請求進程阻塞,但又對自己已獲得的其它資源保持不放。

3)不剝奪條件:指進程已獲得的資源,在未使用完之前,不能被剝奪,只能在使用完時由自己釋放。

4)環路等待條件:指在發生死鎖時,必然存在一個進程——資源的環形鏈,即進程集合{P0,P1,P2,···,Pn}中的P0正在等待一個P1占用的資源;P1正在等待P2占用的資源,……,Pn正在等待已被P0占用的資源。

 

1) 預防死鎖。

  這是一種較簡單和直觀的事先預防的方法。方法是通過設置某些限制條件,去破壞產生死鎖的四個必要條件中的一個或者幾個,來預防發生死鎖。預防死鎖是一種較易實現的方法,已被廣泛使用。但是由於所施加的限制條件往往太嚴格,可能會導致系統資源利用率和系統吞吐量降低。

  a 破壞互斥條件

  如果允許系統資源都能共享使用,則系統不會進入死鎖狀態。但有些資源根本不能同時訪問,如打印機等臨界資源只能互斥使用。所以,破壞互斥條件而預防死鎖的方法不太可行,而且在有的場合應該保護這種互斥性。

      b 破壞不剝奪條件

  當一個已保持了某些不可剝奪資源的進程,請求新的資源而得不到滿足時,它必須釋放已經保持的所有資源,待以后需要時再重新申請。這意味着,一個進程已占有的資源會被暫時釋放,或者說是被剝奪了,或從而破壞了不可剝奪條件。

  該策略實現起來比較復雜,釋放已獲得的資源可能造成前一階段工作的失效,反復地申請和釋放資源會增加系統開銷,降低系統吞吐量。這種方法常用於狀態易於保存和恢復的資源,如CPU的寄存器及內存資源,一般不能用於打印機之類的資源。

      c 破壞請求和保持條件

      釆用預先靜態分配方法,即進程在運行前一次申請完它所需要的全部資源,在它的資源未滿足前,不把它投入運行。一旦投入運行后,這些資源就一直歸它所有,也不再提出其他資源請求,這樣就可以保證系統不會發生死鎖。

      這種方式實現簡單,但缺點也顯而易見,系統資源被嚴重浪費,其中有些資源可能僅在運行初期或運行快結束時才使用,甚至根本不使用。而且還會導致“飢餓”現象,當由於個別資源長期被其他進程占用時,將致使等待該資源的進程遲遲不能開始運行。  

  d  資源有序分配法:破壞循環等待條件, 釆用順序資源分配法。首先給系統中的資源編號,規定每個進程,必須按編號遞增的順序請求資源,同類資源一次申請完。也就是說,只要進程提出申請分配資源Ri,則該進程在以后的資源申請中,只能申請編號大於Ri的資源

這種方法存在的問題是,編號必須相對穩定,這就限制了新類型設備的增加;盡管在為資源編號時已考慮到大多數作業實際使用這些資源的順序,但也經常會發生作業使甩資源的順序與系統規定順序不同的情況,造成資源的浪費;此外,這種按規定次序申請資源的方法,也必然會給用戶的編程帶來麻煩。

2) 避免死鎖。

  該方法同樣是屬於事先預防的策略,但它並不須事先采取各種限制措施去破壞產生死鎖的的四個必要條件,而是在資源的動態分配過程中,用某種方法去防止系統進入不安全狀態,從而避免發生死鎖。 

  a 系統安全狀態

  避免死鎖的方法中,允許進程動態地申請資源,但系統在進行資源分配之前,應先計算此次資源分配的安全性。若此次分配不會導致系統進入不安全狀態,則將資源分配給進程; 否則,讓進程等待。

  所謂安全狀態,是指系統能按某種進程推進順序( P1, P2, ..., Pn),為每個進程Pi分配其所需資源,直至滿足每個進程對資源的最大需求,使每個進程都可順序地完成。此時稱 P1, P2, ..., Pn 為安全序列。如果系統無法找到一個安全序列,則稱系統處於不安全狀態。

  b 銀行家算法

  銀行家算法是最著名的死鎖避免算法。它提出的思想是:把操作系統看做是銀行家,操作系統管理的資源相當於銀行家管理的資金,進程向操作系統請求分配資源相當於用戶向銀行家貸款。操作系統按照銀行家制定的規則為進程分配資源,當進程首次申請資源時,要測試該進程對資源的最大需求量,如果系統現存的資源可以滿足它的最大需求量則按當前的申請量分配資源,否則就推遲分配。當進程在執行中繼續申請資源時,先測試該進程已占用的資源數與本次申請的資源數之和是否超過了該進程對資源的最大需求量。若超過則拒絕分配資源,若沒有超過則再測試系統現存的資源能否滿足該進程尚需的最大資源量,若能滿足則按當前的申請量分配資源,否則也要推遲分配。

3)檢測死鎖。

  這種方法並不須事先采取任何限制性措施,也不必檢查系統是否已經進入不安全區,此方法允許系統在運行過程中發生死鎖。但可通過系統所設置的檢測機構,及時地檢測出死鎖的發生,並精確地確定與死鎖有關的進程和資源,然后采取適當措施,從系統中將已發生的死鎖清除掉。

  資源分配圖化簡法

  死鎖的判定法則

基於上述資源分配圖的定義,可給出判定死鎖的法則,又稱為死鎖定理.

(1)    如果資源分配圖中沒有環路,則系統沒有死鎖

(2)    如果資源分配圖中出現了環路,則系統中可能存在死鎖.

(1)    如果處於環路中的每個資源類中均只包含一個資源實例,則環路的存在即意味着死鎖的存在,此時,環路是死鎖的充分必要條件

(2)    如果處於環路中的每個資源類實例的個數不全為1,則環路的存在是產生死鎖的必要條件而不是充分條件.

化簡的方法如下:

(1)    在資源分配圖中,找出一個既非等待又非孤立的進程結點Pi,由於Pi可獲得它所需要的全部資源,且運行完后西方它所占有的全部資源,故可在資源分配圖中消去Pi所有的申請邊和分配邊,使之成為既無申請邊又無分配邊的孤立結點.

(2)    將Pi所釋放的資源分配給申請它們的進程,即在資源分配圖中將這些進程對資源的申請邊改為分配邊.

(3)    重復(1),(2)兩步驟,知道找不到符合條件的進程結點

4)解除死鎖。

  這是與檢測死鎖相配套的一種措施。當檢測到系統中已發生死鎖時,須將進程從死鎖狀態中解脫出來。常用的實施方法是撤銷或掛起一些進程,以便回收一些資源,再將這些資源分配給已處於阻塞狀態的進程,使之轉為就緒狀態,以繼續運行。死鎖的檢測和解除措施,有可能使系統獲得較好的資源利用率和吞吐量,但在實現上難度也最大。

剝奪資源:從其它進程剝奪足夠數量的資源給死鎖進程,以解除死鎖狀態;

撤消進程:可以直接撤消死鎖進程或撤消代價最小的進程,直至有足夠的資源可用,死鎖狀態.消除為止;所謂代價是指優先級、運行代價、進程的重要性和價值等。

 
 


免責聲明!

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



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