作業系統(5) 死鎖的概念 死鎖產生的必要條件 死鎖的處理策略 預防死鎖 避免死鎖 死鎖的檢測和解除 銀行家演算法
死鎖
文章目錄
一、死鎖的概念
1. 死鎖、飢餓、死迴圈的區別
(1) 死鎖:各程式互相等待對方手裡的資源,導致各程式都阻塞,無法向前推進
(2) 飢餓:長期得不到想要的資源,某程式無法向前推進
(3) 死迴圈:某程式執行過程中一直跳不出某個迴圈
2. 死鎖產生的必要條件
產生死鎖必須同時滿足以下四個條件,若有一個不滿足,死鎖就不會發生
(1) 互斥條件:對互斥使用的資源的爭奪才會導致死鎖
(2) 不剝奪條件:程式獲得的資源在未使用完之前,不能由其他程式強行奪走,只能主動釋放
(3) 請求和保持條件:程式已經保持了至少一個資源,但又提出了新的資源請求,而該資源又 被其他程式佔有,此時請求程式被阻塞,但又對自己已有的資源保持不放
(4) 迴圈等待條件:存在一種程式資源的迴圈等待鏈,鏈中的每一個程式已獲得的資源同時被 下一個程式所請求
注意:發生死鎖時一定有迴圈等待,但是發生迴圈等待時未必死鎖
3. 死鎖的處理策略
(1) 預防死鎖:破壞死鎖產生的四個必要條件中的一個或幾個
(2) 避免死鎖:用某種方法防止系統進入不安全狀態,從而避免死鎖
(3) 死鎖的檢測和解除:允許死鎖的發生,作業系統檢測出死鎖後,會採取措施解除死鎖
- 知識回顧
二、死鎖的處理策略 — 預防死鎖
三、死鎖的處理策略 — 避免死鎖
1. 安全序列的介紹
所謂安全序列,就是指如果系統按照這種序列分配資源,則每個程式都能順利完成,只要能找 出一個安全序列,系統就是安全狀態 (安全序列可能有多個)
如果分配了資源以後,系統中找不出任何一個安全序列,系統就進入了不安全狀態,這就意味 著之後可能所有程式都無法順利的執行下去
注意:
(1) 如果系統處於安全狀態,就一定不會發生死鎖
(2) 如果系統進入不安全狀態,就可能發生死鎖
(3) 處於不安全狀態未必會發生死鎖,但發生死鎖時一定處於不安全狀態
2. 銀行家演算法
思想:在資源分配之前預先判斷這次分配是否會導致系統進入不安全狀態,由此決定是否答應 資源分配請求
注:如果銀行家演算法是安全性演算法,說明此時系統處於安全狀態,不會發生死鎖
四、死鎖的處理策略 — 死鎖的檢測與解除
1. 死鎖的檢測
為了能對系統是否發生了死鎖進行檢測,必須:
(1) 用資源分配圖儲存資源的請求和分配資訊
(2) 提供一種演算法,利用上述資訊檢測系統是否進入死鎖狀態
P2程式請求1個資源,但R1的3個資源都已經分配出去,無法執行;P1程式請求1個資 源,R2剩餘1個資源,P1執行;P1執行完畢之後,釋放自身的所有資源,P1的三條邊全 部消除;R1剩餘的資源可滿足P2程式;P2程式執行,P2的三條邊全部消除
注意:
(1) 如果按照上述過程可以消除所有的邊,表示此圖可完全簡化,不會發生死鎖
(2) 如果不能消除所有的邊,說明發生了死鎖
(3) 最終還連著邊的那些程式就是死鎖程式
2. 死鎖的解除
一旦檢測出死鎖的發生,就應該立即解除死鎖,解除死鎖的方法有:
(1) 資源剝奪法
掛起某些死鎖程式,並搶佔它的資源,將這些資源分配給其他的死鎖程式;但是應防止被 掛起的程式長時間得不到資源而飢餓
(2) 撤銷程式法
強制撤銷部分甚至全部死鎖程式,並剝奪這些程式的資源
(3) 程式回退法
讓死鎖程式回退到足以避免死鎖的地步 (這就要求系統記錄歷史資訊、設定還原點)
3. 知識回顧
相關文章
- 剖析6個MySQL死鎖案例的原因以及死鎖預防策略MySql
- SQ死鎖及死鎖的解決
- 面試:什麼是死鎖,如何避免或解決死鎖;MySQL中的死鎖現象,MySQL死鎖如何解決面試MySql
- 面試官:什麼是死鎖?怎麼排查死鎖?怎麼避免死鎖?面試
- Java鎖——死鎖Java
- [作業系統]死鎖作業系統
- mysql行鎖和死鎖檢測MySql
- 死鎖
- 【Oracle】死鎖的產生與處理Oracle
- 檢視oracle死鎖程式並結束死鎖Oracle
- Oracle 死鎖處理Oracle
- Oracle死鎖處理Oracle
- ORACLE死鎖檢測Oracle
- MySQL 死鎖和鎖等待MySql
- 什麼是死鎖?如何解決死鎖?
- 殺死Oracle死鎖程式Oracle
- 死鎖分析
- oracle 死鎖Oracle
- MySQL:一個死鎖分析 (未分析出來的死鎖)MySql
- 例項詳解 Java 死鎖與破解死鎖Java
- MySQL死鎖系列-線上死鎖問題排查思路MySql
- Mysql如何處理死鎖MySql
- SQLServer的死鎖分析(1):頁鎖SQLServer
- Java 中的死鎖Java
- SQL Server 的死鎖SQLServer
- MySQL 行級鎖的使用以及死鎖的預防MySql
- java如何避免程式死鎖Java
- [Java併發]避免死鎖Java
- 對於死鎖的處理流程:
- LiteOS:SpinLock自旋鎖及LockDep死鎖檢測
- 遭遇ITL死鎖
- GCD 死鎖原因GC
- 死鎖案例分析
- HashMap死鎖分析HashMap
- SQL Server死鎖SQLServer
- 死鎖-舉例
- Mysql 兩階段鎖和死鎖MySql
- 死鎖(ora-00060)以及死鎖相關的知識點