《2022年银行家算法实现》由会员分享,可在线阅读,更多相关《2022年银行家算法实现(5页珍藏版)》请在金锄头文库上搜索。
1、银行家算法的模拟实现实验三一、设计目的1、了解多道程序系统中,多个进程并发执行的资源分配。2、掌握死锁的产生的原因、产生死锁的必要条件和处理死锁的基本方法。3、掌握预防死锁的方法,系统安全状态的基本概念。4、掌握银行家算法,了解资源在进程并发执行中的资源分配策略。5、理解死锁防止在当前电脑系统不常使用的原因。二、设计任务在 Windows7系统的 VS 环境下运行程序;通过最有代表性的防止死锁的算法(Dijkstra)的银行家算法程序实现来理解进程并发中的资源分配,死锁防止在死锁解决中的可行性; 设计程序在自动、手动方式下运行,理解银行家算法的实质。三、设计内容与步骤A、银行家算法设计的知识准
2、备。1、死锁概念。在多道程序系统中,虽可借助于多个进程的并发执行,来改善系统的资源利用率,提高系统的吞吐量,但可能发生一种危险死锁。 所谓死锁 (Deadlock),是指多个进程在运行中因争夺资源而造成的一种僵局(Deadly_Embrace),当进程处于这种僵持状态时,假设无外力作用,它们都将无法再向前推进。一组进程中,每个进程都无限等待被该组进程中另一进程所占有的资源,因而永远无法得到的资源,这种现象称为进程死锁,这一组进程就称为死锁进程。2、关于死锁的一些结论:参与死锁的进程最少是两个两个以上进程才会出现死锁参与死锁的进程至少有两个已经占有资源参与死锁的所有进程都在等待资源参与死锁的进程
3、是当前系统中所有进程的子集注:如果死锁发生,会浪费大量系统资源,甚至导致系统崩溃。3、资源分类。永久性资源:可以被多个进程多次使用可再用资源可抢占资源不可抢占资源临时性资源:只可使用一次的资源;如信号量,中断信号,同步信号等可消耗性资源“申请 - 分配- 使用 - 释放”模式4、产生死锁的四个必要条件:互斥使用资源独占、不可强占不可剥夺、请求和保持部分分配,占有申请、循环等待。1) 互斥使用资源独占一个资源每次只能给一个进程使用精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 1 页,共 5 页2) 不可强占不可剥夺资源申请者不能强行的从资源占有者手
4、中夺取资源,资源只能由占有者自愿释放3) 请求和保持部分分配,占有申请一个进程在申请新的资源的同时保持对原有资源的占有只有这样才是动态申请,动态分配4) 循环等待存在一个进程等待队列P1 , P2 , , Pn, 其中 P1 等待 P2 占有的资源, P2 等待 P3 占有的资源,Pn 等待 P1 占有的资源,形成一个进程等待环路5、 死锁的解决方案5.1 产生死锁的例子申请不同类型资源产生死锁P1:申请打印机申请扫描仪使用释放打印机释放扫描仪P2:申请扫描仪申请打印机使用释放打印机释放扫描仪申请同类资源产生死锁如内存设有资源 R,R 有 m 个分配单位,由n 个进程 P1,P2, ,Pn n
5、 m共享。假设每个进程对R 的申请和释放符合以下原则:* 一次只能申请一个单位* 满足总申请后才能使用* 使用完后一次性释放m=2 ,n=3 资源分配不当导致死锁产生5.2 死锁预防 : 定义: 在系统设计时确定资源分配算法,保证不发生死锁。具体的做法是破坏产生死锁的四个必要条件之一破坏“不可剥夺”条件在允许进程动态申请资源前提下规定,一个进程在申请新的资源不能立即得到满足而变为等待状态之前,必须释放已占有的全部资源,假设需要再重新申请破坏“请求和保持”条件要求每个进程在运行前必须一次性申请它所要求的所有资源,且仅当该进程所要资源均可满足时才给予一次性分配破坏“循环等待”条件采用资源有序分配法
6、:精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 2 页,共 5 页把系统中所有资源编号,进程在申请资源时必须严格按资源编号的递增次序进行,否则操作系统不予分配6安全状态与不安全状态安全状态:如果存在一个由系统中所有进程构成的安全序列P1, Pn,则系统处于安全状态。一个进程序列P1 , Pn 是安全的,如果对于每一个进程Pi(1 in,它以后尚需要的资源量不超过系统当前剩余资源量与所有进程Pj (j i )当前占有资源量之和,系统处于安全状态( 安全状态一定是没有死锁发生的) 不安全状态 : 不存在一个安全序列,不安全状态一定导致死锁。B、银行家
7、算法一、银行家算法中的数据结构1可利用资源向量Available 它是一个含有m 个元素的数组,其中的每一个元素代表一类可利用的资源数目,其初始值是系统中所配置的该类全部可用资源数目。其数值随该类资源的分配和回收而动态地改变。如果Availablej=K,则表示系统中现有Rj 类资源 K 个。2最大需求短阵Max 这是个 n m 的矩阵,它定义了系统中n 个进程中的每一个进程对m 类资源的最大需求。如果Max(i ,j) K,表示进程 i 需要 Rj 类资源的最大数目为K。3分配短阵 Allocation 这是一个nm 的矩阵,它定义了系统中每一类资源当前已分配给每个进程的资源数。如果Allo
8、cation(i,j)K,表示进程 i 当前已分得 Rj 类资源的数目为K。4需求矩阵 Need 它是一个 n m 的矩阵,用以表示每一个进程尚需的各类资源数,如果 Needi,j=K,则表示进程 i 还需要 Rj 类资源 k个,方能完成其任务。上述三个矩阵间存在下述关系:Needi,j=Maxi,j-Allocationi,j 二、银行家算法设 Requesti是进程 Pi 的请求向量。如果Requestijk ,表示进程只需要k 个 Rj 类型的资源。当Pi 发出资源请求后,系统按下述步骤进行检查:1如果 Requestij=Needi,j,则转向步骤2;否则,认为出错,因为它所需要的资源
9、数已超过它所宣布的最大值。2如果 Requestij=Availablej ,则转向步骤3;否则,表示系统中尚无足够的资源,Pi 必须等待。3系统试探把要求的资源分配给进程Pi,并修改下面数据结构中的数值:Availablej:=Availablej-Requestij; Allocationi,j:=Allocationi,j+Requestij; Needi,j:=Needi,j-Requestij; 4系统执行安全性算法,检查此次资源分配后,系统是否处于安全状态。假设安全,才正式将资源分配给进程Pi,以完成本次分配;否则,将试探分配作废,恢复原来的资源分配状态,让进程Pi 等待。三、安全
10、性算法系统所执行的安全性算法可描述如下:1设置两个向量、工作向量Work 。它表示系统可提供应进程继续运行所需要的各类资源数目,它含有m 个元素,执行安全算法开始时,Work = Available。、Finish 。它表示系统是否有足够的资源分配给进程,使之运行完成,开始时先做Finishi:=false ;当有足够资源分配给进程时,令Finishi:=true。2从进程集合中找到一个能满足下述条件的进程:、 Finishi=false; 、 Needi,j=Workj;如找到,执行步骤3 ;否则,执行步骤4。3当进程 Pi 获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行
11、:精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 3 页,共 5 页Workj:=Worki+Allocationi,j; Finishi:=true; goto step 2;4如果所有进程的Finishi:=true,则表示系统处于安全状态;否则,系统处于不安全状态。四、银行家算法之例假定系统中有五个进程:P0 ,P1,P2,P3,P4 和三种类型的资源A ,B,C ,每一种资源的数量分别为10 、5、7, 在 T0 时刻的资源分配情况如以下图所示。资 源 情 况 进 程(1)T0 时刻的安全性:(2) 利用安全性算法对T0 时刻的资源分配情况
12、进行分析可知,在T0 时刻存在着一个安全序列P1,P3,P4,P2,P0,故系统是安全的。(2) P1 请求资源: P1 发出请求向量Request1(1,0,2),系统按银行家算法进行检查:Request1(1,0,2)=Need1(1,2,2) Request1(1,0,2)=Available1(3,3,2) 系统先假定可为P1 分配资源,并修改Available,Allocation1和 Need1向量,由此形成资源变化情况如图1 中的圆括号所示。再利用安全性算法检查此时系统是否安全。如图3 所示。资 源 情 况 进 程由所进行的安全性检查得知,可以找到一个安全序列P1,P3,P4,P
13、2,P0。因此系统是安全的,可以立即将P1所申请的资源分配给它。(3) P4 请求资源: P4 发出请求向量Request4(3,3,0),系统按银行家算法进行检查:精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 4 页,共 5 页Request4(3,3,0)Need4(4,3,1); Request4(3,3,0)不小于等于 Available(2,3,0),让 P4 等待。系统相应如图:(4) P0 请求资源: P0 发出请求向量Request0(0,2,0),系统按银行家算法进行检查。Request0(0,2,0) Need0(7,4,3)
14、; Request0(0,2,0) Available(2,3,0); 故可将资源分配给它,但将会出现死锁情况系统反应如下:(5)进行安全性检查:可用资源Available(2,1,0)已不能满足任何进程的需要,故系统进入不安全状态,此时系统不分配资源。(6)四、测试与评价1、程序运行及结果测评:在自动、手动方式下都能正确得出结果,但在自动模式下,当值MYMAX 增大时,计算时间长,增加了系统的开销,这也就说明了在实际系统中不常用银行家算法死锁防止在死锁解决中的这一原因。2、程序框架测评:主要使用了函数将每个模块分开,便于理解。但由于,程序设计了自动实现模式,导致程序显得过长。每个模块之间的信
15、息交换主要通过全局变量平实现,从这个角度讲,模块的划分并不严格。对于自动与手动这两种工作方式,解题思路是冗余的,但程序却为了防止之间的干扰冗余设计了函数,因而各个函数内聚度不高,功能也还有相容点,所以在函数设计也不十分合理。尽管如此,本设计严格从银行家算法出发,能很好地帮助读者理解银行家算法在多进程并行为死锁防止采取的资源分配、安全性检测的策略。特别,在自动方式下,资源分配利用第一次安全检测的结果防止了后继执行进程的不确定,有效地解决了自动请求的过重盲目的特点。当然,这部分有违银行家算法,但并没有增加额外的空间开销,还减少了时间上的开销,个人觉得是成功的。3、设计特点数据结构:数组;全局变量在
16、自动方式下,采用dowhile(条件) 以保证进程能够推进。getche()在调试时产生Warnings但能编译通过, getchar()对于键的接收不好确定,而getche()则一按即可。4、设计心得:为准确理解,应该以手动模式下运行为准,这样的交互性较好!尤其是单步实现的情况下,所有的数据能够使用一些交互性较好的数据。而自动实现下,更接近于机器的工作方式,且自动设计的情况下,由于生成的随机数随机性不强,通常需要在改变MAX 值后才能改变生成随机数的。程序在设计初,只是用了手动这一模式,后来听取同学的意见以随机数实现自动模式,在设计时出了好些问题,但想多了问题也就通了,而新的问题又出现,却总能解决。在这种模式下能更彻底理解银行家算法中的资源分配策略。精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 5 页,共 5 页