作業系統(5) 死鎖的概念 死鎖產生的必要條件 死鎖的處理策略 預防死鎖 避免死鎖 死鎖的檢測和解除 銀行家演算法

[Arcadian]發表於2020-12-27

死鎖

一、死鎖的概念

1. 死鎖、飢餓、死迴圈的區別

(1) 死鎖:各程式互相等待對方手裡的資源,導致各程式都阻塞,無法向前推進
(2) 飢餓:長期得不到想要的資源,某程式無法向前推進
(3) 死迴圈:某程式執行過程中一直跳不出某個迴圈
在這裡插入圖片描述

2. 死鎖產生的必要條件

產生死鎖必須同時滿足以下四個條件,若有一個不滿足,死鎖就不會發生

(1) 互斥條件:對互斥使用的資源的爭奪才會導致死鎖
(2) 不剝奪條件:程式獲得的資源在未使用完之前,不能由其他程式強行奪走,只能主動釋放
(3) 請求和保持條件:程式已經保持了至少一個資源,但又提出了新的資源請求,而該資源又 被其他程式佔有,此時請求程式被阻塞,但又對自己已有的資源保持不放
(4) 迴圈等待條件:存在一種程式資源的迴圈等待鏈,鏈中的每一個程式已獲得的資源同時被 下一個程式所請求

注意:發生死鎖時一定有迴圈等待,但是發生迴圈等待時未必死鎖

3. 死鎖的處理策略

(1) 預防死鎖:破壞死鎖產生的四個必要條件中的一個或幾個
(2) 避免死鎖:用某種方法防止系統進入不安全狀態,從而避免死鎖
(3) 死鎖的檢測和解除:允許死鎖的發生,作業系統檢測出死鎖後,會採取措施解除死鎖

  1. 知識回顧

在這裡插入圖片描述

二、死鎖的處理策略 — 預防死鎖

在這裡插入圖片描述

三、死鎖的處理策略 — 避免死鎖

1. 安全序列的介紹

所謂安全序列,就是指如果系統按照這種序列分配資源,則每個程式都能順利完成,只要能找 出一個安全序列,系統就是安全狀態 (安全序列可能有多個)

如果分配了資源以後,系統中找不出任何一個安全序列,系統就進入了不安全狀態,這就意味 著之後可能所有程式都無法順利的執行下去

注意:

(1) 如果系統處於安全狀態,就一定不會發生死鎖
(2) 如果系統進入不安全狀態,就可能發生死鎖
(3) 處於不安全狀態未必會發生死鎖,但發生死鎖時一定處於不安全狀態

2. 銀行家演算法

思想:在資源分配之前預先判斷這次分配是否會導致系統進入不安全狀態,由此決定是否答應 資源分配請求

在這裡插入圖片描述
在這裡插入圖片描述

注:如果銀行家演算法是安全性演算法,說明此時系統處於安全狀態,不會發生死鎖

四、死鎖的處理策略 — 死鎖的檢測與解除

1. 死鎖的檢測

為了能對系統是否發生了死鎖進行檢測,必須:

(1) 用資源分配圖儲存資源的請求和分配資訊
(2) 提供一種演算法,利用上述資訊檢測系統是否進入死鎖狀態

在這裡插入圖片描述

P2程式請求1個資源,但R1的3個資源都已經分配出去,無法執行;P1程式請求1個資 源,R2剩餘1個資源,P1執行;P1執行完畢之後,釋放自身的所有資源,P1的三條邊全 部消除;R1剩餘的資源可滿足P2程式;P2程式執行,P2的三條邊全部消除

注意:

(1) 如果按照上述過程可以消除所有的邊,表示此圖可完全簡化,不會發生死鎖
(2) 如果不能消除所有的邊,說明發生了死鎖
(3) 最終還連著邊的那些程式就是死鎖程式

2. 死鎖的解除

一旦檢測出死鎖的發生,就應該立即解除死鎖,解除死鎖的方法有:

(1) 資源剝奪法

掛起某些死鎖程式,並搶佔它的資源,將這些資源分配給其他的死鎖程式;但是應防止被 掛起的程式長時間得不到資源而飢餓

(2) 撤銷程式法

強制撤銷部分甚至全部死鎖程式,並剝奪這些程式的資源

(3) 程式回退法

讓死鎖程式回退到足以避免死鎖的地步 (這就要求系統記錄歷史資訊、設定還原點)

3. 知識回顧

在這裡插入圖片描述

相關文章