1.1.2.6 银行家算法

银行家算法是资源和死锁避免的算法,由艾兹格·迪杰斯特拉(Edsger Dijkstra) 设计的算法用于测已确定总数量的资源分配的安全性,在决定是否该分配应该被允许并进行下去之前,通过“s-state”校验码测试资源分配活动期间产生死锁条件的可能性。 

该算法是为为THE操作系统设计并且最在在EWD108描述。当一个新的进程进入系统时,进程必须声明所需每个资源实例最大的数量和类型。显然,资源数量不不能超过系统最大的资源数。与此同时,进程获得的资源必须在有限的时间内释放。
对于银行家算法的实现,需要知道三件事: 
  • 每个进程所能获取的每种资源数量是多少[MAX] 
  • 每个进程当前所分配到的每种资源的数量是多少[ALLOCATED] 
  • 系统当前可分配的每种的资源数量是多少[AVAILABLE]
只有当资源满足以下条件,资源才会被分配:
  1. request <= max, 也可设置错误条件,当进程所请求的资源超过最大的要求
  2. request <= available, 或者进 
    程一直等直到资源可分配
一些资源在实际的系统被跟踪,如:内存,信号量以及接口。
银行家算法名字源于该算法实际上是用于确保银行系统不会用尽系统资源,因为当银行系统不再满足所有客户的需求,系统将不会分配资源给客户,银行必须确保对资源的请求不会导致银行系统处于不安全状态。如果上述情况不会发生,则该情况下请求是被允许的,否则,客户必须等到其他客户往银行存进足够银行分配的资源。
 
基本数据结构用于维护运行银行家算法: 
用n表示系统资源数量,m表示系统资源类型。则我们需要以下的数据结构: 
  • Available: 长度为m的向量用来表示每种资源可分配的数量。如果available[j]=k, 资源类型为Rj可分配数量为k。 
  • Max: n * m矩阵,定义,每个进程最大的资源需求。如果Max[i,j]=k. 表明Pi对类型为Rj资源的请求为k. 
  • Allocation: n * m矩阵定义每个进程已分配到的每种资源的数量。如果Allocation[i,j] = k,进程Pi已分配到类型为Rj的资源数量为k。 
  • Need: n * m 矩阵表明每个进程所需的资源数量,如果Need[i,j] = k, 进程Pi需要至少得到k数量的资源Rj,才能完成任务。
公式:Need[i,j] = Max[i,j] - Allocation[i,j]
 

安全和不安全状态

如果该状态下所有进程都可以结束运行,则该状态是安全。因为系统无法知道什么时候一个进程结束运行,或有多少资源被进程请求,系统只是假设所有的进程最终会试图获取他们所规定的最大资源,并且在获得资源使用完之后会结束运行。在大多数的情况下,该假设是很合理的,因为系统不会特别的关心每个进程的运行多久(至少不是从死锁避免的角度)。
 对于该猜想,算法确定是否一个状态是安全通过找到一个猜想性的进程请求序列,允许所有进程获取最大的资源数并顺利结束运行。而任何无法达到上诉要求的的状态都是不安全的状态。
可以得到例子的安全状态,只要能使每个进程获得最大资源并结束运行。
1.P1 请求 2 A,1 B,达到进程需求的最大资源数 
  • [可分配资源:<4 5 4> - <2 1 0> = <2 4 4>
  • 系统当前有2 A, 4 B, 4 C资源可分配
2.P1 结束运行,释放3 A, 3 B, 3 C资源给系统。 
  • [可分配资源:<2 4 4> + <3 3 3> = <5 7 7>
  • 系统当前有5A, 7 B, 7 C资源可分配
1.P2请求 4C,达到进程需求的最大资源数 
  • [可分配资源:<5 7 7> - <0 0 4> = <5 7 3>
  • 系统当前有5 A, 7 B, 3C资源可分配
3.P2 结束运行, 释放4 A, 2 B, 6 C资源给系统。  
  • [可分配资源:< 5 7 3 > <4 2 6>= <9 9 9>
  • 系统当前有9 A, 9 B, 9 C资源可分配
4.P3 请求3 A, 2B, 4 C资源,之后运行结束释放资源给系统 
  • [可分配资源:< 9 9 9 > - <3 2 4> + <4 3 5>= <10 10 10>
  • 系统现在用所有的资源10A, 10 B, 10 C 
5.由于所有的进程可以结束运行,该状态是安全的状态。
 
当系统收到对资源请求信号时,系统运行银行家算法判断允许请求是否安全。
1.该请求是否可以运行? 
如果不允许,该请求则是不可行的,必须要么拒绝请求或插入到等待队列。 
2.假设请求被允许 
3.是否安全? 
如果安全,请求授予, 否则,要么拒绝或插入到等待队列
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值