【操作系統(tǒng)】2.3 死鎖

1.必要條件

資源的關系圖

互斥:每個資源要么已經(jīng)分配給了一個進程,要么就是可用的。

占有和等待:已經(jīng)得到了某個資源的進程可以再請求新的資源。

不可搶占:已經(jīng)分配給一個進程的資源不能強制性地被搶占,它只能被占有它的進程顯式地釋放。

環(huán)路等待:有兩個或者兩個以上的進程組成一條環(huán)路,該環(huán)路中的每個進程都在等待下一個進程所占有的資源。

2.處理方法

2.1 鴕鳥策略

說白了就是忽略死鎖。

因為解決死鎖問題的代價很高,因此鴕鳥策略這種不采取任務措施的方案會獲得更高的性能。當發(fā)生死鎖時不會對用戶造成多大影響,或發(fā)生死鎖的概率很低,可以采用鴕鳥策略。

大多數(shù)操作系統(tǒng),包括 Unix,Linux 和 Windows,處理死鎖問題的辦法僅僅是忽略它。

2.2 死鎖檢測與死鎖恢復

(1)? 檢測單線程死鎖

資源分配圖

上圖為資源分配圖,其中方框表示資源,圓圈表示進程。資源指向進程表示該資源已經(jīng)分配給該進程,進程指向資源表示進程請求獲取該資源。圖 a 可以抽取出環(huán),如圖 b,它滿足了環(huán)路等待條件,因此會發(fā)生死鎖。

每種類型一個資源的死鎖檢測算法是通過檢測有向圖是否存在環(huán)來實現(xiàn),從一個節(jié)點出發(fā)進行深度優(yōu)先搜索,對訪問過的節(jié)點進行標記,如果訪問了已經(jīng)標記的節(jié)點,就表示有向圖存在環(huán),也就是檢測到死鎖的發(fā)生。

(2)檢測多個進程死鎖

每種類型多個資源的死鎖檢測?

上圖中,有三個進程四個資源,每個數(shù)據(jù)代表的含義如下:

① E 向量:資源總量

② A 向量:資源剩余量

③ C 矩陣:每個進程所擁有的資源數(shù)量,每一行都代表一個進程擁有資源的數(shù)量

④ R 矩陣:每個進程請求的資源數(shù)量

進程 P1?和 P2?所請求的資源都得不到滿足,只有進程 P3?可以,讓 P3?執(zhí)行,之后釋放 P3?擁有的資源,此時 A = (2 2 2 0)。P2?可以執(zhí)行,執(zhí)行后釋放 P2?擁有的資源,A = (4 2 2 1) 。P1?也可以執(zhí)行。所有進程都可以順利執(zhí)行,沒有死鎖。

算法總結(jié)如下:

每個進程最開始時都不被標記,執(zhí)行過程有可能被標記。當算法結(jié)束時,任何沒有被標記的進程都是死鎖進程。

①?尋找一個沒有標記的進程 Pi,它所請求的資源小于等于 A。

② 如果找到了這樣一個進程,那么將 C 矩陣的第 i 行向量加到 A 中,標記該進程,并轉(zhuǎn)回 1。

③ 如果沒有這樣一個進程,算法終止。

2.3 死鎖預防

2.4 死鎖避免

(1) 安全狀態(tài)

安全狀態(tài)

圖 a 的第二列 Has 表示已擁有的資源數(shù),第三列 Max 表示總共需要的資源數(shù),F(xiàn)ree 表示還有可以使用的資源數(shù)。從圖 a 開始出發(fā),先讓 B 擁有所需的所有資源(圖 b),運行結(jié)束后釋放 B,此時 Free 變?yōu)?5(圖 c);接著以同樣的方式運行 C 和 A,使得所有進程都能成功運行,因此可以稱圖 a 所示的狀態(tài)時安全的。

定義:如果沒有死鎖發(fā)生,并且即使所有進程突然請求對資源的最大需求,也仍然存在某種調(diào)度次序能夠使得每一個進程運行完畢,則稱該狀態(tài)是安全的。

安全狀態(tài)的檢測與死鎖的檢測類似,因為安全狀態(tài)必須要求不能發(fā)生死鎖。下面的銀行家算法與死鎖檢測算法非常類似,可以結(jié)合著做參考對比。

(2) 單個資源的銀行家算法

一個小城鎮(zhèn)的銀行家,他向一群客戶分別承諾了一定的貸款額度,算法要做的是判斷對請求的滿足是否會進入不安全狀態(tài),如果是,就拒絕請求;否則予以分配。

單個資源的銀行家算法

上圖 c 為不安全狀態(tài),因此算法會拒絕之前的請求,從而避免進入圖 c 中的狀態(tài)。

(3) 多個資源的銀行家算法

多個資源的銀行家算法

上圖中有五個進程,四個資源。左邊的圖表示已經(jīng)分配的資源,右邊的圖表示還需要分配的資源。最右邊的 E、P 以及 A 分別表示:總資源、已分配資源以及可用資源,注意這三個為向量,而不是具體數(shù)值,例如 A=(1020),表示 4 個資源分別還剩下 1/0/2/0。

檢查一個狀態(tài)是否安全的算法如下:

① 查找右邊的矩陣是否存在一行小于等于向量 A。如果不存在這樣的行,那么系統(tǒng)將會發(fā)生死鎖,狀態(tài)是不安全的。

② 假若找到這樣一行,將該進程標記為終止,并將其已分配資源加到 A 中。

③ 重復以上兩步,直到所有進程都標記為終止,則狀態(tài)時安全的。

如果一個狀態(tài)不是安全的,需要拒絕進入這個狀態(tài)。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容