OS_死锁的避免算法:银行家算法&问题实例

银行家算法

  • 银行家算法

  • 在银行中,客户申请贷款的数量是有限的,每个客户在

  • 第一次申请贷款时要声明完成该项目所需的最大资金量

  • 在满足所有贷款要求时,客户应及时归还

  • 银行家在客户申请的贷款数量不超过自己拥有的最大值时,都应尽量满足客户的需要

  • 在这样的描述中,银行家就好比操作系统,资金就是资源,客户就相当于要申请资源的进程

银行家算法涉及的概念

For the Banker’s algorithm to work, it needs to know three things:

MAX-Request-Matrix

  • How much of each resource each process could possibly request (“MAX”)

ALLOCATED-Resource-Array

  • How much of each resource each process is currently holding (“ALLOCATED”)

AVAILABLE-Resource-Array

  • How much of each resource the system currently has available (“AVAILABLE”)

NEED-Resource-Matrix

执行矩阵减法

  • Need=Max-Allocation
    • 更具体的描述Need[i]:表示Request_i的上限(如果进程i的某次资源请求向量Request_i 的任何一个分量超出这个上限,必然是不合理的),系统会拒绝
    • Need: RequestUppers
  • 求得Need矩阵后,Max矩阵就不再用到!

安全性试探(试探性分配资源)

两减一增

  • Request_i表示进程i的某一次资源请求向量
  • 试探的过程中,需要临时修改几个对象的值
    • Available-Request_i(向量减法)
    • Need[i]-Request_i
    • Allocation[i]+Request_i

安全性检测算法

  • 这是一个试图找出一个安全序列的过程
  • 在进行完试探性分配后,都应该执行这么一个检测流程,来确定试探性分配的结果到底会不会引起危险
  • 如果这个安全序列最终可以覆盖虽有进程(不关心进程间顺序),那么认为上述的试探性分配是安全的.
  • 在安全性检测算法中,需要用到的矩阵/向量:
    • Need矩阵
    • Allocation矩阵(更具地,是Allocation矩阵中的某一行,譬如第i个进程对应的第i行向量Allocation[i])
    • AvailableUpdating(Work)向量
      • Work向量很能代表银行的角色,进行收本收息(债权人)
      • Work向量的更新方式:Work=Work+Allocation[i]
      • Work向量在更新的过程中,只可能增大,而不会减小(向量中的任何一个元素的都是如此)
      • Allocation[i]表示第i个进程已经获得的资源分配向量(Allocation本身是一个矩阵(二维))
      • Work向量的各个分量随着安全检测算法的推进,每确认一个可以进入SafeProcessSeq的安全进程,Work就有机会更新(通常会变化至少一个分量,而且是变大的)
  • SafeProcessSeq安全序列
    • 这个序列收集被认为是可以安全地分配资源地进程
    • 系统不会因为将资源分配给这些进程后而陷入危险区
    • 换句话说,这个序列中地进程地所占用的资源系统都可以安全的回收回来(连本带利)
    • 因此,当Need[i]<Work

data structure

image-20220530084036077

案例

      Allocation   Max   Available
    ABCD    ABCD  ABCD
 P1   0014    0656  1520 
 P2  1432    1942 
 P3  1354    1356
 P4  1000    1750

  • 我们会看到一个资源分配表,要判断是否为安全状态,首先先找出它的Need
    • Need即Max(最多需要多少资源)减去Allocation(原本已经分配出去的资源),
    • 计算结果如下:
   NEED
 ABCD
 0642 
 0510
 0002
 0750
  • 接下来找出need比available小的(千万不能把它当成4位数 他是4个不同的数)
  • 如果有多个满足条件,那么随意选取一个都可以,不会影响对安全性的判断(但是序列会有所不同.)
   NEED    Available
 ABCD  ABCD
 
 0642  1520
 0510<-
 0002
 0750
  • P2的各种资源的最大需求小于(或等于)当前可用(可以提供的各种资源量),所以配置给他再回收

    • 注意这里回收的向量是来自于Allocation中进程的对应行

    • 不要误把Need中的对应行回收了

    •   	Allocation   
           ABCD 
           
       P1   0014     
       P2  1432 
       P3  1354    
       P4  1000
      
  • 回收完毕后,将需求矩阵Need中对应的行修改为全0(或者全部划掉)

      NEED     Available_updating(Work ing)
     ABCD  ABCD

     0642  1520
   ->0000 +1432
     0002-------
     0750  2952

此时P2 FINISH的false要改成true(己完成,进入安全序列)

 FINISH
 false
 true
 false
 false

接下来继续往下找,发现P3的需求为0002,小于能用的2952,所以资源配置给他再回收

  NEED      Available
 ABCD  A B C D
 
 0642  2 9 5 2
 0000 +1 3 5 4
 0000----------
 0750  3 12 10 6

依此类推,做完P4→P1,当全部的FINISH都变成true时,就是安全状态。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值