1.必要條件

① 互斥:每個(gè)資源要么已經(jīng)分配給了一個(gè)進(jìn)程,要么就是可用的。
② 占有和等待:已經(jīng)得到了某個(gè)資源的進(jìn)程可以再請(qǐng)求新的資源。
③ 不可搶占:已經(jīng)分配給一個(gè)進(jìn)程的資源不能強(qiáng)制性地被搶占,它只能被占有它的進(jìn)程顯式地釋放。
④ 環(huán)路等待:有兩個(gè)或者兩個(gè)以上的進(jìn)程組成一條環(huán)路,該環(huán)路中的每個(gè)進(jìn)程都在等待下一個(gè)進(jìn)程所占有的資源。
2.處理方法
2.1 鴕鳥策略
說白了就是忽略死鎖。
因?yàn)榻鉀Q死鎖問題的代價(jià)很高,因此鴕鳥策略這種不采取任務(wù)措施的方案會(huì)獲得更高的性能。當(dāng)發(fā)生死鎖時(shí)不會(huì)對(duì)用戶造成多大影響,或發(fā)生死鎖的概率很低,可以采用鴕鳥策略。
大多數(shù)操作系統(tǒng),包括 Unix,Linux 和 Windows,處理死鎖問題的辦法僅僅是忽略它。
2.2 死鎖檢測(cè)與死鎖恢復(fù)
(1)? 檢測(cè)單線程死鎖

上圖為資源分配圖,其中方框表示資源,圓圈表示進(jìn)程。資源指向進(jìn)程表示該資源已經(jīng)分配給該進(jìn)程,進(jìn)程指向資源表示進(jìn)程請(qǐng)求獲取該資源。圖 a 可以抽取出環(huán),如圖 b,它滿足了環(huán)路等待條件,因此會(huì)發(fā)生死鎖。
每種類型一個(gè)資源的死鎖檢測(cè)算法是通過檢測(cè)有向圖是否存在環(huán)來實(shí)現(xiàn),從一個(gè)節(jié)點(diǎn)出發(fā)進(jìn)行深度優(yōu)先搜索,對(duì)訪問過的節(jié)點(diǎn)進(jìn)行標(biāo)記,如果訪問了已經(jīng)標(biāo)記的節(jié)點(diǎn),就表示有向圖存在環(huán),也就是檢測(cè)到死鎖的發(fā)生。
(2)檢測(cè)多個(gè)進(jìn)程死鎖

上圖中,有三個(gè)進(jìn)程四個(gè)資源,每個(gè)數(shù)據(jù)代表的含義如下:
① E 向量:資源總量
② A 向量:資源剩余量
③ C 矩陣:每個(gè)進(jìn)程所擁有的資源數(shù)量,每一行都代表一個(gè)進(jìn)程擁有資源的數(shù)量
④ R 矩陣:每個(gè)進(jìn)程請(qǐng)求的資源數(shù)量
進(jìn)程 P1?和 P2?所請(qǐng)求的資源都得不到滿足,只有進(jìn)程 P3?可以,讓 P3?執(zhí)行,之后釋放 P3?擁有的資源,此時(shí) A = (2 2 2 0)。P2?可以執(zhí)行,執(zhí)行后釋放 P2?擁有的資源,A = (4 2 2 1) 。P1?也可以執(zhí)行。所有進(jìn)程都可以順利執(zhí)行,沒有死鎖。
算法總結(jié)如下:
每個(gè)進(jìn)程最開始時(shí)都不被標(biāo)記,執(zhí)行過程有可能被標(biāo)記。當(dāng)算法結(jié)束時(shí),任何沒有被標(biāo)記的進(jìn)程都是死鎖進(jìn)程。
①?尋找一個(gè)沒有標(biāo)記的進(jìn)程 Pi,它所請(qǐng)求的資源小于等于 A。
② 如果找到了這樣一個(gè)進(jìn)程,那么將 C 矩陣的第 i 行向量加到 A 中,標(biāo)記該進(jìn)程,并轉(zhuǎn)回 1。
③ 如果沒有這樣一個(gè)進(jìn)程,算法終止。
2.3 死鎖預(yù)防
2.4 死鎖避免
(1) 安全狀態(tài)

圖 a 的第二列 Has 表示已擁有的資源數(shù),第三列 Max 表示總共需要的資源數(shù),F(xiàn)ree 表示還有可以使用的資源數(shù)。從圖 a 開始出發(fā),先讓 B 擁有所需的所有資源(圖 b),運(yùn)行結(jié)束后釋放 B,此時(shí) Free 變?yōu)?5(圖 c);接著以同樣的方式運(yùn)行 C 和 A,使得所有進(jìn)程都能成功運(yùn)行,因此可以稱圖 a 所示的狀態(tài)時(shí)安全的。
定義:如果沒有死鎖發(fā)生,并且即使所有進(jìn)程突然請(qǐng)求對(duì)資源的最大需求,也仍然存在某種調(diào)度次序能夠使得每一個(gè)進(jìn)程運(yùn)行完畢,則稱該狀態(tài)是安全的。
安全狀態(tài)的檢測(cè)與死鎖的檢測(cè)類似,因?yàn)榘踩珷顟B(tài)必須要求不能發(fā)生死鎖。下面的銀行家算法與死鎖檢測(cè)算法非常類似,可以結(jié)合著做參考對(duì)比。
(2) 單個(gè)資源的銀行家算法
一個(gè)小城鎮(zhèn)的銀行家,他向一群客戶分別承諾了一定的貸款額度,算法要做的是判斷對(duì)請(qǐng)求的滿足是否會(huì)進(jìn)入不安全狀態(tài),如果是,就拒絕請(qǐng)求;否則予以分配。

上圖 c 為不安全狀態(tài),因此算法會(huì)拒絕之前的請(qǐng)求,從而避免進(jìn)入圖 c 中的狀態(tài)。
(3) 多個(gè)資源的銀行家算法

上圖中有五個(gè)進(jìn)程,四個(gè)資源。左邊的圖表示已經(jīng)分配的資源,右邊的圖表示還需要分配的資源。最右邊的 E、P 以及 A 分別表示:總資源、已分配資源以及可用資源,注意這三個(gè)為向量,而不是具體數(shù)值,例如 A=(1020),表示 4 個(gè)資源分別還剩下 1/0/2/0。
檢查一個(gè)狀態(tài)是否安全的算法如下:
① 查找右邊的矩陣是否存在一行小于等于向量 A。如果不存在這樣的行,那么系統(tǒng)將會(huì)發(fā)生死鎖,狀態(tài)是不安全的。
② 假若找到這樣一行,將該進(jìn)程標(biāo)記為終止,并將其已分配資源加到 A 中。
③ 重復(fù)以上兩步,直到所有進(jìn)程都標(biāo)記為終止,則狀態(tài)時(shí)安全的。
如果一個(gè)狀態(tài)不是安全的,需要拒絕進(jìn)入這個(gè)狀態(tài)。