银行家算法

  当一个进程申请使用资源的时候,银行家算法通过先 试探 分配给该进程资源,然后通过安全性算法判断分配后的系统是否处于安全状态,若不安全则试探分配作废,让该进程继续等待。

 

安全序列

  安全序列是指对当前申请资源的进程排出一个序列,保证按照这个序列分配资源完成进程。

 

数据结构

  int n,m; //系统中进程总数n和资源种类总数m   

  int Available[1..m]; //资源当前可用总量        

  int Max[1..n,1..m] //每个进程最大所需的各种资源数量   

  int Allocation[1..n,1..m]; //当前给分配给每个进程的各种资源数量   

  int Need[1..n,1..m];//当前每个进程还需分配的各种资源数量   

  int Work[1..m]; //当前可分配的资源 

 

例子:

 

 

  因为系统资源R=(17,5,20)而系统分配给这几个线程的资源为Allocation=(15,2,17) 则可以求出Available=(2,3,3)

(1)在T0时刻,由于Availabel大于等于Need中 P5 所在行的向量,因此Availabel能满足 P5 的运行,在 P5 运行后,系统的状态变更为如下图所示:

 

  因此,在T0时刻,存在安全序列:P5,P4,P3,P2,P1(并不唯一)

(2)P2请求资源,P2发出请求向量Request(i)(0,3,4),系统根据银行家算法进行检查;
   ① P2 申请资源Reuqest(i)(0,3,4)<=Need中 P2 所在行向量Need(i)(1,3,4)

   ② P2 申请资源Reuqest(i)(0,3,4)>=可以利用资源向量Availabel(2,3,3),所以,该申请不给于分配

 

(3)P4请求资源,P4发出请求向量Request(i)(2,0,1),系统根据银行家算法进行检查;

   ①Reuqest(i)(2,0,1)<= Need(i)(2,2,1)

   ② Reuqest(i)(2,0,1 <= Availabel(2,3,3)

   ③对 P4 的申请(2,0,1)进行预分配后,系统的状态为:

 

  可利用资源向量Availabel=(0,3,2),大于Need中 P4 所在行的向量(0,2,0),因此可以满足 P4 的运行。P4 运行结束后,系统的状态变为:

 

   同理依次推导,可计算出存在安全序列P4,P5,P3,P2,P1(并不唯一)

 

(4)P1请求资源,P1发出请求向量Request(i)(0,2,0),系统根据银行家算法进行检查;

   ①Request(i)(0,2,0)<= Need(i)(3,4,7)

   ② Request(i)(0,2,0)<= Availabel(2,3,3)

   ③对 P1 的申请(0,2,0)进行预分配后,系统的状态为:

 

  由于Availabel不大于等于 P1 到 P5 任一进程在Need中的需求向量,因此系统进行预分配后

  处于不安全状态,所以对于 P1 申请资源(0,2,0)不给予分配。

 

转自:https://blog.csdn.net/wyf2017/article/details/80068608

 

posted @ 2019-03-10 14:20  __Meng  阅读(1018)  评论(0编辑  收藏  举报