1、银行家算法课程设计报告武汉理工大学华夏学院课程设计报告书课程名称: 操作系统原理 题 目: 编程序模拟银行家算法 系 名: 信息工程系 专业班级: 计应2091 姓 名: 刘星宇 学 号: 10225509111 指导教师: 苏永红 11 年 7 月 5 日课程设计任务书学生姓名: 刘星宇 专业班级: 计应2091 指导教师: 苏永红 工作单位: 设计题目:编程序模拟银行家算法初始条件:Linux操作系统,GCC编译环境要求完成的主要任务:主要任务:银行家算法是避免死锁的一种重要方法,本实验要求用高级语言编写和调试一个简单的银行家算法程序。加深了解有关资源申请、避免死锁等概念,并体会和了解死锁
2、和避免死锁的具体实施方法。思想:将一定数量的资金供多个用户周转使用,当用户对资金的最大申请量不超过现存资金时可接纳一个新客户,客户可以分期借款,但借款总数不能超过最大的申请量。银行家对客户的借款可以推迟支付,但是能够使客户在有限的时间内得到借款,客户得到所有的借款后能在有限的时间内归还。用银行家算法分配资源时,测试进程对资源的最大需求量,若现存资源能满足最大需求就满足当前进程的申请,否则推迟分配,这样能够保证至少有一个进程可以得到所需的全部资源而执行到结束,然后归还资源,若OS能保证所有进程在有限的时间内得到所需资源则称系统处于安全状态。设计报告撰写格式要求:1设计题目与要求 2 设计思想 3
3、系统结构 4 数据结构的说明和模块的算法流程图 5 使用说明书(即用户手册):内容包含如何登录、退出、读、写等操作说明6 运行结果和结果分析(其中包括实验的检查结果、程序的运行情况)7 自我评价与总结 8 附录:程序清单,注意加注释(包括关键字、方法、变量等),在每个模块前加注释; 时间安排 7月 4日 布置课程设计任务;分配题目后,查阅资料、 准备程序; 7月 5 7月7 日上机调试程序、书写课程设计报告;7月8 日 提交课程设计报告及相关文档。指 导 教 师 签 名: 2011年 7月 2日系 主 任 签 名: 2011年 7月 3日摘要 11绪论 41.1前言 52需求分析 42.1题目
4、描述 52.2银行家算法 52.3基本要求 52.4目的 53概要设计 43.1基本思路 53.2银行家算法步骤 53.3安全型算法步骤 53.4数据结构 53.4.1主要用到的数据结构 63.4.2程序模块 64详细设计 44.1主要函数的核心代码 54.1程序流程图 55测试 45.1测试结果分析和截图 56总结 4参考文献 4附录:原程序清单 41. 前言为了提高资源利用率,应采用动态分配资源的方法。但是,为了避免可能产生的死锁,在进行资源分配时,应采用某种算法来预测是否有可能发生死锁,若存在可能性,就拒绝企图获得资源的请求。预防死锁和避免死锁的不同在于,前者所采用的分配策略本身就否定了
5、必要条件之一,这样就保证死锁不可能发生;而后者是在动态分配资源的策略下采用某种算法来预防可能发生的死锁,从而拒绝可能引起死锁的其个资源请求,银行家算法是避免死锁的一种重要方法。银行家算法的基本思想是分配资源之前,判断系统是否是安全的;若是,才分配。它是最具有代表性的避免死锁的算法。2. 算法的原理 银行家算法是一种最有代表性的避免死锁的算法。要解释银行家算法,必须先解释操作系统安全状态和不安全状态。 安全状态:如果存在一个由系统中所有进程构成的安全序列P1,Pn,则系统处于安全状态。安全状态一定是没有死锁发生。 不安全状态:不存在一个安全序列。不安全状态不一定导致死锁。那么什么是安全序列呢?安
6、全序列:一个进程序列P1,Pn是安全的,如果对于每一个进程Pi(1in),它以后尚需要的资源量不超过系统当前剩余资源量与所有进程Pj (j i ) 我们可以把操作系统看作是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。当进程在执行中继续申请资源时,先测试该进程已占用的资源数与本次申请的资源数之和是否超过了该进程对资源的最大需求量。若超过则拒绝分配资源,若没有超过则
7、再测试系统现存的资源能否满足该进程尚需的最大资源量,若能满足则按当前的申请量分配资源,否则也要推迟分配。3算法的实现3.1 初始化 由用户输入数据,分别对可利用资源向量矩阵AVAILABLE、最大需求矩阵MAX、分配矩阵ALLOCATION、需求矩阵NEED赋值。3.2 算法思想 在避免死锁的方法中,所施加的限制条件较弱,有可能获得令人满意的系统性能。在该方法中把系统的状态分为安全状态和不安全状态,只要能使系统始终都处于安全状态,便可以避免发生死锁。银行家算法的基本思想是分配资源之前,判断系统是否是安全的;若是,才分配。它是最具有代表性的避免死锁的算法。设进程cusneed提出请求REQUES
8、T i,则银行家算法按如下规则进行判断。(1)如果REQUEST cusneed i= NEEDcusneedi,则转(2);否则出错。(2)如果REQUEST cusneed i= AVAILABLEcusneedi,则转(3);否则出错。(3)系统试探分配资源,修改相关数据: AVAILABLEi-=REQUESTcusneedi; ALLOCATIONcusneedi+=REQUESTcusneedi; NEEDcusneedi-=REQUESTcusneedi;(4)系统执行安全性检查,如安全,则分配成立;否则试探险性分配作废,系统恢复原状,进程等待。32银行家算法步骤(1)如果Req
9、uestior =Need,则转向步骤(2);否则,认为出错,因为它所需要的资源数已超过它所宣布的最大值。(2)如果Requestor=Available,则转向步骤(3);否则,表示系统中尚无足够的资源,进程必须等待。(3)系统试探把要求的资源分配给进程Pi,并修改下面数据结构中的数值: Available=Available-Requesti; Allocation=Allocation+Request; Need=Need-Request;(4)系统执行安全性算法,检查此次资源分配后,系统是否处于安全状态。33安全性算法步骤(1)设置两个向量工作向量Work。它表示系统可提供进程继续运行
10、所需要的各类资源数目,执行安全算法开始时,Work=Allocation;布尔向量Finish。它表示系统是否有足够的资源分配给进程,使之运行完成,开始时先做Finishi=false,当有足够资源分配给进程时,令Finishi=true。(2)从进程集合中找到一个能满足下述条件的进程:Finishi=falseNeedor=Work如找到,执行步骤(3);否则,执行步骤(4)。(3)当进程P获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行:Work=Work+Allocation;Finishi=true; 转向步骤(2)。(4)如果所有进程的Finishi=true,则表
11、示系统处于安全状态;否则,系统处于不安全状态。3.3 程序流程图3.4 安全性检查算法(1)设置两个工作向量Work=AVAILABLE;FINISH(2)从进程集合中找到一个满足下述条件的进程,FINISH=false;NEED=Work; 如找到,执行(3);否则,执行(4)(3)设进程获得资源,可顺利执行,直至完成,从而释放资源。Work+=ALLOCATION;Finish=true;GOTO 2(4)如所有的进程Finish= true,则表示安全;否则系统不安全。3.5 定义全局变量int Availablex; /各种资源可利用的数量int Allocationyy; /各进程当
12、前已分配的资源数量int Maxyy; /各进程对各类资源的最大需求数int Needyy; /还需求矩阵int Requestx; /申请各类资源的数量int Workx; /工作向量,表系统可提供给进程运行所需各类资源数量int Finishy; /表系统是否有足够的资源分配给进程,0为否,1为是4. 程序测试截图5. 设计体会经过几天的自己动手练习,对操作系统的掌握又进了一步,收获了很多课堂上和书上未出现过的或老师未讲到的一些知识。在完成实验的过程中,进行了反复的修改和调试,这次实验,让我基本上明白了银行家算法的基本原理,加深了对课堂上知识的理解,也懂得了如何让银行家算法实现,但编程功底
13、的原因使程序很是繁琐。 这次的设计数据是通过一道实际的题目来体现银行家算法避免死锁的问题,先用银行家算法给其中一个进程分配资源,看它所请求的资源是否大于它的需求量,才和系统所能给的资源相比较.让进程形成一个安全队列,看系统是否安全.再利用安全性算法检查此时系统是否安全。 要做一个课程设计,如果知识面只是停留在书本上,是不可能把课成设计完全地做好。用VC+6.0编程,感觉自己有点力不从心,很多C语言的知识都忘了,只好翻出以前的C语言课本和数据结构来复习。每次的课程设计中都能将以前的知识顺便再复习一遍,课程设计是给了我们一个机会去动手和主动复习,同时也是提醒我们应该注重平时的积累。从课程设计以后还
14、是要多多的动手,在实践中体会理论知识,这样才不会在要做实验和设计时,觉得无从下手。感谢赵老师一周的幸苦指导。参考文献1 庞丽萍.操作系统原理M. 武汉:华中科技大学出版社,20082 杨树青,王欢.Linux环境下C编程指南M. 北京:清华大学出版社,20073 陈维兴,林小茶. C+面对对象程序设计教程M. 北京:清华大学出版社,20044杨路明. C语言程序设计教程M. 北京:北京邮电大学出版社,2005附录:源程序清单#include#includestruct typeint a;int b;int c;struct allocationstruct type value;struct
15、 allocation *next;struct maxstruct type value;struct max *next;struct availablestruct type value;struct available *next;struct needstruct type value;struct need *next;struct pathint value;struct path *next;struct finishint value;struct finish *next;void main()int p,status=0,i,j,temp,flag=0;struct al
16、location *allochead,*alloc1,*alloc2,*alloctemp;struct max *maxhead,*max1,*max2,*maxtemp;struct available *availablehead,*workhead,*worktemp;struct need *needhead,*need1,*need2,*needtemp;struct path *pathhead,*path1,*path2,*pathtemp;struct finish *finishhead,*finish1,*finish2,*finishtemp;printf(请输入进程
17、的数目n);scanf(%d,&p);for(i=0;ivalue.a);printf(t当前资源类型是 %ct,b);scanf(%d,&alloc1-value.b);printf(t当前资源类型是 %ct,c);scanf(%d,&alloc1-value.c);flag+;allochead=alloc1;elsealloc2=(struct allocation*)malloc(sizeof(struct allocation);printf(t当前资源类型是 %ct,a);scanf(%d,&alloc2-value.a);printf(t当前资源类型是 %ct,b);scanf(
18、%d,&alloc2-value.b);printf(t当前资源类型是 %ct,c);scanf(%d,&alloc2-value.c);alloc1-next=alloc2;alloc1=alloc2;flag+;alloc2-next=NULL;flag=0;for(i=0;ivalue.a);printf(t当前资源类型是 %ct,b);scanf(%d,&max1-value.b);printf(t当前资源类型是 %ct,c);scanf(%d,&max1-value.c);maxhead=max1;flag+;elsemax2=(struct max*)malloc(sizeof(s
19、truct max);printf(t当前资源类型是 %ct,a);scanf(%d,&max2-value.a);printf(t当前资源类型是 %ct,b);scanf(%d,&max2-value.b);printf(t当前资源类型是%ct,c);scanf(%d,&max2-value.c);max1-next=max2;max1=max2;flag+;max2-next=NULL;flag=0; printf(n请输入可以利用是资源数目n);availablehead=workhead=(struct available*)malloc(sizeof(struct available
20、);printf(n);printf(t当前资源类型是 %ct,a);scanf(%d,&availablehead-value.a);printf(t当前资源类型是 %ct,b);scanf(%d,&availablehead-value.b);printf(t当前资源类型是 %ct,c);scanf(%d,&availablehead-value.c);workhead=availablehead;workhead-value=availablehead-value;flag=0;alloctemp=allochead;maxtemp=maxhead;for(i=0;inext=need2
21、-next=NULL;need1-value.a=(maxtemp-value.a)-(alloctemp-value.a);need1-value.b=(maxtemp-value.b)-(alloctemp-value.b);need1-value.c=(maxtemp-value.c)-(alloctemp-value.c);needhead=need1;flag+;elseneed2=(struct need*)malloc(sizeof(struct need);need2-value.a=(maxtemp-value.a)-(alloctemp-value.a);need2-val
22、ue.b=(maxtemp-value.b)-(alloctemp-value.b);need2-value.c=(maxtemp-value.c)-(alloctemp-value.c);need1-next=need2;need1=need2;flag+;maxtemp=maxtemp-next;alloctemp=alloctemp-next;need2-next=NULL;flag=0;for(i=0;inext=finish2-next=NULL;finish1-value=0;finishhead=finish1;flag+;elsefinish2=(struct finish*)
23、malloc(sizeof(struct finish);finish2-value=0;finish1-next=finish2;finish1=finish2;flag+;finish2-next=NULL;flag=0;for(temp=0;tempp;temp+)alloctemp=allochead;needtemp=needhead;finishtemp=finishhead;worktemp=workhead;for(j=0;jvalue=0)if(needtemp-value.avalue.a)&(needtemp-value.bvalue.b)&(needtemp-value
24、.cvalue.c)worktemp-value.a+=alloctemp-value.a;worktemp-value.b+=alloctemp-value.b;worktemp-value.c+=alloctemp-value.c;finishtemp-value=1;if(flag=0)pathhead=path1=path2=(struct path*)malloc(sizeof(struct path);path1-next=path2-next=NULL;path1-value=j+1;pathhead=path1;flag+;elsepath2=(struct path*)mal
25、loc(sizeof(struct path);path2-value=j+1;path1-next=path2;path1=path2;flag+;finishtemp=finishtemp-next;alloctemp=alloctemp-next;needtemp=needtemp-next;else finishtemp=finishtemp-next;alloctemp=alloctemp-next;needtemp=needtemp-next;else finishtemp=finishtemp-next;alloctemp=alloctemp-next;needtemp=need
26、temp-next;path2-next=NULL;finishtemp=finishhead;pathtemp=pathhead;for(temp=0;tempvalue=0)printf(n警告!当前系统是不安全的n);exit(0);finishtemp=finishtemp-next;printf(n当前系统是安全的!n);printf(n安全序列为: n);for(i=0;ivalue);pathhead=pathhead-next;设计过程中质疑(或答辩)记载:1.银行家算法的主要问题是什么? 答:要求每个进程必须事先知道资源的最大需求量,而且,在系统运行过程中,考查每个进程对各类资源的申请需花费较多的时间。 2.银行家算法的主要思想是什么?答:一个进程进入系统时分配资源之前,判断系统是否是安全的,即看它所请求的资源是否大于它的最大需求量,若正常,则判断该进程所需剩余剩余量(包括本次申请)是否超出系统所掌握的剩余资源量,若不超出,则分配,否则等待。指导教师评语: 签名: 年 月 日
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1