1.爲何會出現死鎖?
由於併發的進程分別擁有一部分資源,而又想搶佔其餘進程的資源。(若是隻有一個進程,絕對不會出現死鎖)算法
//資源包括:CPU,I/O通道,各種存儲,設備和數據,文件,數據庫,信號量(且要求資源不會忽然死掉)
數據庫
2.死鎖模型 安全
P表明進程 R表明資源,R裏面的點的個數表明資源的個數併發
不會發生死鎖,由於P3使用完R3以後必定會釋放spa
會出現死鎖。操作系統
不會出現死鎖(雖然有環)blog
3.死鎖的特徵(只是死鎖的必要條件)排序
(1)互斥:資源同一時間只能被一個進程擁有,若是能夠同時擁有,也不會出現死鎖隊列
(2)持有並等待:進程保持至少一個資源,而且在等待獲取其餘進程持有的額外資源進程
(3)無搶佔:一個資源只能被進程完成任務後自動釋放
(4)循環等待:就是幾個進程互相等待
4.死鎖的處理辦法
(1)死鎖預防:只有打破死鎖的一個必要條件,就不會出現死鎖
打破互斥:使資源能夠同時被進程佔用(不太好)
打破持有並等待:不持有一部分資源。我要麼不拿,要麼就拿到所有的資源(這樣會使得系統的利用率很低,使某些進程飢餓,也很差)
打破無搶佔:能夠搶佔(想搶佔的話只能kill一部分資源,太暴力)
打破循環等待:對全部資源進行排序,並要求每一個進程按照資源的順序進行申請。(適用於資源比較有限的系統,好比嵌入式系統)
好比說有進程A,B和資源1,2。而且這兩個進程都須要這兩個資源。
只有先申請到了1才能去申請2,這樣就不會出現一個佔有1,一個佔有2的狀況。
(2)死鎖避免:某進程申請資源時判斷是否會出現不安全狀態,若是會出現,就不將該資源分配給此進程
不安全狀態包括死鎖狀態
安全狀態的定義:針對全部進程,存在安全序列(因此須要尋找安全序列)
序列<p1,p2...pn>是安全的:順序執行這些進程,若是每一個進程都能順利執行,該序列就是安全序列
1)對於每一個pi,pi要求的資源可以由當前可用資源+全部的pj持有的資源來知足(j<i)
2)pi完成以後,pi+1能夠獲得所需資源,執行完後返回資源
好比這張圖,p1,p2都須要R1,R2 ,而且p1得到了R1
(1)P1申請R2時,若將R2分配給P1
序列<p1,p2>是安全的,序列<p2,p1>是不安全的
存在安全序列,申請成功
(2)P2申請R2時,若將R2分配給P2
序列<p1,p2>和序列<p2,p1>都是不安全的,
不存在安全序列,申請失敗
(3)死鎖避免的經典算法--銀行家算法 假設A,B,C的資源總數分別爲 10,5,7
表爲T0時刻的資源狀態圖
進程\資源情況 | max A B C |
Allocation(分配) A B C |
Avaliable(可利用) A B C |
P0 | 7 5 3 | 0 1 0 | 3 3 2 |
P1 | 3 2 2 | 2 0 0 | |
P2 | 9 0 2 | 3 0 2 | |
P3 | 2 2 2 | 2 1 1 | |
P4 | 4 3 3 | 0 0 2 |
max表示的是各個進程在整個執行階段所須要的各種資源
Allocation表示的是當前時刻已經給各個進程分配的資源
max-Allocation 獲得的就是各個進程剩餘時間內還須要的進程矩陣
減去 =
max Allocation Need
將Avaliable 與Need矩陣進行比較,發現p1和p3安全,也就是操做系統當前擁有的資源能夠供p1或p3進程完成他因此的操做
咱們選擇p1完成,p1加入安全隊列
Avaliable 更新爲 (3 3 2) + (2 0 0) = (5,3,2)
按照一樣的方法獲得安全序列<p1,p3,p4,p2,p0> 固然這裏的安全序列不止一個
(4)死鎖檢測與恢復
容許程序進入死鎖,若是檢測到了死鎖,就啓動恢復機制解除死鎖
把資源分配圖簡化爲等待圖:
等待圖若是有環,代表可能死鎖了
死鎖解除的方法:
(1)資源剝奪法:掛起某些死鎖進程,並搶佔它的資源,將該資源分配給其餘的死鎖進程。
但應防止被掛起的進程長時間得不到資源
(2)撤銷進程法:強制撤銷部分甚至所有死鎖進程並剝奪這些進程的資源。
撤銷的原則按照進程優先級和撤銷代價的高低進行
(3)進程回退法:讓一(多)個進程回退到足以迴避死鎖的地步,進程回退時自願釋放
資源而不是被剝奪。要求系統保持進程的歷史信息,設置還原點