1. 程式人生 > >Dijkstra銀行家演算法

Dijkstra銀行家演算法

Conclusion

作為OS設計的檢測死鎖的一個基本演算法,這個演算法其實是通過破壞環路等待 這個條件來避免死鎖。死鎖的避免核心在於本演算法的安全演算法。

我想寫一寫關於這個演算法的一些理解吧,安全演算法就是在對請求資源的程序進行資源試分配後,是否可以產生一個安全序列。安全序列這個理解起來比較生澀。

想想一個很簡單的情況,系統有2個資源r1,r2r_1,r_2,程序A,B必須同時需要兩個資源才能完成任務,那麼因為不合理的程序排程(可能發生的事情總會發生)。 A持有r1r_1,B持有r2r_2,這是最簡單的環路等待模型。

不存在一個安全序列的意思就是在阻塞的程序中,剩下的系統資源的情況下,找不到任何一個程序作為突破口,讓其執行完成並釋放資源,來解開這個死結。或者換一句話說,即使將剩下的系統資源全部交給任何一個程序,都沒辦法讓此程序脫離阻塞。

這個結論和安全序列是等價的。 比如定義一個記法: P1>P2P_1->P_2定義為P1P_1程序獲得系統資源執行完成並釋放使P2P_2成功執行完畢,並進而也釋放資源。 存在安全序列可以敘述為: 系統剩餘資源全部交給某個程序PiP_i使得: Pi>Pj>....Pn(i,j,ngroup)P_i->P_j->....P_n (i,j,n \in group) 這裡<i,j,..

..n><i,j,....n>代表程序組內所有程序的一個排列。

那麼不安全序列也可以推理為不存在程序PiP_i使得: Pi>Pj>....Pn(i,j,ngroup)P_i->P_j->....P_n (i,j,n \in group)

銀行家演算法簡記

可用資源向量Available,記錄系統可用的n類臨界資源

型別 r1r_1 r2r_2 rnr_n
數量 9 5 2 8

三種程序數乘資源種類的iji*j矩陣。 分別儲存最大需求MAX,已分配Allocated,還需要Need

kind & process r1r_1 r2r_2 rnr_n
p1p_1
p1p_1
pmp_m

假如某時刻系統處於安全狀態,此時一個程序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;  //此時未能找到符合條件的程序,返回空。
    }