死鎖及如何處理死鎖-轉載

轉載自:http://www.andylouse.net/html/itknowledge/2012/73.htmlhtml

1、什麼是死鎖

死鎖定義:多個進程在執行過程當中,因爭奪同類資源且資源分配不當而形成的一種互相等待的現象,若無外力做用,它們都將永遠沒法繼續執行,這種狀態稱爲死鎖,這些處於等待狀態的進程稱爲死鎖進程。算法

規範定義:集合中的每個進程都在等待只能由本集合中的其餘進程才能引起的事件,那麼該集合正處於死鎖狀態,這組進程也是死鎖進程。多線程

好比,進程P1在執行時佔用全部的資源R1,此時,進程P1申請資源R2才能繼續執行,同時,進程P2佔用了全部的資源R2,須要申請資源R1才能繼續執行,而雙方都須要得到對方的資源後才能釋放已佔用的資源,這樣就造成了一個最簡單的循環等待——死鎖。併發

2、產生死鎖的緣由

在系統提供給多個進程使用的共享資源的數量不夠時,這些進程在競爭資源時將會產生死鎖。所以,能夠說任何多線程的系統都有可能產生死鎖,而產生死鎖的緣由大體分爲以下兩類:異步

系統提供的資源不夠每一個進程使用,進程在競爭資源時產生死鎖spa

首先描述一下系統中的兩類資源——可剝奪資源、不可剝奪資源和臨時資源。可剝奪資源是指某進程在得到這類資源後,該資源能夠再被其餘進程或系統剝奪,如優先級高的進程能夠剝奪優先級低的進程的資源;而對不可剝奪資源來講,當系統把這類資源分配給某進程後,再不能強行收回,只能在進程用完後自行釋放,如磁帶機、打印機等;臨時資源是指由一個進程產生,被另外一個進程使用,短期後便無用的資源,也稱爲消耗性資源,如硬件中斷、信號、消息、緩衝區內的消息等。.net

進程在競爭不可剝奪資源和臨時資源時,都有可能引起死鎖,這種狀況下,必須經過外力的做用,強制其中某些進程釋放其所佔用的資源,咱們經常使用的方法是撤消進程,詳情將在解除死鎖中講解。線程

系統提供的資源夠部分進程使用,但進程推動算法不當引起死鎖htm

進程在運行中具備異步性特徵,多個進程能夠按不一樣的順序向前推動,若進程推動算法合法,則進程申請資源、釋放資源的過程很是順利,不然,一旦讓某進程申請到過多的資源卻又不能完成任務釋放資源,而剩下的資源又不夠其餘進程申請,這樣,就發生了進程死鎖。進程

總結以上緣由,咱們得出產生死鎖有四個必要條件:

互斥條件:指進程對所分配到的資源進行排它性使用,即在一段時間內某資源只由一個進程佔用,若是此時有其它進程請求資源,則必須等到該進程完成任務並釋放資源。

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

不可剝奪條件:指進程已得到的資源,在未使用完以前,不能被剝奪,只能在完成任務後由本身釋放。

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

3、預防死鎖

系統自己提供足夠的資源

有n個進程競爭同類資源,每一個進程須要p個資源,若是系統可以提供該類資源n(p-1)+1個,就能保證不產生死鎖。

使用合理的資源分配方法

一般狀況下,系統提供的資源每每不能知足擁擠的進程來使用,因此,咱們更多的是使用合理的進程分配方法來預防死鎖。

資源獨佔:讓進程獨自佔用某些資源,進到它任務完成所有釋放。

資源順序分配:按照某種規則將系統中的全部資源進行統一編號,進程在申請資源時必須一次性徹底申請它所須要使用的並且屬於同一類的全部資源,在申請不一樣類資源時,必須按各種設備的編號依次申請。

資源受控動態分配:分配資源前先檢查會不會發生死鎖,這就要求各進程說明所需資源,將資源分類,按不一樣策略分配,又稱爲靜態說明動態分配。

銀行家算法

避免死鎖算法中最有表明性的算法是Dijkstra E.W 於1968年提出的銀行家算法。該算法須要檢查申請者對資源的最大需求量,若是系統現存的各種資源能夠知足申請者的請求,就知足申請者的請求。這樣申請者就可很快完成其計算,而後釋放它佔用的資源,從而保證了系統中的全部進程都能完成,所以可避免死鎖的發生。

小結

理論上,預防死鎖不難實現,只須要破壞四個必要條件中的一個或多個便可,可是要破壞他們,每每須要施加嚴格的限制條件,這樣可能會致使系統資源利用率和系統吞吐量下降。

4、發現死鎖

檢測死鎖:當進程進行資源請求時檢查併發進程組是否構成資源的請求和佔用環路,若是不存在這一環路,則該系統不會產生死鎖。

利用簡化進程-資源圖來檢測系統是否產生死鎖。所謂化簡是指一個進程的全部資源請求均能被知足的話,能夠設想:進程獲得其所需的所有資源→最終完成任務,並釋放所佔有的所有資源,這種狀況下,則稱進程-資源分配圖能夠被該進程化簡,化簡方法以下:

(1) 在資源分配圖中,找出一個既非等待又非孤立的進程結點Pi,因爲Pi可得到它所須要的所有資源,且運行完後西方它所佔有的所有資源,故可在資源分配圖中消去Pi全部的申請邊和分配邊,使之成爲既無申請邊又無分配邊的孤立結點。

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

(3) 重複(1)、(2)兩步驟,直到找不到符合條件的進程結點。

通過化簡後,若能消去資源分配圖中的全部邊,使全部進程都成爲孤立結點,則該圖是可徹底化簡的。

死鎖定理:系統中某個時刻S爲死鎖狀態的充分必要條件是,S時刻系統的資源分配圖是非徹底可化簡的。

5、解除死鎖

一旦檢測到死鎖,便要當即設法解除死鎖,如下是幾種解除死鎖的方法:

剝奪法:將某些資源從其它進程強佔過來分配給另外一些進程。

這種方法要求強佔資源後不影響原進程恢復後的執行,可是關係到資源的屬性,難於實現。

回退法:系統執行過程當中設置若干斷點,並保存現場,在產生死鎖後當即採用回滾方式釋放資源以解除死鎖。

這種方法要求被保護的現場不能頻繁覆蓋,同時須要考慮斷點的設置時機與空間開銷。

撤消進程:從系統中撤消某些進程,釋放資源以解除死鎖。

這種方法要求保證系統的數據等的一致性,但問題是咱們每每難於判斷是否能保證其一致性。

相關文章
相關標籤/搜索