下面我們來介紹,解決死鎖問題的各種方案
首先我們介紹第一種型別,叫做
死鎖預防
我們首先先總體介紹一下
解決死鎖問題的各種方法。
不同的設計者
對於死鎖問題的看法是不一樣的
有的設計者很樂觀
,有的設計者很悲觀
因此,他用於解決死鎖問題的方法,是不一樣的
我們總體上,
有四種方法,來解決死鎖問題
。第一種方法呢
叫做鴕鳥演算法
,其實它的思路是
不考慮此問題,不理睬死鎖問題
第二種方法呢,是不讓死鎖發生
那麼也就是說,死鎖這個問題很嚴重
我們一定要防範,不讓死鎖發
生不讓死鎖發生呢,這一類方法當中呢,實際上又分成了兩種方法
一種呢,是叫
做死鎖預防
死鎖預防是不讓死鎖發生的乙個
靜態策略
它的主要思想是,通過設計合適的資源分配演算法
,由資源分配演算法來保證
不會出現死鎖。
不讓死鎖發生
的第二類方法呢,叫做
死鎖避免
死鎖避免是指的乙個解決死鎖問題的
動態策略
它指的是
以不讓死鎖發生為目標
不斷地動態地來跟蹤
評估資源分配過程
。根據這個評估的結果來決定
分配是否進行。
這是兩個方法,但是呢都屬於不讓死鎖發生的這樣乙個角度
第三類方法呢,我們是讓死鎖發生
但是呢,我們不是置之不理,而是
通過死鎖的檢測
判斷是不是死鎖真的發生,然後再採用
一些方法,來解除死鎖問題
歸納起來呢,總體解決死鎖的方法呢,可以算為四類
第一類呢我們稱之為鴕鳥演算法,就是不理睬這個死鎖問題,非常的樂觀
第二類呢,叫做死鎖預防
它是乙個靜態的策略。
第三類叫做死鎖
避免,它是乙個動態的策略
第四類呢是叫做死鎖的檢測與解除。
我們後面呢,就要介紹死鎖
預防,死鎖避免。
死鎖檢測與解除。
首先我們來介紹
死鎖預防
。所謂死鎖預防呢,
指的是在設計系統的過程中
就確定乙個合適的資源分配演算法
通過這樣乙個資源分配演算法,我們排除
產生死鎖的可能性。
怎麼樣來
設計相應的資源分配演算法呢?通常呢有這樣乙個典型的解決思路,也就是
防止產生死鎖的四個必要條件當中的任何乙個條件發生
那麼,就可以進行死鎖預防了。
所以下面呢,我們就從
不讓這四個必要條件當中的某乙個條件
發生來提出相應的解決方案
我們的設計思路就是破壞產生
死鎖的四個必要條件之一
。我們先來看一下
第乙個條件,第乙個條件呢是互斥使用,或者叫做資源獨佔
那麼我們怎麼樣來破壞這個條件呢
資源本身它的特性是
獨佔的 是
排他性使用的,
所以我們必須採用一種資源轉換
技術,把這個獨佔的資源變成乙個可共享的資源
以印表機為例
由於我們引入了 spooling 技術,我們就解決了 不允許任何程序直接占用印表機的這樣乙個問題 那麼在這裡呢,實際上是我們,方法其實我們前面已經介紹過了
它主要是設計乙個"守護程序"或者
"守護執行緒
", 由這個程序或執行緒來負責管理印表機 乙個程序需要列印的時候呢,是把請求 傳送給這個守護程序或者執行緒
--daemon
由它來完成列印的任務 這樣的話呢,就把乙個獨佔的資源,把它轉換成乙個共享的資源,就破壞了這樣乙個
"資源獨佔
/互斥使用
"的條件
第二個條件呢,是
"占有且等待
"條件 "占有且等待
"呢,指的是乙個程序申請到了一部分資源 在申請其他資源的時候由於得不到滿足而進入等待狀態 那麼,破壞這個條件呢,我們可以通過這樣乙個實現方案 也就是說,
要求每個程序,在執行前
一次性申請它所需要的所有資源
而系統呢,會
當這個程序所需要的資源都可滿足的時候,一次性給
這個程序呢進行分配。
因此呢這個程序
拿到了它所需要的所有資源,在執行過程中不會再申請新的資源,也就不會出現等待狀態
當然我們知道,這個做法,實際上
它的資源利用率非常的低
,因為原來我們採用的是
動態申請資源的策略
這樣它就又退化成了乙個靜態資源分配策略了
,所以資源利用率就降低了
同時它可能還會導致乙個"飢餓
"現象的發生,因為乙個程序它要的各種資源 不能同時滿足的情況下,這個程序的 執行就會被推遲,延遲,所以呢就產生
了飢餓那麼第二種實現方案呢,就是說,在允許
程序動態申請資源的前提下
那麼當乙個程序在申請新的資源得不到滿足的時候
那麼它要進入等待狀態,在它進入等待狀態之前,它把它以前
得到的這個資源,占有的資源呢,全部釋放掉
那麼如果它從等待變成就緒呢
那麼它再重新申請這些資源
也就是,主動把它放棄,在等待之前
當然這樣的話呢,也會導致一些問題,比如說它再申請新的資源
那麼這些資源的狀態,不是它剛才使用的狀態了,怎麼辦
另外呢,它申請新的資源又得不到了,那麼它也可能會導致
"飢餓"
現象下面呢我們來介紹
破壞第三個條件,"不可搶占
"那麼實現的方案呢是這樣的。
當乙個程序
在申請資源的時候,那麼這個資源被其他的程序所占有時
可以通過作業系統來搶占這個資源
,那麼這種實現方案呢,主要要考慮,兩個
程序他們的優先順序是不一樣的,我們要區別對待
那麼這種方法呢,
是具有侷限性
它主要是適合於,狀態易於儲存和恢復的這樣的資源
前面我們提到的記憶體、 cpu,都屬於這種資源
cpu的話我們
說程序可以通過搶占式的排程演算法
然後從其他程序手裡頭,搶占cpu記憶體也可以
通過頁面置換演算法
,把乙個程序的一些頁面呢置換到
磁碟上去,然後把其他的內容呢讀入到記憶體的頁框裡頭
那麼這都屬於一種資源的搶占
下面我們來介紹
破壞"迴圈等待
"條件所採用的方法
主要的思想呢,是通過定義資源型別的線性順序
來實現破壞迴圈等待條件
具體的方案呢,有乙個稱之為
資源的有序分配法,
所謂資源的有序分配法
指的是首先把系統當中的所有資源進行編號
並且要求程序在申請資源的時候
要嚴格按照編號的遞增的次序來進行
如果你違反了這樣乙個次序
作業系統就不予分配,
在實現資源的有序分配法時
我們要考慮如何對資源進行編號
哪些資源的編號在前面?
哪些資源的編號在後面?通常呢
我們可以
按照資源使用的頻繁性
常使用的資源呢,我們通常把它放到前面
不常使用的資源呢,我們把它在後面,
那這樣的話呢,可以
很好地來實現資源的有序分配法
當然了,我們後面我們會
介紹哲學家就餐問題,那麼它在解決
哲學家就餐問題的時候呢,可以採用資源的有序分配法
為什麼資源有序分配法
採用了之後,不會產生死鎖問題呢?
那麼這裡可以證明這一點,那麼我們在這裡呢給出乙個
簡單的序數,假如說
有資源編號是從 1到
10 現在有若干個程序需要使用這些資源
我們簡單地舉了乙個小例子
p1這個程序呢它需要三個資源,
1號、
3 號和 9 號
p2 呢這個程序呢,它需要
1 號、
2 號、
5 號 三個資源,
當然了後面的就省略沒有展示出來
那麼我們看一下,
在任何乙個時刻
我們在這個程序的集合當中,總能夠找到乙個程序
這個程序它得到的
資源編號是最大的那乙個,也就是說它得到了一些資源
那麼在這些資源當中呢,因為它是按順序申請的
所以它拿到了目前為止,得到資源的編號最
大的那個資源是在這個程序數里頭
所以我們在這個程序集合裡頭,可以找到這樣的程序
它拿到了當前所分配資源當中,資源編號最大的乙個
那我們從這個程序出發
後序,因為後序的資源編號
都會比它所占有的資源編號大
而後序的這些資源都沒有分配出去,所以讓這個程序
繼續申請,它後面再申請的任何資源其實都是能滿足的
按照我們前面的假設,如果資源都滿足了,那麼它就可以把
資源使用完還回給系統,這樣的話呢程序,這個程序就執行完成
那麼這個集合呢,從 n 個程序,就變成了
n-1
個程序 然後我們再從
n-1
個程序當中,繼續尋找 當前占有這個資源編號最大的那個程序 然後把後序的資源分給這個程序,那麼這個
n-1
這個集合的程序數呢 就變成了
n-2
那麼不斷地消解,那我們最後所有的程序都能夠完成 那麼這樣系統就不會出現死鎖,啊,這就是簡單 描述了一下這個證明的乙個思路
作業系統複習(十一) 死鎖相關知識點整理
死鎖是指兩個或兩個以上的程序在執行過程中,由於競爭資源或者由於彼此通訊而造成的一種阻塞的現象,若無外力作用,它們都將無法推進下去。此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的程序稱為死鎖程序。是作業系統層面的乙個錯誤,是程序死鎖的簡稱。實際上來說,計算機系統中有很多一次只能由乙個程序...
作業系統學習 14 預防死鎖與死鎖解除
如前所述,詳情見 作業系統學習 13.死鎖的原因與必要條件,預防死鎖和避免死鎖這兩種方法實質上都是通過施加某些限制條件,來預防發生死鎖。兩者的主要差別在於 為預防死鎖所施加的限制條件較嚴格,這往往會影響程序的併發執行 而為避免死鎖所施加的限制條件則較寬鬆,這給程序的執行提供了較寬鬆的環境,有利於程序...
作業系統 死鎖的預防 避免和解除
預防死鎖 破壞環路等待條件是屬於死鎖的預防 該方法是通過設定某些限制條件,去破壞產生死鎖的四個必要條件的乙個或多個條件,來預防發生死鎖。易實現,被廣泛使用,但由於所施加的限制條件往往太嚴格,因而可能導致系統資源利用率和吞吐量降低。避免死鎖 典型的銀行家演算法是屬於死鎖的避免 避免死鎖是在資源的動態分...