以上小節討論了死鎖預防和死鎖避免的幾種方法,但是這些方法都比較保守,並且都是以犧牲系統效率和浪費資源為代價的,這恰恰與作業系統設計目標相違背。假如系統為程序分配資源時,不採取任何限制性措施來避免和預防死鎖,減少因避免和預防死鎖策略帶來的開銷,同時本著提高資源利用率的原則分配資源,但作業系統在執行過程中,不斷地監督 程序的執行和資源占用狀態,判定死鎖是否真的發生;並且,一旦死鎖發生,則釆取專門的 措施解除死鎖,並以最小代價使整個系統恢復正常,這就是死鎖的檢測和解除。
一、 死鎖檢測的時機
作業系統可定時執行乙個「死鎖檢測」.程式,該程式按一定的演算法去檢測系統中是否 存在死鎖。檢測死鎖的實質是確定是否存在「迴圈等待」條件,檢測演算法確定死鎖的存在 並識別出與死鎖有關的程序和資源,以供系統採取適當的解除死鎖措施。
通常,死鎖檢測可以在任何一次資源分配後,也可以在每次排程後,或者利用定時器定 時執行檢測,還有一種方法是當系統中某個程序長期位於阻塞態或阻塞程序過多時,啟動死 鎖檢測程式。
二、 死鎖檢測的演算法
死鎖檢測的演算法依不同的系統而不同,下面介紹一種死鎖檢測的演算法。
(1)為每個程序和每個資源指定唯一編號。
(2)設定一張資源分配狀態表,每個表目包含「資源號」和占有該資源的「程序號」兩 項,資源分配表中記錄了每個資源正在被哪個程序所占有。
(3)設定一張程序等待分配表,每個表目包含「程序號」和該程序所等待的「資源號」 兩項。
(4)演算法規則:當任一程序p,申請乙個已被其他程序占用的資源時,進行死鎖檢測。 檢測演算法通過反覆查詢資源分配表和程序等待表,來確定程序p,.對資源i的請求是否導致形成環路,若是,便確定出現死鎖。
【例7】程序死鎖檢測演算法。
系統中有程序p1、p2和p3共享資源r1、r2和r3。在某一時刻資源使用情況如圖5-9a所 示。此後依次發生p1請求r1,p2請求r3, p3請求r1。當執行死鎖檢測演算法後,得到圖5-9b; 再執行死鎖檢測演算法,得到圖5-9c;再執行死鎖檢測演算法,得到圖5-9d。檢查圖5-9d與圖 5-9a,確定是否出現死鎖。
三、死鎖的解除方法
一旦檢測到死鎖,便要立即設法解除死鎖。一般說來,只要讓某個程序釋放乙個或多個資源就可以解除死鎖。死鎖解除後,釋放資源的程序應恢復它原來的狀態,才能保證該程序 的執行不會出現錯誤。因此,死鎖解除實質上就是如何讓釋放資源的程序能夠繼續執行。
為解除死鎖就要剝奪資源,此時,需要考慮以下幾個問題。
(1)選擇乙個犧牲程序,即要確定剝奪哪個程序的哪些資源。
(2)重新執行或回退到某一點開始繼續執行。若從乙個程序那裡剝奪了資源,要為該程序做些什麼事情?顯然,這個程序是不能繼續正常執行了。必須將該程序回退到起點或某個 狀態,以後再重新開始執行。令程序夭折的方法雖然簡單,但代價大;而更有效的方法是只 讓它退回到足以解除死鎖的地步即可。那麼,問題轉換成程序回退的狀態由什麼組成?怎樣 才能方便地確定該狀態,這就要求系統保持更多的有關程序執行的資訊。
(3)怎樣保證不發生「餓死」現象,即如何保證並不總是剝奪同一程序的資源,而導致 該程序處於「飢餓」狀態。
(4)「最小代價」,即最經濟合算的演算法,使得程序回退帶來的開銷最小。但是,「最小 開銷」是很不精確的,程序重新執行的開銷包括很多因素。
①程序的優先順序。
②程序已經執行了多長時間,該程序完成其任務還需要多長時間?
③該程序使用的資源種類和數量?這些資源能簡單地剝奪嗎?
④為完成其任務,程序還需要多少資源?
⑤有多少程序要被撤銷?
⑥該程序被重新啟動執行的次數。
一旦決定乙個程序必須回退,就一定要確定這個程序回退多少。最簡單的辦法是從頭來,讓其重新執行,這將會使乙個程序的工作「前功盡棄」。
死鎖的解除方法可歸納為兩大類。
1、剝奪資源
使用掛起/啟用機制掛起一些程序,剝奪它們占有的資源給死鎖程序,以解除死鎖,待以後條件滿足時,再啟用被掛起的程序。
由於死鎖是由程序競爭資源而引起的,所以,可以從一些程序那裡強行剝奪足夠數量的 資源分配給死鎖程序,以解除死鎖狀態。剝奪的順序可以是以花費最小資源數為依據。每次 剝奪後,需要再次呼叫死鎖檢測演算法。資源被剝奪的程序為了再得到該資源,必須重新提出 申請。為了安全地釋放資源,該程序就必須返回到分配資源前的某一點。經常使用的方法如 下。
(1)還原演算法,即恢復計算結果和狀態。
(2)建立檢查點主要是用來恢復分配前的狀態。這種方法對實時系統和長時間執行的數 據處理來說是一種常用技術。在實時系統中,經常在某些程式位址插人檢查的程式段,即採 用檢查點的技術來驗證系統的正確性,如發現故障,可從檢查點重新啟動。因此,在有些實 時系統中,一旦發現死鎖,可以在釋放某程序的資源後,從檢查點重新啟動。
2、撤銷程序
撤銷死鎖程序,將它們占有的資源分配給另一些死鎖程序,直到死鎖解除為止。
可以撤銷所有死鎖程序,或者逐個撤銷死鎖程序,每撤銷乙個程序就檢測死鎖是否繼續 存在,若已沒有死鎖,就停止程序的撤銷。
如果按照某種順序逐漸地撤銷已死鎖的程序,直到獲得為解除死鎖所需要的足夠可用的 資源為止,那麼在極端情況下,這種方法可能造成除乙個死鎖程序外,其餘的死鎖程序全部 被撤銷的局面。
按照什麼原則撤銷程序?較實用而又簡便的方法是撤銷那些代價最小的程序,或者使撤 銷程序的數目最小。以下幾點可作為衡量撤銷代價的標準。
(1)程序優先數,即被撤銷程序的優先數。
(2)程序類的外部代價。不同型別的程序可以規定出各自的撤銷代價。系統可根據這些 規定,撤銷代價最小的程序,達到解除死鎖的目的。
(3)執行代價,即重新啟動程序並執行到當前撤銷點所需要的代價。這一點可由系統記 賬程式給出。
撤銷法的優點是簡單明瞭,但有時可能不分青紅皂白地撤銷一些甚至不影響死鎖的程序。
當死鎖的程序中包含有作業系統的程序單元時,死鎖會變得複雜,採用上述方法可能導致系統重新啟動,從而付出較高代價。
作業系統面試 死鎖(三) 死鎖檢測和死鎖恢復
本文是對作業系統概念 第七版 死鎖的學習總結,不足之處,歡迎批評指正。本文討論的兩塊內容是死鎖檢測和死鎖恢復。1 死鎖檢測 首先針對每種資源型別只有乙個例項的情況。該演算法使用資源分配圖的乙個變種,稱為等待圖。從資源分配圖中,刪除所有資源型別的節點,合併合適邊,就可以得到等待圖。合併的過程如下 如果...
作業系統 死鎖和死鎖處理策略
本文在作業系統的角度梳理下死鎖和作業系統的死鎖處理策略。在併發環境下,各程序因競爭資源而造成的一種互相等待對方手裡的資源,導致各程序都阻塞,都無法向前推進的現象。發生死鎖後,若無外力干涉,則這些程序都無法向前推進。互斥條件 不剝奪條件 請求和保持條件 迴圈等待條件 對不可剝奪資源的不合理分配,可能導...
作業系統死鎖
作業系統死鎖,在作業系統課程當中屬於比較關注的乙個知識點,在這裡做個簡單的梳理。死鎖的四個必要條件 作業系統中有若干程序併發執行,它們不斷申請 使用 釋放系統資源,雖然系統的進 程協調 通訊機構會對它們進行控制,但也可能出現若干程序都相互等待對方釋放資源才能 繼續執行,否則就阻塞的情況。此時,若不借...