银行家算法

原创 2013年12月05日 00:20:49

银行家算法是一种最有代表性的避免死锁的算法。在避免死锁方法中允许进程动态地申请资源,但系统在进行资源分配之前,应先计算此次分配资源的安全性,若分配不会导致系统进入不安全状态,则分配,否则等待。为实现银行家算法,系统必须设置若干数据结构。

要解释银行家算法,必须先解释操作系统安全状态和不安全状态。
安全序列是指一个进程序列{P1,…,Pn}是安全的,即对于每一个进程Pi(1≤i≤n),它以后尚需要的资源量不超过系统当前剩余资源量与所有进程Pj (j < i )当前占有资源量之和。

我们可以把操作系统看作是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。

为保证资金的安全,银行家规定:
(1) 当一个顾客对资金的最大需求量不超过银行家现有的资金时就可接纳该顾客;
(2) 顾客可以分期贷款,但贷款的总数不能超过最大需求量;
(3) 当银行家现有的资金不能满足顾客尚需的贷款数额时,对顾客的贷款可推迟支付,但总能使顾客在有限的时间里得到贷款;
(4) 当顾客得到所需的全部资金后,一定能在有限的时间里归还所有的资金.

操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。当进程在执行中继续申请资源时,先测试该进程本次申请的资源数是否超过了该资源所剩余的总量。若超过则拒绝分配资源,若能满足则按当前的申请量分配资源,否则也要推迟分配。

银行家算法是Dijkstra在1965年提出的一种避免死锁的算法。银行家算法陈述如下:

1) 当一个进程提出一个资源的请求时,假定分配给它,并调用检查系统状态安全性的算法。如果系统是安全的,则对申请者的假分配变为实际的分配。否则,推迟它的请求,让其阻塞等待。

2) 检查系统状态安全性的算法。根据系统剩余的资源情况,银行家进行检查,看满足请求者的要求后,是否仍是系统中的所有进程都能正常完成(即能找到一个进程完成序列)。若能,系统是安全的。否则,系统是不安全的。


总结:

银行家算法是用来避免死锁的,死锁就是一个进程A申请资源但是不释放它所拥有的资源,另一个进程拥有A要的资源但是却需要A拥有的资源才能结束,这就构成了死锁。银行家算法通过破坏死锁形成的条件来避免死锁。


保证操作系统的安全状态!这也是操作系统判断是否分配给一个进程资源的标准!那什么是安全状态?举个小例子,进程 P 需要申请 8 个资源(假设都是一样的),已经申请了 5 个资源,还差 3 个资源。若这个时候操作系统还剩下 2 个资源。很显然,这个时候操作系统无论如何都不能再分配资源给进程 P 了,因为即使全部给了他也不够(无论如何都已经不安全了),还很可能会造成死锁。若这个时候操作系统还有 3 个资源,无论 P 这一次申请几个资源,操作系统都可以满足他,因为操作系统可以保证 P 不死锁,只要他不把剩余的资源分配给别人,进程 P 就一定能顺利完成任务。

这个就是,以前是安全的(有一个安全序列保证系统不会发生死锁),现在如果分配一下,还是安全的,那么就可以分配,如果之后不安全,那就一定不能分配给它。

银行家必须具有超前的意识。如同下象棋,即使我下了这一步,也不烦碍我赢棋的最终结果(我还是有办法赢棋)。

银行家算法的java代码实现,Swing写的界面

java代码实现了银行家算法,界面写的个人认为还是较为细致的,完整的实现了找安全序列等算法功能,可作为参考学习银行家算法。 直接上代码:①界面展示方法:public void ShowFrame()...
  • lly_itboy
  • lly_itboy
  • 2015年04月08日 18:35
  • 1568

银行家算法(Java实现)

银行家算法(Banker's Algorithm)是一个避免死锁(Deadlock)的著名算法,它以银行借贷系统的分配策略为基础,判断并保证系统的安全运行。我们可以把操作系统看作是银行家,操作系统管理...
  • u014634576
  • u014634576
  • 2016年09月20日 21:52
  • 5348

避免死锁的银行家算法C++程序实现

具有代表性的死锁避免算法是Dijskstra给出的银行家算法。本程序是基于银行家算法的思想通过编写C++程序实现银行家算法的计算机程序化,同时提供算法基本思想和流程图等说明,结果演示附图仅供参考。...
  • gujinjin2008
  • gujinjin2008
  • 2014年06月28日 14:20
  • 6220

java找出银行家算法所有安全序列

/**  *  默认最后一行为剩余的资源数  */ public class Os { private static int resourceNum; // 资源数,A,B,C... pri...
  • hello_noob
  • hello_noob
  • 2018年01月11日 09:42
  • 12

银行家算法流程图+C++源代码

银行家算法是避免死锁的一种重要方法。 操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源...
  • zacklin
  • zacklin
  • 2012年02月29日 11:31
  • 27443

银行家算法(1)——概念与举例说明(多进程管理资源分配避免死锁)

在银行中,客户申请贷款的数量是有限的,每个客户在第一次申请贷款时要声明完成该项目所需的最大资金量,在满足所有贷款要求时,客户应及时归还。银行家在客户申请的贷款数量不超过自己拥有的最大值时,都应尽量满足...
  • Roy_70
  • Roy_70
  • 2016年03月22日 21:12
  • 4109

用java实现银行家算法

银行家算法核心是 先寻找满足系统当前剩余的资源量(avaliable )>=进程运行所需的资源数的进程(need),再假设这个进程安全校验是成功的,当这个进程运行完毕后,释放资源后,现在系统当前剩余...
  • gao23191879
  • gao23191879
  • 2017年07月17日 15:00
  • 600

【操作系统】 银行家算法-banker's algorithm

【银行家算法】     银行家算法是迪杰斯特拉先生的又一创作,主要用于解决操作系统上的死锁问题。问题大概是,选择当前进程操作,能否保证之后,不会出现死锁问题。核心思想是,先检查当前进程的资源数是否能...
  • David_Jett
  • David_Jett
  • 2015年12月08日 23:15
  • 1419

银行家算法——软考探究(四)

著名的银行家算法,最早是由Dijkstra提出来的。它是一种最有代表性的避免死锁的算法。在避免死锁方法中允许进程动态地申请资源,但系资源分配之前,应先计算此次分配资源的安全性,若分配不会导致系统进入不...
  • u010508826
  • u010508826
  • 2014年11月01日 21:40
  • 1225

【c/c++】银行家算法

1 需求分析   1.1 银行家算法的实现思想      允许进程动态地申请资源,系统在每次实施资源分配之前,先计算资源分配的安全性,若此次资源分配安全(即资源分配后,系统能按某...
  • lzm18064126848
  • lzm18064126848
  • 2017年03月28日 18:15
  • 951
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:银行家算法
举报原因:
原因补充:

(最多只允许输入30个字)