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)

圖 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)。