現代作業系統 死鎖

2021-07-09 09:36:43 字數 3526 閱讀 3222

前言:

《現代作業系統》死鎖這一部分也是非常的重要,在這裡詳細介紹了死鎖出現的條件已經避免死鎖的方法。

我的github:

死鎖:

概述:

一、資源定義:

1. 我們把需要排他性使用的物件叫做資源。

2. 資源分成可搶占和不可搶占型

二、死鎖定義:

如果乙個程序集合中的每個程序都在等待只能由該程序合集中的其他程序才能引發的事件,那麼,該程序合集就是死鎖的。

三、死鎖條件:

1. 互斥條件,每個資源要麼已經分配給了乙個程序,要麼就是可用的。

2. 占有和等待條件,已經得到了某個資源的程序可以再請求新的資源。

3. 不可搶占條件,已經分配給乙個程序的資源不能強制性的被搶占,它只能被占有它的程序顯示的釋放。

4. 環路等待條件。死鎖發生時,系統中一定有由兩個或兩個以上的程序組成的一條環路,該環路中的每個程序都在等待著下乙個程序所占有的資源。

死鎖發生時,以上四個條件一定是同時滿足的,如果其中任何乙個條件不成立,死鎖就不會發生。

處理死鎖:

一、處理死鎖策略:

1. 忽略該問題

2. 檢測出死鎖並恢復

3. 仔細對資源進行分配,避免死鎖

4. 通過破壞引起死鎖的四個條件之一,防止死鎖發生。

二、鴕鳥演算法:

如果死鎖發生的概率小,並且預防死鎖比發生死鎖後再解決成本高的多,那麼可以考慮不管死鎖。

三、死鎖檢測:

使用這種技術時,系統不試圖阻止死鎖的產生,而是允許死鎖發生,當檢測到死鎖發生後,採取措施恢復。

2每種型別乙個資源的死鎖檢測:

對於圖中的死鎖,可以用如下方法檢測:

對圖中每乙個節點n,將n作為起始點執行下面5個步驟.

將l初始化為空表,並清除所有的有向邊標記

將當前節點新增到l的尾部,並檢測該節點是否在l中已出現兩次.如果是,那麼該圖包含了乙個環,演算法結束.

從給定的節點開始,檢測是否存在沒有標記的從該節點出發的弧(有向邊).如果存在做第五步,如果不存在第六步

隨機選取一條沒有標記的從該節點出發的弧,標記它.然後順著這條弧線找到新的當前節點,返回到第三步.

如果這乙個節點是起始節點,那麼表明該圖不存在任何環,演算法結束.否則意味著我們走入了死胡同,所以需要移走該節點,返回前乙個節點,即當前節點前乙個節點,並將它作為新的當前節點,同時轉到第三步.

這一演算法是依次將每乙個節點作為一棵樹的根節點,並進行深度優先搜尋.如果再次碰到已經遇到過的節點,那麼就算找到乙個環.如果從任何給定節點出發的弧都被窮舉了,那麼就回溯到前面的節點,如果回溯到根並不能再深入下去,那麼從當前節點觸發的子圖中就不包含任何環.如果對每個節點都是如此,那麼整個圖就不存在環,也就是說系統並不存在死鎖.

對於每種型別多個資源的死鎖檢測:

通過可用資源向量,當前分配矩陣以及請求矩陣來判斷是否發生了死鎖。

一旦檢測出系統中出現了死鎖,就應使陷入死鎖的程序從死鎖狀態中解脫出來。常用的解除死鎖方法有3種:

1. 利用搶占恢復:

臨時將某個資源從它當前的所有者**轉移到另乙個程序

2. 利用回滾恢復:

週期性的對程序進行檢查點檢查,一旦檢測到死鎖,就恢復上乙個正常的檢查點。

3. 通過殺死程序恢復:

殺死死鎖環中的乙個程序,就可以恢復。

死鎖避免:

一、資源軌跡圖:

資源軌跡圖中,只能向上或者向右,因此要避免進入無法前進的不安全區域。

二、多個資源的銀行家演算法:

銀行家演算法中使用的資料結構如下:

銀行家演算法的流程圖如下:

「矩陣三兄弟」具有如下關係:need[i][j]=max[i][j]-allocation[i][j]; 

三、死鎖預防:

1. 破壞互斥條件:

允許資源同時被多個程序佔據,例如假離線印表機技術,只有印表機守護程序在真正的使用資源。

2. 破壞占有和等待條件:

a. 規定所有程序在開始執行時就需要請求所有資源,如果請求成功才可以執行,否者不允許執行。但是一般來說,程序並不能在開始時知道需要使用多少資源。

b. 當乙個程序請求資源時,需要先暫時釋放其當前所占有的所有資源,然後再嘗試一次性獲得所有資源。

3. 破壞不可搶占條件:

印表機等可以進行虛擬化的資源,可以如此進行。

4. 破壞環路等待條件:

為了破壞環路等待條件,可以採用有序資源分配法。有序資源分配法是將系統中的所有資源都按型別賦予乙個編號(例如印表機為1,磁帶機為2),要求每乙個程序均嚴格按照編號遞增的次序請求資源,同類資源一次申請完。

其他問題:

一、 兩階段加鎖:

雖然在一般情況下預防死鎖和避免死鎖並不是很有希望,但是在一些特殊的應用方面,有很多卓越的專用演算法. 

例如資料庫中常用的辦法是兩階段加鎖.在第一階段,程序試圖對所有所需的記錄進行加鎖,一次鎖乙個記錄.如果第一階段成功,就開始第二階段,完成更新然後釋放鎖.在第一階段並沒有做實際的工作. 

如果在第一階段某個程序需要的記錄已經被加鎖,那麼該程序釋放它所有的加鎖記錄,然後重新開始第一階段.從某種意義上說,這種方法類似於提前或者至少是未實施一些不可逆操作之前請求所有的資源.在兩階段加鎖的一些版本中,如果在第一階段碰到了已經加鎖的記錄,並不會釋放鎖然後重新開始,這就可能導致死鎖. 

但是在一般情況中,這種策略並不通用,因為,讓乙個程序重新開始是不現實的.

二、 通訊死鎖:

等待資訊到達導致的死鎖,我們叫做通訊死鎖,使用超時機制,可以解決這個問題。

三、 活鎖:

在某種情形下,輪詢可用於進入臨界區或者獲取資源. 但是永遠獲取不到,但是也未被阻塞,稱為活鎖。

四、飢餓:

在動態執行的系統中,在任何時刻都有可能請求資源,這就需要一些策略來決定在什麼時候誰獲得資源.雖然這個策略表面上很有道理,但是依然有可能使一些程序永遠得不到服務,雖然它們並不是死鎖程序.。這樣的事情就叫做飢餓。

總結:

死鎖這一部分非常重要,在程式設計時一旦涉及到資源,就一定要盡量避免出現這樣的問題。

現代作業系統 死鎖

死鎖的規範定義 如果乙個程序集合中的每個程序都在等待只能由該程序集合中的其他程序才能引發的事件,那麼該程序集合就是死鎖的。大部分死鎖都與資源相關。資源分為兩類 可搶占和不可搶占的,可搶占資源可以從擁有它的程序中搶占而不會產生任何 儲存器就是一類可搶占的資源。例如,乙個系統擁有256m的使用者記憶體和...

現代作業系統

只有認為等待時間非常短的情形下,才使用忙等待。用於忙等待的鎖,稱為自旋鎖 spin lock 在互斥時間很短而掛起等待的時間開銷很大時,可以採用活鎖 livelock,沒有出現死鎖,但現象上看好像死鎖發生了 輪詢 忙等待 可用於進入臨界區或訪問資源。接收者發起的分布式啟發演算法。分布式系統新增在其底...

《現代作業系統》讀書筆記 死鎖篇

標籤 讀書筆記 校招 作業系統 面試 可剝奪資源 是指雖然資源佔有者程序需要使用該資源,但另乙個程序可以強行把該資源從佔有者程序處剝奪來歸自己使用。不可剝奪資源 是指除佔有者程序不再需要使用該資源而主動釋放資源,其他程序不得在佔有者程序使用資源過程中強行剝奪。如果乙個程序集合中的每個程序都在等待只能...