银行家算法

更新: 修改了第一例中的错误

前言

操作系统在解决死锁问题的时候,有四个大的方向,分别是预防死锁避免死锁检测死锁解除死锁。而今天要讲的银行家算法是避免死锁算法的代表。

安全状态

首先我们了解一个概念,安全状态。

避免死锁的定义:在资源动态分配的过程中,防止系统进入不安全状态。

由定义可知道,要想实现避免死锁,那么就必须让进程资源分配处于安全状态,所谓安全状态就是系统能按照某种进程推进顺序(安全序列)进行。所以避免死锁需要知道未来进程资源的请求情况。

上面的定义可能比较抽象,下面用一个实例来介绍安全状态。(此处建议动笔一起计算

在这里插入图片描述

我们先来说答案,其中按照 <P2,P1,P3>的推进序列使用磁带机就是安全的。

我们来看

  1. 现在的可用(可以分配)的资源数是 3 ,而 P2 需要的资源数是 2,所以可以分配
  2. 待 P2 执行完毕后,释放资源数为 4,变成可用资源,加上之前剩余的可用资源数,一共是 5 个
  3. 观察到 P1 需要 5 个,所以分配给 P1
  4. P1 执行完后释放资源数为 10,变成可用资源
  5. 而 P3 只需要 7 个,所以分配 7 个可用资源个 P3
  6. P3 运行完毕

并非所有的不安全状态都是死锁,但是处于不安全状态很可能产生死锁

银行家算法

银行家算法的数据结构

  1. 可利用资源向量(Available):系统还可以分配的资源
  2. 最大需求矩阵(Max):进程的最大资源需要
  3. 分配矩阵(Alloction):进程已经获得的资源
  4. 需求矩阵(Need):进程还需要获得的资源

银行家算法

  1. 假设 P1 进程提出请求 K 个资源

  2. 如果 K <= Need,就继续步骤;否则出错,因为请求资源 K 不能超过还需要获得的资源

  3. 如果 K <= Available,就继续步骤;否则出错,因为请求资源 K 不能超过系统还可以分配的资源 Available

  4. 系统试探分配资源,并修改下列数据
    Available = Available - K;表示分配给 P1 K 个资源后,还剩多少系统可分配资源
    Allocation = Allocation + K;表示 P1 已经获得的资源
    Need = Need - K;表示进程 P1 还需要获得的资源

  5. 此时系统执行安全性算法,计算进程是否处于安全性状态

    PS:此时是执行的试探分配,为的是检查进程是否处于安全状态,不处于
    则试探分配作废
    

安全性算法

安全性算法是银行家算法在第五步执行的子算法,用于检查进程的安全状态。银行家算法是
计算某一个进程对资源的需求问题,安全性算法是计算所有的进程在各自的银行家算法执行
下,是否处于**安全状态**。

两个向量

  • 工作向量(Work):系统提供给进程的各类资源数目
  • Finish:表示系统是否有足够的资源分配给进程,这是一个布尔值。初始化为 false。

算法描述

在进程集合中找到下述条件的进程

  1. Finish[ i ] = false;
  2. Need <= Work
  3. 进程执行完毕
  4. Work = Work + Allocation
  5. Finish [ i ] = true
  6. 返回继续执行 1 ,寻找其他的进程分配资源
  7. 若所有的 Finish 为 true 则安全

银行家算法实例

在这里插入图片描述
分析此时刻,P1 和 P3 都可以进行分配(PS:安全序列的结果并不是唯一的)
利用上述的银行家算法即可得出此时的安全序列:<P1,P3,P4,P2,P0>

在这里插入图片描述
完毕。

  • 38
    点赞
  • 122
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
银行家算法=-- - 1. 安全状态: 在某时刻系统中所有进程可以排列一个安全序列:{P1,P2,`````Pn},刚称此时,系统是安全的. 所谓安全序列{P1,P2,`````Pn}是指对于P2,都有它所需要剩余资源数量不大于系统掌握的剩余的空间资源与所有Pi(j<i)所占的资源之和. 2.不安全状态可能产生死锁. 目前状态 最大需求 尚需 P1 3 9 6 P2 5 10 5 P3 2 4 2 在每一次进程中申请的资源,判定一下,若实际分配的话,之后系统是否安全. 3.银行家算法的思路: 1),进程一开始向系统提出最大需求量. 2),进程每次提出新的需求(分期贷款)都统计是否超出它事先提出的最大需求量. 3),若正常,则判断该进程所需剩余剩余量(包括本次申请)是否超出系统所掌握的 剩余资源量,若不超出,则分配,否则等待. 4.银行家算法的数据结构. 1),系统剩余资源量A[n],其中A[n]表示第I类资源剩余量. 2),各进程最大需求量,B[m][n],其中B[j][i]表示进程j对i 类资源最大需求. 3),已分配资源量C[m][n],其中C[j][i]表示系统j程已得到的第i资源的数量. 4),剩余需求量.D[m][n],其中D[j][i]对第i资源尚需的数目. 5.银行家算法流程:当某时刻,某进程时,提出新的资源申请,系统作以下操作: 1),判定E[n]是否大于D[j][n],若大于,表示出错. 2),判定E[n]是否大于系统剩余量A[n],若大于,则该进程等待. 3),若以上两步没有问题,尝试分配,即各变量作调整. 4),按照安全性推测算法,判断,分配过后,系统是否安全,若安全,则实际分配,否则,撤消分配,让进程等待. 6."安全性检测"算法 1),先定义两个变量,用来表示推算过程的数据. F[n]=A[n],表示推算过程中,系统中剩余资源量的变化. J[n]=False表示推算过程中各进程是否假设"已完成" 2),流程: 在"剩余"的进程中(在推算)过程中,一些进程假设已完成,查找D[j][n]<=F[n]的进程,找到后令J[j]=True (假设该进程完成),F[n]+D[j][n](该进程所占资源释放),如此循环执行. 若最后,所有的F[n]=True(在推算过程中,所有进程均可以完成),则表示(分配过后)系统是安全的,否则系统是不安全的.

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值