程序死鎖的概念,必要條件,處理方法

2021-10-09 01:54:02 字數 3178 閱讀 1318

概念:1、多個併發程序因爭奪系統資源而產生相互等待的現象。

2、是指多個程序在執行過程中因爭奪資源而造成的一種僵局,當程序處於這種僵持狀態時,若無外力作用,它們都將無法                  再向前推進 

原理:當一組程序中的每個程序都在等待某個事件發生,而只有這組程序中的其他程序才能觸發該事件,這就稱這組程序發生了死鎖。

產生原因:

a、競爭資源

產生死鎖中的競爭資源之一指的是競爭不可剝奪資源(例如:系統中只有一台印表機,可供程序p1使用,假定p1已占用了印表機,若p2繼續要求印表機列印將阻塞

產生死鎖中的競爭資源另外一種資源指的是競爭臨時資源(臨時資源包括硬體中斷、訊號、訊息、緩衝區內的訊息等),通常訊息通訊順序進行不當,則會產生死鎖

b. 程序間推進順序非法

本質原因:

1)、系統資源有限。

2)、程序推進順序不合理

互斥:每個資源要麼已經分配給乙個程序,要麼就是可用的,p1程序占用資源時,別的程序無法使用

占有和等待:已經占有資源的額程序可以再請求新的資源

不可搶占:已經分配給程序的資源不能被強制性搶占,它只能被占有它的程序顯式地釋放,資源只能由資源佔有者主動釋放

p1 占用了p2的資源,p2占用了p3的資源,p3占用了p1的資源,形成等待環路

解決死鎖問題代價很高,當死鎖對使用者不會有多大危害時,或者發生的概率很低時,直接不用處理

linux、windows、unix處理死鎖的問題 大部分時間都是忽略它

1、先檢測:

此方法允許系統在執行過程中發生死鎖。但可通過系統所設定的檢測機構,及時地檢測出死鎖的發生,並精確地確定與死鎖有關的程序和資源。檢測方法包括定時檢測、效率低時檢測、程序等待時檢測等。

2、解除死鎖:

採取適當措施,從系統中將已發生的死鎖清除掉。

這是與檢測死鎖相配套的一種措施。當檢測到系統中已發生死鎖時,須將程序從死鎖狀態中解脫出來。

常用的實施方法:撤銷或掛起一些程序,以便**一些資源,再將這些資源分配給已處於阻塞狀態的程序,使之轉為就緒狀態,以繼續執行。死鎖的檢測和解除措施,有可能使系統獲得較好的資源利用率和吞吐量,但在實現上難度也最大。

如果我們在死鎖檢查時發現了死鎖情況,那麼就要努力消除死鎖,使系統從死鎖狀態中恢復過來。

消除死鎖的幾種方式:

最簡單、最常用的方法就是進行系統的重新啟動,缺點:代價很大,它意味著在這之前所有的程序已經完成的計算工作都將付之東流,包括參與死鎖的那些程序,以及未參與死鎖的程序;

撤消程序,剝奪資源。終止參與死鎖的程序,收回它們占有的資源,從而解除死鎖。這時又分兩種情況:一次性撤消參與死鎖的全部程序,剝奪全部資源;或者逐步撤消參與死鎖的程序,逐步收回死鎖程序占有的資源。一般來說,選擇逐步撤消的程序時要按照一定的原則進行,目的是撤消那些代價最小的程序,比如按程序的優先順序確定程序的代價;考慮程序執行時的代價和與此程序相關的外部作業的代價等因素;

程序回退策略,即讓參與死鎖的程序回退到沒有發生死鎖前某一點處,並由此點處繼續執行,以求再次執行時不再發生死鎖。雖然這是個較理想的辦法,但是操作起來系統開銷極大,要有堆疊這樣的機構記錄程序的每一步變化,以便今後的回退,有時這是無法做到的。

死鎖的解除補充:

如果利用死鎖檢測演算法檢測出系統已經出現了死鎖 ,那麼,常用的解除死鎖的方法:

1、搶占資源:從乙個或多個程序中搶占足夠數量的資源分配給死鎖程序,以解除死鎖狀態。

2、終止(或撤銷)程序:終止或撤銷系統中的乙個或多個死鎖程序,直至打破死鎖狀態。

a、終止所有的死鎖程序。這種方式簡單粗暴,但是代價很大,很有可能會導致一些已經執行了很久的程序前功盡棄。

b、逐個終止程序,直至死鎖狀態解除。該方法的代價也很大,因為每終止乙個程序就需要使用死鎖檢測來檢測系統當前是否處於死鎖狀態。另外,每次終止程序的時候終止那個程序呢?每次都應該採用最優策略來選擇乙個「代價最小」的程序來解除死鎖狀態。

一般根據如下幾個方面來決定終止哪個程序:

程序的優先順序

程序已執行時間以及執行完成還需要的時間

程序已占用系統資源

程序執行完成還需要的資源

終止程序數目

程序是互動還是批處理

兩種避免辦法:

1、如果乙個程序的請求會導致死鎖,則不啟動該程序

2、如果乙個程序的增加資源請求會導致死鎖 ,則拒絕該申請

打破四個必要條件之一就能有效預防死鎖的發生;由於互斥條件是非共享資源所必須的,不僅不能改變,還應加以保證,所以,主要是破壞產生死鎖的其他三個條件。

a、破壞「占有且等待」條件

方法1:所有的程序在開始執行之前,必須一次性地申請其在整個執行過程中所需要的全部資源。

方法2:該方法是對第一種方法的改進,允許程序只獲得執行初期需要的資源,便開始執行,在執行過程中逐步釋放掉分配到的已經使用完畢的資源,然後再去請求新的資源。這樣的話,資源的利用率會得到提高,也會減少程序的飢餓問題。

b、破壞「不可搶占」條件

當乙個已經持有了一些資源的程序在提出新的資源請求沒有得到滿足時,它必須釋放已經保持的所有資源,待以後需要使用的時候再重新申請。這就意味著程序已占有的資源會被短暫地釋放或者說是被搶占了。

該種方法實現起來比較複雜,且代價也比較大。釋放已經保持的資源很有可能會導致程序之前的工作實效等,反覆的申請和釋放資源會導致程序的執行被無限的推遲,這不僅會延長程序的周轉週期,還會影響系統的吞吐量。

c、破壞「迴圈等待」條件

可以通過定義資源型別的線性順序來預防,可將每個資源編號,當乙個程序占有編號為i的資源時,那麼它下一次申請資源只能申請編號大於i的資源。

補充:

打破互斥條件:改造獨占性資源為虛擬資源,大部分資源已無法改造。

打破不可搶占條件:當一程序占有一獨占性資源後又申請一獨占性資源而無法滿足,則退出原占有的資源。

打破占有且申請條件:採用資源預先分配策略,即程序執行前申請全部資源,滿足則執行不然就等待,這樣就不會占有且申請。

打破迴圈等待條件:實現資源有序分配策略,對所有裝置實現分類編號,所有程序只能採用按序號遞增的形式申請資源

死鎖的必要條件

假設死鎖是由於程序競爭資源而引起的,我們下面給出死鎖發生的四個必要條件,這四個條件是 coffman首先提出的,所以也稱為coffman條件 1 資源獨佔 mutual exclusion 乙個資源在同一時刻只能分配給乙個程序.如果某一程序申請某一資源,而該資源正被另外某一程序所占有,則申請者需等待...

死鎖的定義 必要條件和處理方法

死鎖的定義 必要條件和處理方法 死鎖的定義 多個程序在執行過程中,因爭奪同類資源且資源分配不當而造成的一種互相等待的現象,若無外力作用,它們都將永遠無法繼續執行,這種狀態稱為死鎖,這些處於等待狀態的程序稱為死鎖程序。2 產生死鎖的必要條件 互斥條件 程序對所分配到的資源進行排他性使用,即一段時間內,...

死鎖概念?產生死鎖必要條件?如何防止死鎖?

死鎖概念 所謂死鎖,是指兩個或者兩個以上執行緒在執行過程中,因爭奪資源而產生互相等待的現象,若無外力作用,他們都將無法推進下去,此時,稱系統處於死鎖。死鎖產生的四個必要條件 1 互斥條件 程序對所分配的資源進行排它性使用,即在一段時間內某資源只由乙個程序占用。如果此時,還有其它的程序請求該資源,則請...