文章目錄
死鎖
在併發的環境下,各個進程因爲競爭資源而造成的一種互相等待對方手中的資源,導致各個進程都阻塞,都無法向前推進的現象,就是死鎖/
死鎖、飢餓、死循環的區別:
- 死鎖:各個進程因爲競爭資源而造成的一種互相等待對方手中的資源,導致各個進程都阻塞,都無法向前推進的現象
- 飢餓:由於長期得不到想要的資源,則長進程將一直得不到處理機,從而發生長進程“飢餓”
- 死循環:跳不出循環
一、死鎖的概念
1、死鎖的必要條件(互斥、不剝奪、請求、循環)
產生死鎖必須滿足四個條件,只要任何一個不成立,死鎖就不會發生:
- 互斥條件:只有對必須互斥使用的資源爭搶纔會導致死鎖。
- 不剝奪條件:進程所獲得的資源在未使用完之前,不能由其他進程強行奪走,只能主動釋放
- 請求和保持條件:進程已經保持了一個資源,但是又提出了新的資源請求,而該資源被其他進程佔用,此時請求進程被阻塞。但是對自己有的資源保持不放
- ==循環等待條件:==存在一種進程資源的循環等待鏈。
2、死鎖的處理策略(預防、避免、檢測和解除)
- 預防死鎖:破壞四個必要條件中的一個或者幾個
- 避免死鎖:用某種方法防止系統進入不安全狀態,從而避免死鎖(銀行家算法)
- 死鎖的檢測和解除:允許死鎖發生,不過操作系統發生死鎖會採取措施解決死鎖
3、總結
二、死鎖的處理
1、預防死鎖
1、破壞互斥條件
互斥條件:只有對必須互斥使用的資源的爭搶纔會導致死鎖。
可以把互斥使用的東西改成共享使用的資源。
2、破壞不剝奪條件
不剝奪條件:進程所獲得的資源在未使用完之前,不能由其他進程強行奪走,只能主動釋放。
破壞不剝奪條件:
- 方案一、當某個請求請求新的資源得不到滿足的時候,必須立即釋放保持的所有資源,等待以後需要的時候再重新申請。也就是說,即使某些資源沒有使用完,也必須主動釋放,從而破壞了不可剝奪條件。
- 方案二、當某個進程需要的資源被其他進程佔有的時候,可以由操作系統協助,將想要的資源強行剝奪。
3、破壞請求和保持條件
請求和保持條件:進程已經保持了至少一個資源,但是又提出新的資源請求,而該資源又被其他進程佔有,此時請求阻塞,但是又對自己持有的資源保持不放。
可以使用靜態分配方法:進程在運行前一次申請完它所需要的全部資源,在它的資源未滿足前,不讓他投入使用,一旦投入運行後,這些資源就一直歸他所有,該進程就不會再請求別的任何資源了。
4、破壞循環等待條件
循環等待條件:存在一種進程資源的循環等待鏈,鏈中的每一個進程已獲得的資源同時被下一個進程所請求。
可採用順序資源分配法,首先給系統中的資源編號,規定每個進程必須按編號遞增的順序請求資源,同類資源(即編號相同的資源)一次申請完。
原理分析:一個進程只佔有小編號的資源的時候,纔有資格申請更大的資源,按此規則,已持有大編號資源的進程不能逆向回來申請小編號的資源,從而就不會產生循環等待的現象。
2、避免死鎖(銀行家算法)
銀行家手裏100萬。BAT三公司要借錢。
- B借70億。
- A借40億。
- C借50億。
江湖上有一個規定,如果借給企業的前總數達不到企業提出的最大需求,那麼不管你借了多少給企業,都收不回來。
所謂安全序列就是如果系統按照這種序列分配資源,則每個進程都能順利完成,只要能找出一個安全序列,系統就是安全狀態,當然,安全序列有可能有多個。
如果系統處於安全狀態,就一定不會發生死鎖。
因此可以在資源分配之前預先判斷這次分配是否會導致系統進入不安全狀態,以此決定是否答應資源分配請求,這也是“銀行家算法”的核心思想。
3、檢測和解除
- 1、死鎖檢測算法:用於檢測系統狀態,以確定系統中是否發生了死鎖。
- 2、死鎖解除算法:當認定系統中發生了死鎖,利用該算法可將系統從死鎖狀態中解脫出來。
爲了能對系統是否發生了死鎖進行檢測,必須:
- 用某種數據結構來保存資源的請求和分配信息。
- 提供一種算法,利用上述信息來檢測系統是否已經進入了死鎖狀態。
死鎖的解除
一旦檢測出死鎖的發生,就應該立即解除死鎖。
補充:並不是系統中所有的進程都是死鎖狀態,用死鎖檢測算法化簡資源分配圖後,還連着邊的那些進程就是死鎖進程。