死鎖產生的條件及如何解決死鎖

死鎖的概念

1、死鎖的概念:死鎖是指兩個或兩個以上的進程或線程在執行過程中,由於競爭資源或者由於彼此通信而造成的一種阻塞的現象,若無外力作用,它們都將無法向前推進。這些永遠在互相等待的進程稱爲死鎖進程。
我們舉個例子:在笑傲江湖中,嶽不羣拿着武功祕籍《辟邪劍譜》,任我行拿着武功祕籍《吸心大法》,此時嶽不羣想要修煉《吸心大法》,而任我行卻想修煉《辟邪劍譜》,但是他們都不想交換,此時他們只能修煉自己的武功祕籍了
在這裏插入圖片描述

死鎖產生的條件

1、互斥:某種資源一次只允許一個進程訪問,即該資源一旦分配給某個進程,其他進程就不能再訪問,直到該進程訪問結束。
2、佔有且等待:一個進程本身佔有資源(一種或多種),同時還有資源未得到滿足,正在等待其他進程釋放該資源。
3、不可搶佔:別人已經佔有了某項資源,你不能因爲自己也需要該資源,就去把別人的資源搶過來。
4、循環等待:存在一個進程鏈,使得每個進程都佔有下一個進程所需的至少一種資源。
當以上四個條件均滿足,必然會造成死鎖,發生死鎖的進程無法進行下去,它們所持有的資源也無法釋放。

解決死鎖的方法

一、破壞“佔有且等待”條件
方法1:所有的進程在開始運行之前,必須一次性地申請其在整個運行過程中所需要的全部資源。
優點:簡單易實施且安全。
缺點:因爲某項資源不滿足,進程無法啓動,而其他已經滿足了的資源也不會得到利用,嚴重降低了資源的利用率,造成資源浪費。使進程經常發生飢餓現象。

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

二、破壞“不可搶佔”條件
當一個已經持有了一些資源的進程在提出新的資源請求沒有得到滿足時,它必須釋放已經保持的所有資源,待以後需要使用的時候再重新申請。這就意味着進程已佔有的資源會被短暫地釋放或者說是被搶佔了。該種方法實現起來比較複雜,且代價也比較大。釋放已經保持的資源很有可能會導致進程之前的工作實效等,反覆的申請和釋放資源會導致進程的執行被無限的推遲,這不僅會延長進程的週轉週期,還會影響系統的吞吐量。

三、破壞“循環等待”條件
可以通過定義資源類型的線性順序來預防,可將每個資源編號,當一個進程佔有編號爲i的資源時,那麼它下一次申請資源只能申請編號大於i的資源。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章