當(dāng)一個進程想要申請資源A,擁有資源B垒玲,而另一個進程想申請資源B陆馁,但是擁有資源A,那么就會產(chǎn)生死鎖合愈。
死鎖的必要條件:
1.互斥叮贩。即資源不能被多個進程所占有。這點其實除了只讀文件想暗,其他基本都滿足妇汗。
2.占有并等待:進程占有一些資源,還需要的一些資源被其他進程占有说莫,所以處在等待狀態(tài)杨箭。
3.非搶占:資源不能被中途搶占。
4.循環(huán)等待:
只要4個條件滿足储狭,則說明必定死鎖互婿。
死鎖處理:
死鎖預(yù)防。
通過不滿足四個必要條件之一辽狈。
(1)互斥:很難不滿足慈参。
(2)占有并等待:第一,可要求進程創(chuàng)建就要申請好全部的資源刮萌;或第二驮配,進程申請資源時要釋放占有的資源。
但是第一種情況會發(fā)生饑餓。因為如果一個進程需要很多很多進程壮锻,這些資源幾乎不會同時有琐旁,則這個進程永遠不會執(zhí)行。
(3)非搶占:如果A進程想要申請資源a猜绣,但是a被B進程占有灰殴,且B進程在等待資源b,則A進程可以搶占B進程的資源a執(zhí)行掰邢。等到B進程得到原本擁有的資源a和申請的b牺陶,則執(zhí)行。 搶占和被搶占
(4)循環(huán)等待:規(guī)定資源被申請的順序辣之,每個進程申請資源的順序被規(guī)定了掰伸。如果需要Rj(j<i)則需要先釋放Ri。
死鎖避免召烂。
前面討論的預(yù)防死鎖的解決方案中包括限制資源的申請碱工,但是這對資源的利用率來說下降太多了。
所以引出了死鎖避免:要求事先得到進程申請資源和擁有的資源的信息 來判定是否值得等待奏夫。
最簡單的方法是事先告訴每個進程對于每個資源類型的最大需求怕篷。從而使得循環(huán)等待不成立。
(1)安全狀態(tài):能確定一個進程序列<p1,p2...>酗昼,按照這種順序執(zhí)行進程就不會死鎖(一個結(jié)束一個開始)廊谓。使得當(dāng)Pi申請資源時,申請的資源一定要小于剩余可用資源+pi隊列前面的進程所占有的資源麻削,則稱為安全的蒸痹。因為你想,Pi最多就等的長一點時間呛哟,但是最終還是能行的叠荠。
安全則不會死鎖。不安全不一定會死鎖扫责。
只有資源分配后能安全狀態(tài)榛鼎,才允許申請。
銀行家算法
(1)可利用資源向量Available鳖孤。這是一個含有m個元素的數(shù)組者娱,其中的,每一個元素代表一類可利用的資源數(shù)目苏揣,其初始值是系統(tǒng)中所配置的該類全部可用資源的數(shù)目黄鳍,其數(shù)值隨該類資源的分配和回收而動態(tài)地改變。如果Available[j]=K平匈,則表示系統(tǒng)中現(xiàn)有Rj類資源K個框沟。
(2)最大需求矩陣Max藏古。這是一個nm的矩陣,它定義了系統(tǒng)中n個進程中的每一個進程對m類資源的最大需求忍燥。如果Max[i,j]=K校翔,則表示進程i需要Rj類資源的最大數(shù)目為K。
(3)分配矩陣Allocation灾前。這也是一個nm的矩陣,它定義了系統(tǒng)中每一類資源當(dāng)前已分配給每一進程的資源數(shù)孟辑。如果Allocation[i,j]=K哎甲,則表示進程i當(dāng)前已分得Rj類資源的數(shù)目為K。
(4)需求矩陣Need饲嗽。這也是一個n*m的矩陣炭玫,用以表示每一個進程尚需的各類資源數(shù)。如果Need[i,j]=K貌虾,則表示進程i還需要Rj類資源K個吞加,方能完成其任務(wù)。
算法描述
設(shè)進程i提出請求Request[j]尽狠,則銀行家算法按如下規(guī)則進行判斷衔憨。
(1) 如果Request[j]≤Need[i,j],則轉(zhuǎn)向(2)袄膏,否則認為出錯践图。
(2) 如果Request[j]≤Available[j],則轉(zhuǎn)向(3)沉馆;否則表示尚無足夠資源码党,Pi需等待。
(3) 假設(shè)進程i的申請已獲批準(zhǔn)斥黑,于是修改系統(tǒng)狀態(tài):
Available[j]=Available[j]-Request[i]
Allocation[i,j]=Allocation[i,j]+Request[j]
Need[i,j]=Need[i,j]-Request[j]
(4) 系統(tǒng)執(zhí)行安全性檢查揖盘,如安全,則分配成立锌奴;否則試探險性分配作廢兽狭,系統(tǒng)恢復(fù)原狀,進程等待缨叫。
2.安全性檢查
(1) 設(shè)置兩個工作向量Work=Available椭符;Finish[i]=False
(2) 從進程集合中找到一個滿足下述條件的進程,
Finish [i]=False耻姥;
Need[i,j]≤Work[j];
如找到销钝,執(zhí)行(3);否則琐簇,執(zhí)行(4)
(3) 設(shè)進程獲得資源蒸健,可順利執(zhí)行座享,直至完成,從而釋放資源似忧。
Work[j]=Work[i]+Allocation[i,j];
Finish[i]=True;
go to step 2;
(4) 如所有的進程Finish[i]=true渣叛,則表示安全;否則系統(tǒng)不安全盯捌。