死鎖
時間:2023-09-11 來源:華清遠見
死鎖的概念
如果一個進程中的每一個進程都在等待僅該組進程中的其他進程才能引發的事件,那么該組進程是死鎖的
死鎖產生的原因
➢ 多個進程之間爭奪不可搶占的資源, 進程推薦順序或請求順序不當, 可能會產生死鎖

➢ 系統資源不足, 多個進程消耗同種資源

解決死鎖的辦法
➢ 死鎖防止
➢ 死鎖避免
➢ 死鎖檢測和恢復
死鎖防止
死鎖有四個必要條件: 互斥條件, 占有且等待條件, 不可搶占條件, 循環等待條件
而防止死鎖就要破壞掉這四個條件中的其中一個, 防止死鎖產生, 但可能會降低程序效率.
1. 破壞“占有且等待”條件
所有的進程在開始運行之前,必須一次性地申請其在整個運行過程中所需要的全部資源。
2. 破壞“不可搶占”條件
當一個已經持有了一些資源的進程在提出新的資源請求沒有得到滿足時,它必須釋放已經保持的所有資源,待以后需要使用的時候再重新申請。這就意味著進程已占有的資源會被短暫地釋放或者說是被搶占了。
該種方法實現起來比較復雜,且代價也比較大。釋放已經保持的資源很有可能會導致進程之前的工作實效等,反復的申請和釋放資源會導致進程的執行被無限的推遲,這不僅會延長進程的周轉周期,還會影響系統的吞吐量。
3. 破壞“循環等待”條件
可以通過定義資源類型的線性順序來預防,可將每個資源編號,當一個進程占有編號為i的資源時,那么它下一次申請資源只能申請編號大于i的資源。
死鎖避免
采用資源分配算法, 如銀行家算法等, 合理分配資源, 避免死鎖產生, 但算法程序可能會增加系統負載.
可以利用銀行家算法進行優化:
1. 可利用資源向量Available:用于表示系統里邊各種資源剩余的數目。由于系統里邊擁有的資源通常都是有很多種(假設有m種),所以,我們用一個有m個元素的數組來表示各種資源。數組元素的初始值為系統里邊所配置的該類全部可用資源的數目,其數值隨著該類資源的分配與回收動態地改變。
2. 最大需求矩陣Max:用于表示各個進程對各種資源的額最大需求量。進程可能會有很多個(假設為n個),那么,我們就可以用一個nxm的矩陣來表示各個進程多各種資源的最大需求量
3. 分配矩陣Allocation:顧名思義,就是用于表示已經分配給各個進程的各種資源的數目。也是一個nxm的矩陣。
4. 需求矩陣Need:用于表示進程仍然需要的資源數目,用一個nxm的矩陣表示。系統可能沒法一下就滿足了某個進程的最大需求(通常進程對資源的最大需求也是只它在整個運行周期中需要的資源數目,并不是每一個時刻都需要這么多),于是,為了進程的執行能夠向前推進,通常,系統會先分配個進程一部分資源保證進程能夠執行起來。那么,進程的最大需求減去已經分配給進程的數目,就得到了進程仍然需要的資源數目了。
銀行家算法通過對進程需求、占有和系統擁有資源的實時統計,確保系統在分配給進程資源不會造成死鎖才會給與分配。
死鎖檢測和恢復
不試圖阻止死鎖的產生, 而是檢測到死鎖產生時, 采取措施進行恢復
● 每種資源類中僅有一個資源,則系統發生了死鎖。此時,環路是系統發生死鎖的充分必要條件,環路中的進程就是死鎖進程。
● 每種資源類中有多個資源,則環路的存在只是產生死鎖的必要不充分條件,系統未必會發生死鎖。

