银行家算法

前言

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

安全状态

首先我们接收一个概念,安全状态。

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

   
   
  • 1

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

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

在这里插入图片描述

我们先来说答案,其中按照 <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:此时是执行的试探分配,为的是检查进程是否处于安全状态,不处于
    则试探分配作废
    
         
         
    • 1
    • 2

安全性算法

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

   
   
  • 1
  • 2
  • 3
两个向量
  • 工作向量(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>

在这里插入图片描述

完毕

银行家算法是避免死锁的一种重要方法,本程序用java编程语言对其进行了实现。 当用户申请一组资源时,系统必须做出判断,如果把这些资源分出去,系统是否还处于安全状态。 若是,就可以分出这些资源;否则,该申请暂不予满足。 1.数据结构 假设有M个进程N类资源,则有如下数据结构: MAX[M*N] M个进程对N类资源的最大需求量 AVAILABLE[N] 系统可用资源数 ALLOCATION[M*N] M个进程已经得到N类资源的资源量 NEED[M*N] M个进程还需要N类资源的资源量 2.银行家算法 设进程I提出请求Request[N],则银行家算法按如下规则进行判断。 (1)如果Request[N]<=NEED[I,N],则转(2);否则,出错。 (2)如果Request[N]<=AVAILABLE,则转(3);否则,出错。 (3)系统试探分配资源,修改相关数据: AVAILABLE=AVAILABLE-REQUEST ALLOCATION=ALLOCATION+REQUEST NEED=NEED-REQUEST (4)系统执行安全性检查,如安全,则分配成立;否则试探险性分配作废,系统恢复原状,进程等待。 3.安全性检查 (1)设置两个工作向量WORK=AVAILABLE;FINISH[M]=FALSE (2)从进程集合中找到一个满足下述条件的进程, FINISH[i]=FALSE NEED<=WORK 如找到,执行(3);否则,执行(4) (3)设进程获得资源,可顺利执行,直至完成,从而释放资源。 WORK=WORK+ALLOCATION FINISH=TRUE GO TO 2 (4)如所有的进程Finish[M]=true,则表示安全;否则系统不安全。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值