Dijkstra銀行家演算法
阿新 • • 發佈:2018-12-13
Conclusion
作為OS設計的檢測死鎖的一個基本演算法,這個演算法其實是通過破壞環路等待 這個條件來避免死鎖。死鎖的避免核心在於本演算法的安全演算法。
我想寫一寫關於這個演算法的一些理解吧,安全演算法就是在對請求資源的程序進行資源試分配後,是否可以產生一個安全序列。安全序列這個理解起來比較生澀。
想想一個很簡單的情況,系統有2個資源,程序A,B必須同時需要兩個資源才能完成任務,那麼因為不合理的程序排程(可能發生的事情總會發生)。 A持有,B持有,這是最簡單的環路等待模型。
不存在一個安全序列的意思就是在阻塞的程序中,剩下的系統資源的情況下,找不到任何一個程序作為突破口,讓其執行完成並釋放資源,來解開這個死結。或者換一句話說,即使將剩下的系統資源全部交給任何一個程序,都沒辦法讓此程序脫離阻塞。
這個結論和安全序列是等價的。 比如定義一個記法: 定義為程序獲得系統資源執行完成並釋放使成功執行完畢,並進而也釋放資源。 存在安全序列可以敘述為: 系統剩餘資源全部交給某個程序使得: 這裡代表程序組內所有程序的一個排列。
那麼不安全序列也可以推理為不存在程序使得:
銀行家演算法簡記
可用資源向量Available
,記錄系統可用的n類臨界資源
型別 | … | |||
---|---|---|---|---|
數量 | 9 | 5 | 2 | 8 |
三種程序數乘資源種類的矩陣。
分別儲存最大需求MAX
,已分配Allocated
,還需要Need
kind & process | … | |||
---|---|---|---|---|
… | ||||
假如某時刻系統處於安全狀態,此時一個程序A申請臨界資源,其請求向量Request[A]
包含對各個資源的需求量。首先按照常識,系統對其資源進行試探分配。
並在分配後,檢測此種情況下,系統是否存在安全序列。
分配演算法偽碼:
/**Finish用作標識此程序在獲取剩餘系統資源下,能否順利完成**/
Boolean Secure-Check(SystemResource,Finish){
Copy Avaliable into Work;
for process in Queue{
Finish[i]=false; //假設所有程序不能順利完成
}
while(CheckQForFinish!=NULL){
Finish[i.ProcessID]=true;
for j=n downto 1{
Work[j]=Work[j]+Allocated[i.ProcessID,j];
}
}
//檢測是否集合內所有程序是否全可完成
for Process in Queue{
if(Finish[Process.ID]==false){
return false;
}
}
return true; //假如沒有返回false,說明存在安全序列,那麼已分配資源操作不用回滾了。
}
/**檢測是否有未在推測中順利完成**/
Process CheckQForFinish(){
Process i=NULL;
for Process in Queue{
if(Finish[ProcessID]==false){ //檢測未可在推測中順利完成的程序
boolean fit=true;
for j=1 to n{ //檢測N種資源
if(Need[i,j]>Work[j]){
fit=false;//只要有一種資源不滿足需求設為false
}
}
//通過N次資源檢測,還是true,程序可完成,交付給呼叫者
if(fit==true){
i=Process;
return i;
}
}
}
return i; //此時未能找到符合條件的程序,返回空。
}