1. 資源
可搶佔資源/不可搶佔資源
2. 死鎖
如果一個進程集合中的每個進程都在等待只能由該進程集合中的其他進程才能引發的事件,那麼該進程集合就是死鎖的。
3. 死鎖發生的四個必要條件
1) 互斥條件:每個資源要麼已經分配給了一個進程,要麼就是可用的
2) 佔有和等待條件:已經得到了某個資源的進程可以再請求新的資源
3) 不可搶佔條件:已經分配的資源不能被搶佔,只能由佔有它的進程顯式釋放
4) 環路等待條件:系統中有兩個或兩個以上進程形成環路,環路中每個進程都在等待下一個進程所佔有的資源
4. 死鎖建模
□表示資源類型,O表示進程
5. 四種處理死鎖的策略
1) 忽略該問題(鴕鳥算法)
2) 檢測死鎖並恢復
3) 仔細對資源進行分配,動態地避免死鎖
4) 通過破壞引起死鎖的四個必要條件之一,防止死鎖發生
6. 死鎖的檢測
1) 每種類型一個資源的死鎖檢測
建模檢測是否有環
2) 每種類型多個資源的死鎖檢測
當前分配矩陣C,請求矩陣R
步驟:
(1) 尋找一個沒有標記的進程Pi,對它而言R矩陣的第i行向量小於等於A。
(2) 如果找到了這樣一個進程,那麼將C矩陣的第i行向量加到A中,標記該進程,並轉到第一步。
(3) 如果沒找到,算法終止。
如果算法結束,存在沒有標記的進程,則爲死鎖進程。
7. 死鎖的恢復
1) 利用搶佔恢復
2) 利用回滾恢復(檢查點檢查)
3) 通過殺死進程恢復
8. 死鎖避免
1) 資源軌跡圖
2) 從安全狀態出發,系統就能夠保證所有進程都能完成,而從不安全狀態出發,就沒有的保證
3) 銀行家算法
9. 銀行家算法
檢查一個狀態是否安全的算法
(矩陣:已分配資源,仍需要資源)
(向量:E現有資源,P已分配資源,A可用資源)
1) 查找仍需要資源矩陣中是否有一行,其沒有被滿足的資源數小於等於A,如果不存在這樣的行,那麼系統將會死鎖
2) 假若找到這樣一行,那麼可以假設它獲得所需資源並運行結束,將該進程標記爲終止,並將其資源加到向量A上。
3) 重複以上兩步,如果最後所有進程都標記爲終止,其初始狀態是安全的,如果所有進程的資源需求得不到滿足,則發生了死鎖。
10. 死鎖的預防
1) 破壞互斥條件(使用假脫機技術)
2) 破壞佔有和等待條件(在開始就請求全部資源)
3) 破壞不可搶佔條件(搶佔資源)
4) 破壞環路等待條件(對資源按序編號)
11. 兩階段加鎖
第一階段:試圖對所有所需記錄加鎖,如某個進程已被加鎖,釋放該進程的所有加鎖記錄,重新開始第一階段。
第二階段:第一階段加鎖成功後,完成更新然後釋放鎖。
該算法只適用於程序員可以安排程序停下和重新開始而不會產生錯誤的情況(如數據庫系統)。
12. 通信死鎖
在一系列進程中,每個進程因爲等待另外一個進程引發的事件而產生阻塞,可採用超時機制解決。
13. 活鎖
沒有阻塞但也沒有進展。
14. 飢餓
進程無限制地推後,得不到執行,可採用先來先服務資源分配策略避免。