操作系统中死锁避免算法 --- 银行家算法

1. 背景

在银行系统中, 客户完成项目需要申请贷款的数量是有限的, 每个客户在第一次申请贷款时要声明完成该项目所需的最大资金量, 在满足所有贷款要求并完成项目时, 客户应及时归还. 银行家在客户申请的贷款数量不超过自己拥有的最大值时, 都应尽量满足客户的需要. 在这样的描述中, 银行家就好比操作系统, 资金就是资源, 客户就相当与要申请资源的进程.

2. 原理

当有一个进程请求各种资源时, 银行家算法会根据当前系统情况给你返回一个如果分配给你的话系统处于safe还是unsafe的结果, 如果返回safe, 那么就会分配给你, 如果返回unsafe, 那么请求进程就需要等待.

2.1 前提条件

  • 多个实例
  • 每个进程都必须能最大限度地利用资源
  • 当一个进程请求一个资源, 就不得不等待
  • 当一个进程获得所有的资源就必须在一段有限的时间释放它们

基于上述前提条件, 银行家算法通过尝试寻找允许每个进程获得的最大资源并结束(把资源返还给系统)的进程请求的一个理想执行时序, 来决定一个状态是否是安全的.

不存在这满足要求的执行时序的状态都是不安全的.

2.2 数据结构

  • n: 进程数量
  • m: 资源类型数量
  • Max(总需求量): n * m矩阵. 如果Max[i,j] = k, 表示进程P_{i}最多请求资源类型R_{j}k个实例.
  • Available(剩余空闲量): 长度为m的向量. 如果Available[j] = k, 有k个类型R_{j}的资源实例可用.
  • Allcation(已分配量): n * m矩阵. 如果Allocation[j] = k, 则P_{i}当前分配了k个类型R_{j}的资源实例.
  • Need(未来需要量): n * m矩阵. 如果Need[i, j] = k, 则P_{i}可能需要至少k个类型R_{j}的资源实例完成任务.

Need[i, j] = Max[i, j] - Allocation[i, j]

2.3 判断过程

1. 定义WorkFinish分别是长度为mn的向量.

初始化:

  • Work = Available                               //当前资源剩余空闲量
  • Finish[i] = false                               //代表当前线程是否结束, 初始化均为false

2. 找这样的进程i:                                      //接下来找出 NeedWork小的进程i

需要找到具有以下特点的进程:

  • Finish[i] = false
  • Need[i, j] \leq Work                       //这个线程结束所需要的所有资源都能被满足

如果找到了, 就跳到3, 如果没有找到这样的进程i, 转到4.

3. 找到了当前能被满足的进程i, 就执行并回收

  • Work = Work + Allocate[i];                                  //回收进程i执行结束后所分配的资源
  • Finish[i] = true                                                       //所以配置给他再回收

转到2.

4. 因为4是由2转过来的, 到达了4, 就会出现两种情况

  • if Finish[i] = true for all i, then the system is in a safe state.         //如果所有进程的Finish[i] = true, 那么表明系统处于安全状态, 那么银行家判断算法就会返回safe.
  • 否则就是第二种状态, 找不到一个系统当前能直接结束的进程了

2.4 算法执行过程

1. 如果 Request[i] \leq Need[i], 转到步骤2. 否则, 提出错误条件, 因为进程已经超过了其最大要求.

2. 如果Request[i] \leq Available, 转到步骤3. 否则P_{i}必须等待, 因为资源不可用.

3. 假装给P_{i}分配给它需要的资源; //生成一个需要判断状态是否安全的资源分配环境:

Available = Available - Request[i];

Allocation = Allocation + Request[i];

Need[i] = Need[i] - Request[i];

Call safety state Estimating Algorithm:

  • 如果返回sage, 将资源分配给P_{i}.
  • 如果返回unsafe, P_{i}必须等待, 旧的资源分配状态被恢复.

2.5 举例说明

  • safe state:

初始状态如图:

1. 首先先确定有没有进程P_{i}Need[i] \leq Work, 找到了P_{2}, 然后把其finish置为true, 然后把其占用的资源回收(资源分配向量Allocation[2]加回到Available中):

 

2. 然后又找到了P_{1}, 发现P_{1}可以被满足, 重复上面步骤, 如下:

3. 然后又找到了P_{3}, 发现P_{3}可以被满足, 重复上面步骤, 如下: 

4. 最后P_{4}也可以被满足, 于是我们就找到了一个安全序列, P_{2}->P_{1}->P_{3}->P_{4}, 那么此时的system state就是一个safe state.

  • unsafe state:

初始状态如图:

1. 假如此时P_{1}发出Request_{1}为[1, 0, 1], 系统会假设先分配给P_{1}, 那么此时的状态变成了:

2. 然后此时发现系统已经找不到一个可以被满足的线程P_{i}了, 所以此时银行家算法返回unsafe, 也就不会给线程P_{i}分配资源.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值