死鎖的處理
死鎖預防
條件 | 解決方法 | 缺點 | |
---|---|---|---|
破壞互斥條件 | 只有對必須互斥使用的資源的爭奪纔會導致死鎖 | 採用某種技術(如SPOOLing技術)將資源改造成邏輯上共享的資源 |
1.並不是所有資源都可以改造成共享的 2.爲了系統安全,要保障資源的互斥性 3.因此大多數時候無法打破互斥條件 |
破壞不剝奪條件 | 進程所獲得的資源只能主動釋放,無法被剝奪 |
1.當想要請求的資源無法滿足時,立刻釋放自己佔有的所有資源,之後再重新申請(容易飢餓) 2.通過操作系統從其他進程處搶奪資源 |
1.實現複雜 2.剝奪別人的資源時會讓對方前功盡棄 3.反覆申請和釋放會增加系統開銷,降低吞吐量 |
破壞請求和保持條件 | 進程已經持有了一個資源,但又提出申請新的資源,但該資源被其他進程佔據,因此會阻塞,但又不打算釋放自己的資源 |
1.靜態分配法:在進程運行前一次性給他分配完他要用的所有資源 |
資源利用率低,可能導致某些進程飢餓 |
破壞循環等待條件 | 存在一個進程資源的循環等待鏈,鏈中的每一個進程所佔有的資源都是他上一個相鄰的進程所渴望的資源 | 順序資源分配法:給資源編號,按編號遞增的方法一次請求資源 |
1.不方便增加設備,要改變編號 2.進程實際使用資源的順序可能和編號順序不一致,導致資源浪費 3.用戶編程麻煩,不同系統可能編號順序不同 |
死鎖避免
- 什麼是安全序列
- 什麼是系統的不安全狀態,與死鎖有啥關係
- 如何避免系統進入不安全狀態(銀行家算法)
安全序列:指一條進程分配資源的順序隊列,按照此順序分配資源,則每個進程都能得到執行,不會死鎖
安全態:只要能找出一條安全序列,則系統就是安全狀態的,安全序列可以有多條,如果一條都找不到,則就是不安全狀態
安全狀態一定不會發生死鎖
不安全狀態可能會發生死鎖,也可能不會
銀行家算法:
在分配資源前,判斷此次分配是否會讓系統進入不安全狀態,以此決定是否分配該資源。
將剩餘的資源先分配給能分配的進程,待該進程運行完之後獲取他的所有資源,然後再分配要求更高的進程
銀行家算法步驟:
- 檢查此次申請是否超過之前聲明的最大需求數
- 檢查剩餘資源數是否能滿足該請求
- 試探着分配,調整各資源數據結構
- 用安全性算法檢查是否會進入不安全狀態
安全性算法
- 檢查當前剩餘的資源是否滿足某進程的最大資源需求數,如果滿足,則將該進程已有的資源合併到剩餘資源中
- 不斷重複上述過程,以檢查更高級的進程需求
死鎖的檢測和解除
死鎖檢測算法:
- 用某種數據結構來保存資源的請求和分配信息
- 提供一種算法,利用上訴信息進行檢測是否進入死鎖狀態
若最終能消除所有的邊,則稱爲可簡化,此時一定沒有死鎖
若不能消除,則就是發生了死鎖
最終還連着邊的進程就是死鎖進程
死鎖解除
- 資源剝奪法:掛起某些死鎖進程,搶佔他的資源,將這些資源分配給其他死鎖進程。要防止掛起的進程長時間得不到資源而飢餓。
- 撤銷進程法:強制撤銷部分甚至全部的死鎖進程,並剝奪這些進程所佔有的資源。實現簡單但代價大,好不容易執行到某一步的進程不得不重來
- 進程回退法:讓一個或多個死鎖進程回退到足以避免死鎖的地步,這要求系統記錄進程的歷史信息,設置還原點。
如何決定對誰下手?
- 進程優先級低的
- 已執行時間少的
- 離執行結束相差較遠的
- 佔有大量資源的進程
- 進程是交互式的還是批處理式的