概念
- 條件是基礎,在一定的原因下,產生結果
死鎖三胞胎
- 死鎖 僵持,消耗時間,雙方都占用了部分資源,不釋放
- 活鎖 雙方互相謙讓,都不占用資源
- 饑餓 謙讓的一方一直等待,無法占有資源,導致饑餓問題
死鎖的原因以及必要的條件
應用程序 信號量使用不當?
- 信號量的初始值設置錯誤,設為0,兩個進程都卡死;
- 解決辦法 :代碼開發人員 和 代碼測試人員
semaphore s1 = 0;
semaphore s2 = 0;
A(){while(1){p(s1);吃飯;v(s2);}
}B(){while (1){p(s2);喝茶;v(s2);}}
OS內核程序? 不可剝奪的軟硬件資源
- 多進程對不可剝奪資源的競爭
- 進程申請資源的順序不合理
死鎖的必要條件
死鎖產生了,一定會產生如下四個條件;但是具有這四個條件不一定會造成死鎖
- 互斥條件? ? ? ? ? 臨界資源
- 不可剝奪條件? 進程之間不可以互相剝奪彼此的資源
- 請求保持條件? 占有資源不主動釋放
- 循環等待條件??
預防死鎖
破壞死鎖的必要條件
- 互斥條件? ? ? ? ? 臨界資源? ?幾乎行不通,比如更改臨界資源
- 不可剝奪條件? 進程之間不可以互相剝奪彼此的資源? 需要付出代價,也有,比如cpu的切換;但是如果是打印機,會造成彼此文件交叉融合
- 請求保持條件? 占有資源不主動釋放? ?一次性申請完臨界資源?
- 循環等待條件??遞增編號,按照順序申請資源。比如一個資源切成兩份,第一份資源叫1,第二份資源叫2,A申請資源1,B在申請的時候看到1號資源已經被占用,就需要等待,A繼續申請2號資源,當A使用完資源,釋放之后。B開始申請,按照資源的序號進行資源的申請
避免死鎖
- 銀行家算法? 計算安全序列
- 規劃合理的資源申請順序,提高資金的流轉速度
- 安全序列 找到 無死鎖 可以避免;找不到 必死鎖 無法避免
- 因此將1000萬借給萬達,收回3000萬借給萬科或者恒大都可以?
- 訪問順序 萬達 萬科 恒大;萬達 恒大 萬科
例1
例2?
死鎖的檢測與解除
死鎖定理和資源分配圖
- 化簡 如果可以化簡到最簡則無死鎖
- 不能化簡到最簡模式則檢測到死鎖,進行下一步解除死鎖,1,資源剝奪法;2,報銷進程法;3,進程回退法
資源分配圖
- 圓圈代表進程
- 長方形代表一類資源的容器
- 長方形中的圓圈,代表該類資源,數量代表資源的數目
- 邊 :從長方形指向圓圈,代表已分配邊;圓圈指向長方形,代表申請邊,請求邊
- 尋找圓圈進程,依次嘗試,判斷p1的申請邊(從圓圈指出的邊)是否都可以得到滿足,滿足則刪除,不滿足則尋找下一個圓圈進程
死鎖的解除
- 資源剝奪法?
- 撤銷進程法 進程停止運行
- 進程回退法 進行由運行80%出現死鎖,進程回退到70%等待,繼續執行