第3章 3-3死鎖 銀行家算法

關(guān)于死鎖

????????多道程序系統(tǒng)借助并發(fā)執(zhí)行改善資源利用率,提高系統(tǒng)吞吐量,但可能發(fā)生一種危險——死鎖。

????????死鎖(Deadlock):指多個進程在運行過程中,因爭奪資源而造成的一種僵局。當進程處于這種狀態(tài)時,若無外力作用,它們都將無法再向前推進。

? ??????死鎖(Deadlock): 指進程之間無休止地互相等待!

? ??????饑餓(Starvation):指一個進程無休止地等待!

四、產(chǎn)生死鎖的原因和必要條件

? ??????產(chǎn)生死鎖的原因可歸結(jié)為如下兩點:

????????????????競爭資源。系統(tǒng)中供多個進程共享的資源如打印機、公用隊列等的數(shù)目不滿足需要時,會引起資源競爭而產(chǎn)生死鎖。

????????????????進程間推進順序非法。進程在運行過程中,請求和釋放資源的順序不當,同樣會導致死鎖。

1、競爭資源引起進程死鎖

????????可把系統(tǒng)中的資源分為兩類:

????????????????可剝奪和非剝奪性資源

????????????????????????可剝奪性資源:分配給進程后可以被高優(yōu)先級的進程剝奪。如CPU和主存。

????????????????????????不可剝奪性資源:分配給進程后只能在進程用完后釋放。如磁帶機、打印機等。

????????????????永久性資源和臨時性資源

????????????????????????永久性:打印機。可順序重復使用

????????????????????????臨時性:進程產(chǎn)生被其他進程短暫使用的資源,如數(shù)據(jù)資源:“生產(chǎn)者/消費者”算法中的信號量。它可能引起死鎖。

2、進程推進順序不當引起死鎖

????????進程在運行中具有異步性特征,多個進程按向前推進的順序有兩種情況:

? ? ? ? ? ? ? ? ①推進順序合法

? ? ? ? ? ? ? ? ②推進順序非法

3、 產(chǎn)生死鎖的必要條件

????????形成死鎖的四個必要條件(四個條件都具備就會死鎖,缺一就不會死鎖)

????????????????互斥條件:進程對所分配到的資源進行排他性使用

????????????????請求和保持條件:進程已經(jīng)保持了至少一個資源,又提出新的資源請求,而新請求資源被其他進程占有只能造成自身進程阻塞,但對自己已獲得的其他資源保持不放,必然影響其他進程。

????????????????不剝奪條件:進程已獲得的資源未使用完之前不能被剝奪,只能在使用完時由自己釋放。

????????????????環(huán)路等待條件

? ??????破壞這4個條件即是處理死鎖的方法

4、處理死鎖的基本方法

????????事先預防:

? ? ? ? ? ? ? ? ①預防死鎖

????????????????????????設(shè)置限制條件,破壞四個必要條件的一個或幾個,預防發(fā)生死鎖。

????????????????????????較易實現(xiàn)。限制條件的嚴格也會導致系統(tǒng)資源利用率和系統(tǒng)吞吐量降低。

? ? ? ? ? ? ? ? ②避免死鎖

????????????????????????不須事先限制,破壞四個必要條件,而是在資源的動態(tài)分配過程中,用某種方法去防止系統(tǒng)進入不安全狀態(tài),從而避免發(fā)生死鎖。

????????????????????????這種事先加以較弱限制的方法,實現(xiàn)上有一定難度,但可獲較高的資源利用率及系統(tǒng)吞吐量,目前在較完善的系統(tǒng)中,常用此方法來避免發(fā)生死鎖。

????????事后處理:

? ? ? ? ? ? ? ? ③檢測死鎖。

????????????????????????允許系統(tǒng)運行過程中發(fā)生死鎖,但通過系統(tǒng)檢測機構(gòu)可及時的檢測出,能精確確定與死鎖有關(guān)的進程和資源;然后采取適當?shù)拇胧瑥南到y(tǒng)中將已發(fā)生的死鎖清除掉。

? ? ? ? ? ? ? ? ④解除死鎖。

????????????????????????與死鎖檢測配套的一種措施。

????????????????????????常用的實施方法:撤銷或掛起一些進程,以便回收一些資源并將他們分配給已阻塞進程,使之轉(zhuǎn)為就緒以繼續(xù)運行。

????????????????????????死鎖的檢測與解除措施,有可能使系統(tǒng)獲得較好的資源利用率和吞吐量(死鎖幾率不一定很高),但在實現(xiàn)上難度也最大。

五、預防死鎖的方法

1.預防死鎖

????????資源的排他性無法更改,故在其他3個條件上入手

? ? ? ? ? ? ? ? ①摒棄“請求和保持”條件:所有進程開始運行前,必須一次性的申請其在整個運行過程所需的全部資源(AND)。算法簡單、易于實現(xiàn)且很安全。但缺點是資源浪費嚴重、或進程延遲運行。

? ? ? ? ? ? ? ? ②摒棄“不剝奪”條件:允許進程先運行,但當提出的新要求不被滿足時必須釋放它已保持的所有資源,待以后需要時再重新申請。實現(xiàn)比較復雜且付出很大代價。可能會造成前功盡棄,反復申請和釋放等情況。

? ? ? ? ? ? ? ? ③摒棄“環(huán)路等待”條件

????????????????????????有序設(shè)置資源:將所有資源按類型進行線性排隊,賦予不同序號。所有進程對資源的請求必須嚴格按照資源序號遞增的次序提出,這樣在所形成的資源分配圖中,不可能會出現(xiàn)環(huán)路。

????????????????????????與前兩種策略比較,資源利用率和系統(tǒng)吞吐量都有較明顯的改善。但也存在嚴重問題:

????????????????????????????????資源編號限制新設(shè)備的增加;

????????????????????????????????應用中的使用設(shè)備順序與規(guī)定的順序并不協(xié)調(diào);

????????????????????????????????限制了用戶編程自由。

2.避免死鎖

????????上述方法限制條件都太強;造成一定的應用不便。采用避免死鎖的方法則是只施加較弱限制條件,從而獲得令人滿意的系統(tǒng)性能。

????????名詞:

????????安全狀態(tài):系統(tǒng)能按某種進程順序為每個進程分配所需資源,直至滿足每個進程對資源的最大需求,并能順利完成。

????????不安全狀態(tài):系統(tǒng)無法找到一種使多個進程能夠順利分配資源執(zhí)行完的安全序列。

安全狀態(tài)、

安全序列舉例

由安全狀態(tài)向不安全狀態(tài)的轉(zhuǎn)換

????????每次資源分配時,都應分析判斷資源分配圖,看該次操作后是否有安全序列。若沒有,說明該操作會使系統(tǒng)進入不安全狀態(tài)。

????????只要使系統(tǒng)始終處于安全狀態(tài),便可避免發(fā)生死鎖。

????????不是所有的不安全狀態(tài)都是死鎖狀態(tài)。

3. 銀行家算法避免死鎖

????????最有代表性的避免死鎖的算法,是Dijkstra的銀行家算法。由于該算法能用于銀行系統(tǒng)現(xiàn)金貸款的發(fā)放而得名。

????????【思路描述】:隨時對系統(tǒng)中的所有資源信息進行統(tǒng)計,包括每種資源的數(shù)量、已分配給各進程的數(shù)量;每當進程提出某種資源請求時判斷該請求分配后是否安全,如果安全才分配。對每個資源請求的處理都要保證系統(tǒng)始終從一個安全狀態(tài)到另一個安全狀態(tài)。

算法實現(xiàn)說明

????????算法實現(xiàn):

????????????????首先:需要的一些數(shù)據(jù)結(jié)構(gòu)

????????????????再次:算法過程

????????????????核心:安全性判斷算法

????????1)銀行家算法中的數(shù)據(jù)結(jié)構(gòu)

? ??????????????(1)各類可利用資源的數(shù)量

????????????????????????向量Available :(i1,i2,…,im),含m個元素,每個元素代表一類可利用的資源數(shù)目。

????????????????????????動態(tài)變化的,初始值是系統(tǒng)配置的該類資源的全部數(shù)目,值隨資源的分配與回收而動態(tài)的改變。

????????????????????????實現(xiàn):一維數(shù)組。Available【j】=K,表示系統(tǒng)中Rj類資源現(xiàn)有可用數(shù)量為K個。

????????????????(2)每個進程對每類資源的需求

????????????????????????最大需求、已獲得的、還需要的

? ? ? ? ? ? ? ? ? ? ? ? ①最大需求矩陣Max

????????????????????????n*m,系統(tǒng)中n個進程中每個進程分別對m類資源的最大需求。

????????????????????????取值:根據(jù)進程需求賦初始值。

????????????????????????實現(xiàn):二維數(shù)組。Max【i,j】=K,表示進程 i 需要Rj類資源的最大數(shù)目為K。

? ? ? ? ? ? ? ? ? ? ? ? ②已分配矩陣Allocation。

????????????????????????n*m,定義系統(tǒng)中每一進程已獲得的每類資源數(shù)量。

????????????????????????Allocation【i,j】=K,表示進程i當前已分得Rj類資源數(shù)為K。

????????????????????????③還需求的矩陣Need。

????????????????????????n*m,表示每一進程尚需的各類資源數(shù)。

????????????????????????Need【i,j】=K,表示進程i還需要Rj類資源K個,方能完成任務。

????????????????????????上述三個矩陣存在關(guān)系:

????????????????????????????????Max【i,j】= Allocation【i,j】+Need【i,j】

????????????????????????????????每次,給進程 i 分配資源的動作,影響上述數(shù)據(jù)結(jié)構(gòu)的取值:

????????????????????????????????Available【 ? 】,Allocation【i,?】,Need【i,?】

? ??????2)避免死鎖的算法過程(銀行家算法)

算法過程:就是對各進程的Request向量及資源數(shù)量進行一系列判斷及值操作。

進程Pi發(fā)出資源請求后,系統(tǒng)按下述步驟進行檢查:

首先是兩個基本判斷:

(1)IF Requesti[j]<= Need[i,j]

????????THEN 轉(zhuǎn)向步驟2;

????????ELSE 認為出錯,所需資源數(shù)超過宣布的最大值(自我矛盾)

(2)IF Requesti[j]<= Available[j]

????????????THEN 轉(zhuǎn)向步驟3;

????????????ELSE 表示尚無足夠資源,Pi需等待(現(xiàn)實不滿足)

????????3)安全性算法

? ??????????????(1)需要一些記錄信息的數(shù)據(jù)結(jié)構(gòu),設(shè)置兩個向量:

????????????????????????工作向量work

????????????????????????????????算法開始時work=Available;

????????????????????????????????系統(tǒng)找安全序列的過程需要不斷判斷和修改當前資源數(shù)量,不能直接修改原始數(shù)據(jù)記錄Aailable。

????????????????????????標志向量Finish

????????????????????????????????????表示每個進程是否有足夠的資源使之運行完成。開始時所以進程都設(shè)置初值Finish[i]:=false;

????????????????????????????????????找安全序列的過程相當于使所有Finish[i]:=true。

????????????????(2)找安全序列的過程

????????????????????????從 Finish[i] = false 的進程集合中找一個進程

????????????????????????IF Need[i,j] <= work[j]

????????????????????????????????THEN? 執(zhí)行步驟 a;

????????????????????????????????ELSE? 執(zhí)行步驟 b;

????????????????????????a) 假設(shè)Pi獲得資源順利執(zhí)行完,釋放出分配給它的資源,修改相應的值:

? ????????????????????????????????? work【j】? = work【i】+ Allocation【i,j】;

? ????????????????????????????????? Finish【i】= true;

????????????????????????????????????goto step (2); //返回去繼續(xù)找下一個進程。

????????????????????????b)當算法不再在(2)、a)步間循環(huán)找進程,到達本步時,若所有Finish[i]=true都滿足,則表示所有進程都按某個順序執(zhí)行完了,系統(tǒng)處于安全狀態(tài);否則,系統(tǒng)當前所處的資源分配狀態(tài)是不安全狀態(tài)。

六、死鎖的檢測與解除

當系統(tǒng)為進程分配資源時,若未采取任何限制性措施,則系統(tǒng)必須提供檢測和解除死鎖的手段,為此系統(tǒng)必須:

????????1.保存有關(guān)資源的請求和分配信息;

????????2.提供一種算法,以利用這些信息來檢測系統(tǒng)是否已進入死鎖狀態(tài)。

1、資源分配圖

????????系統(tǒng)死鎖可利用資源分配圖來描述。

????????圓圈表示進程

????????方框表示一類資源,其中的一個代表一個該類資源

????????請求邊由進程指向方框中的資源

????????分配邊則由方框中的一個點即資源。

死鎖的檢測

????????檢測時機:

????????????????當進程等待時檢測死鎖

????????????????定時檢測

????????????????系統(tǒng)資源利用率下降時檢測死鎖

2、死鎖定理

????????利用資源分配圖簡化法來檢測死鎖。

????????簡化方法如下:

????????(1)在資源分配圖中找出一個既不阻塞又非獨立的進程結(jié)點Pi,在順利的情況下運行完畢,釋放其占有的全部資源。

????????(2)由于釋放了資源,這樣能使其它被阻塞的進程獲得資源繼續(xù)運行。消去了Pi的邊。

????????(3)經(jīng)過一系列簡化后,若能消去圖中所有邊,使結(jié)點都孤立,稱該圖是可完全簡化的。

????????S狀態(tài)為死鎖狀態(tài)的充分條件是當且僅當S狀態(tài)的資源分配圖是不可完全簡化的。<死鎖定理>

每類資源只有一個資源

死鎖檢測算法:

* 每個進程和資源指定唯一編號

* 設(shè)置一張資源分配表

記錄各進程與其占用資源之間的關(guān)系

* 設(shè)置一張進程等待表

記錄各進程與要申請資源之間的關(guān)系

反復檢測這兩張表,列出所有等待與分配的關(guān)系,若出現(xiàn)循環(huán)等待,則出現(xiàn)了死鎖!

3、 死鎖的解除

????????當發(fā)現(xiàn)進程死鎖時,便應立即把它們從死鎖狀態(tài)中解脫出來。常采用的方法是:

? ? ? ? ①剝奪資源。從其他進程剝奪足夠數(shù)量的資源給死鎖進程以解除死鎖狀態(tài)。

? ? ? ?② 撤銷進程。最簡單的是讓全部進程都死掉;溫和一點的是按照某種順序逐個撤銷進程,直至有足夠的資源可用,使死鎖狀態(tài)消除為止。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容

  • 一.死鎖的概念以及產(chǎn)生死鎖的原因 1.死鎖的定義 在多道程序系統(tǒng)中,由于多個進程的并發(fā)執(zhí)行,改善了系統(tǒng)資源的利用率...
    Chasel_H閱讀 1,131評論 0 4
  • 系統(tǒng)安全狀態(tài)的定義 1.安全狀態(tài) 在避免死鎖的方法中,允許進程動態(tài)地申請資源,但系統(tǒng)在進行資源分配之前,應先計算此...
    haifengmay閱讀 3,776評論 1 8
  • 最近在做操作系統(tǒng)的課程設(shè)計,其中實驗四是“銀行家算法的模擬和實現(xiàn)”。好在前面看過一點,有點印象。所以想嘗試自己寫一...
    此生望盡天涯路閱讀 6,440評論 4 12
  • 如何做人、做事、做官,是不少人需要經(jīng)常面對和正確把握的大問題,處理好了,則健康成長,反之則裹足不前,甚至掉入人生的...
    氵演員閱讀 250評論 0 0
  • 曾經(jīng)... 在我上初中那會 很多人愛以開頭兩字介紹自己 曾經(jīng)當過什么 沒人想要了解你的過去 他們需要的是你現(xiàn)在的能...
    淵爺1閱讀 365評論 0 0