ImageVerifierCode 换一换
格式:DOCX , 页数:14 ,大小:234.94KB ,
资源ID:9005649      下载积分:12 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/9005649.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(银行家算法.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

银行家算法.docx

1、银行家算法 银行家算法1课程设计的目的通过此次课程设计,了解多道程序系统中多个进程并发执行的资源分配,掌握死锁产生的原因,产生死锁的必要条件以及预防死锁的方法。清楚系统安全态的基本概念掌握银行家算法,了解资源在并发执行中资源分配策略。理解死锁避免,在当前计算机系统中不常使用的原因。模拟银行家算法,用银行家算法实现资源分配。2课程设计的开发语言 此次课程设计,采用C语言作为基本的编程语言。其编程实现简单,结构清晰,更接近硬件,执行效率高。3 功能描述本程序模拟银行家管理银行,可以把一定数量的作业供多个用户周转使用,为了保证作业的安全银行家规定:(1) 当一个用户对作业的最大需求量不超过管理员现有

2、的资金就要接纳该用户。(2) 用户可以分期贷款,但贷款的总数不能超过最大需求量。(3) 当管理员现有的作业不能满足用户的要求,对该用户的请求可以推迟支付,但总能是用户在有限的时间里得到请求。(4) 当用户得到所需的全部作业后,一定能在有限的时间里归还所有的作业。假设有4类资源A,B,C,D。如果要满足上述条件系统必须具备4个功能: (1) 完成输出某时刻的资源分配检测。(2) 利用银行家算法设计安全态。 (3) 进行安全性检查。(4) 统一调度,按需求调配资源。 4 设计方案论证4.1设计思路设Requestij是进程Pi的请求向量,如果Requestij=K,表示进程Pi需要K个Rj类型的资

3、源。当Pi发出资源请求后,系统按下面步骤进行检查:(1) 如果Resquestij=Needi,j,便转向步骤(2);否则认为出错,因为它所需要的资源数已超过它所宣布的最大值。如果Resquestij=Availablej,便转向(3);否则,表示尚无足够资源,Pi需等待。(2) 系统试探着把资源分配给进程Pi,并修改下面数据结构中的数值;Availablej:=Availablej-Resquestij;Allocationi,j:=Allocationi,j+Resquesij;Needi,j:=Needi,j-Resquestij;(3) 系统执行安全算法,检查此处资源分配后,系统是否处

4、于安全状态。若安全,才正式将资源分配给Pi,以完成本次分配;否则,将本次的试探分配作废,恢复原来的分配状态,让进程Pi等待。4.2结构设计 图 1系统总体功能框图系统函数的描述及流程图(1) 当前资源资源显示函数output( ):显示当前资源分配详细情况,包括:各种资源的总数,系统目前各种资源可用的数量、个进程已经得到的资源数量、各进程还需的资源量。(2) 银行家算法bank( ):进银行家算法模拟实现的模块,调用其他各个模块进行银行家算法模拟过程。(3) 当前安全态检查函Security( ):用于判断当前状态的安全性,根据不同地方调用提示处理不同的事件。(4) 主函数main( ):逐个

5、调用上面的方法,进行显示状态、安全性检查、银行家算法函数,是进程 图2 银行家算法的主函数流程图 图3 资源输出函数output()的 流程图4.3算法设计4.3.1死锁产生的原因(1) 竞争资源。当系统中多个进程共享资源,如打印机、公用队列等,其数目不足以满足进程需要时,就会引起诸进程对资源的竞争,产生死锁。其中,竞争的资源包括:可剥夺和非可剥夺性资源,以及临界资源。(2) 进程间推进顺序非法。进程在运行过程中,请求和释放的顺序不当,也同样会导致产生进程死锁。其中进程的推进包括:进程推进合法和进程推进非法。4.3.2产生死锁的必要条件 (1) 互斥条件。指进程所分配到的资源进程进行排它性使用

6、,即在一段时间内某资源只有一个进程占用。如果此时还有其它进程请求该资源,则请求者只能等待,直至占有该资源的进程用完间资源释放。 (2) 请求和保持条件。指进程已经保持了至少一个资源,但有提出了新的资源请求,而该资源又被其它进程占有,此时请求进程阻塞,但又对自己已占的资源保持不妨。 (3) 不剥夺条件。指进程已获得资源,在未之前不能被剥夺,只能在使用完时自己释放。 (4) 环路等待条件。只在发生死锁时,必然存在一个资源的环形链。4.3.3处理死锁的基本方法(1) 预防死锁。该方法通过某些条件,去破坏产生死锁的四个必要条件。 (2) 避免死锁。在资源的动态分配过程中,用某种方法去防止系统进入不安全

7、状态。 (3) 检测死锁。系统通过设置死锁检测机构,及时检测出死锁的发生。 (4) 解除死锁。当检测出系统发生死锁时,采用某种机制,将进程从死锁状态解脱出来。4.3.4利用银行家算法避免死锁的数据结构(1) 可以用资源向量Available。这是一个含有m个元素的数组,其中的每一个元素代表一类可利用的资源数目,其初值系统中所配置的该类全部可用资源的数目,其数值随该类资源的分配和回收而动态的改变。如果Availablej=K,则表示系统中该类资源有K个。(2) 最大需求矩阵Max。n*m的矩阵,它定义了系统中的每一类资源当前已分配给每一进程的资源数。如果Allocationi,j=K,则表示进程

8、i当前已分得Rj类资源的数目为K。(3) 需求矩阵Need。这也是n*m的矩阵,用以表示每一个进程尚需的各类资源数。如果Needi,j=K,则表示进程i还需要Rj类资源K个,方能完成其任务。上述三个矩阵间存在下述关系:Needi,j=Maxi,j-Allocationi,j;4.4系统函数设计4.4.1安全态检查函数Security( )(1) 设置两个工作向量work=available;finishm=false;(2) 从进程集合中找到一个满足下述条件的的进程finishi=false;need=work;如果找到就执行(3);否则执行(4);(3) 设进程获得资源可顺利执行,直至完成,

9、从而释放资源。 work=work+allocation;finish=true;Go to 2;(4) 如果所有的进程finishm=true,则表示安全;否则系统不安全。int Security(int avialable4,int need54,int allocation54) int j,i ,work4, finish5=0,0,0,0,0; for(j=0;j4;j+) workj=avialablej; for(i=0;i5;i+) if(finishi=0) for(j=0;j4;j+)if(needij=worki&needij=worki&needij=worki) wo

10、rkj=workj+allocationij;finishj=1; for(i=0;i5;i+) if(finishi=0)return 0; else return 1;4.4.2银行家算法函数bank() 进程i发出请求申请k个j资源,Resquestij=k (1) 检查申请量是否大于需求量:Resquestij=Needi,j,若条件不符重新输入,不允许申请量大于需求量。 (2) 检查申请量是否小于系统中的可以用的资源数:Resquestij=Availablej,若条件不符,申请资源失败,阻塞该进程,用goto语句跳到重新申请资源。(3) 若以上两个条件都满足,则系统试探将资源分配给

11、申请的进程,并修改数据结构的值。 Availablej:=Availablej-Resquestij;Allocationi,j:=Allocationi,j+Resquesij;Needi,j:=Needi,j-Resquestij;(4) 试分配后,执行安全性检查,调用安全算法检查此次资源分配后系统是否出于安全态。若安全,才正式将资源分配给进程;否则本次试探失败,恢复原来的资源分配状态,让进程等待。Bank(int i,int request4,int need54,int avialable3,int allocation54) int j; printf(The process id:

12、 %dn,i); for(j=0;j4;j+) printf( %d,requestj);if(request0=needi0&request1=needi1&request2=needi2=resquest3) if(request0=avialable0&request1=avialable1&request2=avialable2) for(j=0;j4;j+) avialablej=avialablej-requestj; allocationij=allocationij+requestj; needij=needij-requestj;4.5数据表格假定系统中有5个进程P0,P1,

13、P3,P4,P5和三类资源A,B,C,D,各类资源的数量分别为在T0时刻的资源分配情况表1 T0时刻的资源分配表 资源情况进程MaxA B C DAllocationA B C DNeedA B C DAvailableA B C DP00 0 4 4 0 0 3 20 0 1 2 1 6 2 2P12 7 5 0 1 0 0 01 7 5 0P23 6 10 10 1 3 5 42 3 5 6P30 9 8 4 0 3 3 20 6 5 2P40 6 6 10 0 0 1 40 6 5 6 5源程序代码output(int arr54) int i;int j; printf( A B Cn

14、); for(i=0;i5;i+) printf(P%d,i); for(j=0;j4;j+) printf( %d,arrij); printf(n);int Security(int avialable4,int need54,int allocation54) int j;int i; int work4; int finish5=0,0,0,0,0; for(j=0;j4;j+) workj=avialablej; for(i=0;i5;i+) if(finishi=0) for(j=0;j4;j+) if(needij=worki&needij=worki&needij=worki)

15、 workj=workj+allocationij; finishj=1; for(i=0;i5;i+) if(finishi=0) return 0;else return 1;Bank(int i,int request4,int need53,int avialable4,int allocation54)int j; printf(The process id: %dn,i); printf(The Process Request:); for(j=0;j4;j+) printf( %d,requestj); printf(n); if(request0=needi0&request1

16、=needi1&request2=needi2) if(request0=avialable0&request1=avialable1&request2=avialable2) for(j=0;j4;j+) avialablej=avialablej-requestj; allocationij=allocationij+requestj; needij=needij-requestj; printf(The source after request:n); printf( Allocationn); output(allocation); printf( Needn); output(nee

17、d); printf(The Avialable after request:); for(j=0;j4;j+) printf( %d,avialablej); printf(n); else printf(RequestError!); else printf(RequestError!);main() int id,i; int Avialable4=1,6,2,2; int Max54=0,0,4,4,2,7,5,0,3,6,10,10,0,9,8,4,0,6,6,10; int Allocation54=0,0,3,2,1,0,0,0,1,3,5,4,0,3,3,2,0,0,1,4;

18、int Need54=0,0,1,2 ,1,7,5,0,2,3,5,6,0,6,5,2,0,6,5,6; int Request4; printf(The source before request:n); printf( MAXn); output(Max); printf( Allocationn); output(Allocation); printf( Needn); output(Need); printf(The Avialable before request:); for(i=0;i4;i+) printf( %d,Avialablei); printf(n);printf(I

19、nput the id and request of Process:); scanf(%d %d %d %d%d,&id,&Request0,&Request1,&Request2, &Request3); Bank(id,Request,Need,Avialable,Allocation);6 运行结果与分析 程序运行时首先进入此界面,在主界面上有5个进程分别为P0,P1,P2,P3,P4,包含4类资源A,B,C,D。显示它们对资源的最大需求矩阵,已分配矩阵和需求矩阵,以及系统当前可用的资源。可以根据所给的提示输入进程号和对资源的需求量。 图4银行家算法的初始运行界面 根据提示输入所选的进

20、程号和它所需要的各类资源数,系统自动进行安全态检查,分析资源是否可以分配给该进程,以及分匹配后,系统所剩的可用资源数。每次分配完后,系统资源的最大分配矩阵,可分配矩阵,以及需求矩阵都会发生相应的变化。分配完后,将显示出分配完后所剩资源数,供用户进行下面的判断。图5 进行资源分配后的界面如果进程所申请的资源数大于它的需求,或者是大于现在已有的资源数,系统进行检查,认为此时进程进程的请求不合理,不予以处理,分配资源失败。图6 进程请求失败运行界面7 设计体会 本次课程设计用C语言编程模拟银行家算法,主要为了确定安全态,解决死锁问题。具体实现利用了3个矩阵来完成。在设计过程中,深化了对死锁问题的理解

21、。从死锁产生的原因,产生死锁的必要条件,到如何解决死锁,直至最后用银行家算法确定安全态。银行家算法是一个分配资源的过程,是分配的顺序不会产生死锁。其基本思想是,按该算法分配资源时,每次分配后存在这一个进程,如果让它单独运行下去,必须让它获得所需的全部资源,也就是说他能结束,而它结束又能将资源释放,给其它进程使用。整个过程中,增加了对课堂知识的理解,并能够根据自己的理解让其用程序实现,将课堂所学勇于实践,自己的能力也有所提高。 对于此算法,其基本功能均已实现,但也有需要提高的地方。由于是模拟银行家算法,所以,在编程时事先限定了进程的个数。如果要使程序更加完美,可以采用循环,让其动态输入,但基本原

22、理不变。 该课程设计进一步培养综合应用知识进行程序设计的能力。通过完成这一设计,学会利用计算机解决实际问题的初步能力,对课本上的知识进行了复习,从中找出了不少盲点,清楚了只有把学的知识作扎实,多动手多思考,这样才能最大限度的减少知识的漏洞。 参考文献1 屠立德. 计算机操作系统基础M.北京:清华大学出版社,2000.3:30-482 申利民.操作系统常见题解析及模拟题M.北京:国防工业出版社.2004.1:20-393 陈琦.操作系统实验指导书M.北京:电子工业出版社,1999.2:10-204 张尧学.张高,计算机操作系统教程M.北京:清华大学出社,2006:119-1255 汤子赢 ,哲凤屏,汤晓丹.计算机操作系统(修订版)M.西安 : 西安电子科技大学出版社: 2006.10:90-100

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1