標籤:style blog color 使用 io strong ar 問題 div
死結的條件 互斥條件(Mutual exclusion) :資源不能被共用,只能由一個進程使用。 請求與保持條件(Hold and wait):進程已獲得了一些資源,但因請求其它資源被阻塞時,對已獲得的資源保持不放。 不可搶佔條件(No pre-emption) :有些系統資源是不可搶佔的,當某個進程已獲得這種資源後,系統不能強行收回,只能由進程使用完時自己釋放。 迴圈等待條件(Circular wait) :若干個進程形成環形鏈,每個都佔用對方申請的下一個資源。 處理死結的策略
1、忽略該問題。例如鴕鳥演算法。
2、檢測死結並且恢複。 3、仔細地對資源進行動態分配,以避免死結。 4、通過破除死結四個必要條件之一,來防止死結產生。
鴕鳥演算法:
該演算法可以應用在極少發生死結的的情況下。為什麼叫鴕鳥演算法呢,因為傳說中鴕鳥看到危險就把頭埋在地底下,可能鴕鳥覺得看不到危險也就沒危險了吧。跟掩耳盜鈴有點像。
銀行家演算法:
所謂銀行家演算法,是指在分配資源之前先看清楚,資源分派後是否會導致系統死結。如果會死結,則不分配,否則就分配。
按照銀行家演算法的思想,當進程請求資源時,系統將按如下原則分配系統資源:
(1) 當一個進程對資源的最大需求量不超過系統中的資源數時可以接納該進程。
(2) 進程可以分期請求資源,當請求的總數不能超過最大需求量。
(3) 當系統現有的資源不能滿足進程尚需資源數時,對進程的請求可以延遲分配,但總能使進程在有限的時間裡得到資源。
(4) 當系統現有的資源能滿足進程尚需資源數時,必須測試系統現存的資源能否滿足該進程尚需的最大資源數,若能滿足則按當前的申請量分配資源,否則也要延遲分配。
解決死結的策略
對待死結的策略主要有:
(1) 死結預防:破壞導致死結必要條件中的任意一個就可以預防死結。例如,要求使用者申請資源時一次性申請所需要的全部資源,這就破壞了保持和等待條件;將資源分層,得到上一層資源後,才能夠申請下一層資源,它破壞了環路等待條件。預防通常會降低系統的效率。
(2) 死結避免:避免是指進程在每次申請資源時判斷這些操作是否安全,例如,使用銀行家演算法。死結避免演算法的執行會增加系統的開銷。
(3) 死結檢測:死結預防和避免都是事前措施,而死結的檢測則是判斷系統是否處於死結狀態,如果是,則執行死結解除策略。
(4) 死結解除:這是與死結檢測結合使用的,它使用的方式就是剝奪。即將某進程所擁有的資源強行收回,分配給其他的進程。
死結的避免: 死結的預防是通過破壞產生條件來阻止死結的產生,但這種方法破壞了系統的並行性和並發性。 死結產生的前三個條件是死結產生的必要條件,也就是說要產生死結必須具備的條件,而不是存在這3個條件就一定產生死結,那麼只要在邏輯上迴避了第四個條件就可以避免死結。 避免死結採用的是允許前三個條件存在,但通過合理的資源分派演算法來確保永遠不會形成環形等待的封閉進程鏈,從而避免死結。該方法支援多個進程的並存執行,為了避免死結,系統動態確定是否分配一個資源給請求的進程。方法如下: 1.如果一個進程的當前請求的資源會導致死結,系統拒絕啟動該進程; 2.如果一個資源的分配會導致下一步的死結,系統就拒絕本次的分配; 顯然要避免死結,必須事Crowdsourced Security Testing道系統擁有的資源數量及其屬性
死結原因及解決、避免辦法