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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

银行家算法避免死锁的研究与实现毕业论文.docx

1、银行家算法避免死锁的研究与实现毕业论文长 治 学 院2013届学士学位毕业论文银行家算法避免死锁的研究与实现学 号: 09407227 姓 名: 王子丹 指导教师: 陕粉丽 专 业: 计算机科学与技术 系 别:计算机系完成时间:2013年5月银行家算法避免死锁的研究与实现专业:计算机科学与技术 :王子丹 学号:09407227指导教师:陕粉丽摘 要:Dijkstra的银行家算法是最有代表性的避免死锁的算法,该算法由于能用于银行系统现金贷款的发放而得名。银行家算法是在确保当前系统安全的前提下推进的。对进程请求先进行安全性检查,来决定资源分配与否,从而确保系统的安全,有效的避免了死锁的发生。该论文

2、在理解和分析了银行家算法的核心思想以与状态的本质含义的前提下,对算法的实现在总体上进行了设计,包括对算法分模块设计,并对各个模块的算法思想通过流程图表示,分块编写代码,并进行测试,最后进行程序的测试,在设计思路上严格按照软件工程的思想执行,确保了设计和实现的可行性。 关键词:银行家算法;死锁;避免死锁;安全性序列银行家算法避免死锁的研究与实现1前言1.1 课题背景在多道程序系统中,虽可以借助多个进程的并发执行来改善系统的资源利用率,提高系统吞吐量,但可能发生一种危险死锁。如此,寻求一种避免死锁的方法便显得很重要。死锁产生的一般原因有两点:竞争资源和进程间推进顺序非法。因此,我们只需在当前的有限

3、资源下,找到一组合法的执行顺序,便能很好的避免死锁。而银行家算法起源于银行系统的发放贷款,和计算机操作系统的资源分配完全符合,因此可以借鉴该算法的思想,设计出一种有效的算法程序,解决该问题。1.2 死锁死锁是进程死锁的简称,是指多个进程循环等待它方占有的资源而无限期地僵持下去的局面。很显然,如果没有外力的作用,那么死锁涉与到的各个进程都将永远处于封锁状态。虽然进程在运行过程中会产生死锁,但死锁的发生也必须具备四个条件:(1)互斥条件;(2)请求与保持条件;(3)不剥夺条件;(4)环路与等待条件。为保证系统中诸进程的正常运行,应事先采取必要的措施,来预防发生死锁。目前,预防死锁的方法可归结为以下

4、两种:(1)预防死锁。它是通过设置某些限制条件。去破坏产生死锁的四个条件中的一个或几个条件,来预防发生死锁。(2)避免死锁。同样是实现预防的策略但是他并不是实现采取各种限制措施去破坏产生死锁的四个条件,而是在资源分配过程中,用某种方法去防止系统进入不安全的状态,从而避免死锁。(3)检测死锁。这种方法并不须事先采取任何限制性措施,也不需检查系统是否进入不安全区,而是允许系统在运行过程中发生死锁。通过系统设置的检测机构,与时的检测出死锁的发生。然后,采取适当的手段,将死锁清除掉。(4)解除死锁。与检测死锁相配套,当系统发生死锁的时候,将进程从死锁中解除出来。1.3 系统安全状态预防死锁和解除死锁都

5、是通过施加条件限制,来预防发生死锁。但预防死锁所施加的条件较严格,这往往会影响进程的并发执行,而避免死锁所施加的限制条件则较宽松,这给进程的运行提供了较宽松的环境,有利于进程的并发执行。要想避免死锁,就必须考虑进程是否处于安全状态,只要处于安全状态就可以避免死锁。所谓的安全状态就是指系统按某种进程顺序(P1,P2,Pn)(称为安全序列),来为某种进程分配资源,直至满足每个进程对资源的最大需求,使每个进程都能够顺利完成。但如果系统无法找到这样一个安全序列,则称系统处于不安全状态。1.4 银行家算法银行家算法是最具有代表性的避免死锁的算法,是由于该算法能用于银行系统现金贷款的发放而得名。我们可以把

6、操作系统看作是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。为保证资金的安全,银行家规定:(1)当一个顾客对资金的最大需求量不超过银行家现有的资金时就可接纳该顾客;(2)顾客可以分次贷款,但贷款的总数不能超过最大需求量;(3)当银行家现有的资金不能满足顾客尚需的贷款数额时,对顾客的贷款可推迟支付,但总能使顾客在有限的时间里得到贷款;(4)当顾客得到所需的资金后,一定能在有限的时间里归还所有的资金。操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前

7、的申请量分配资源,否则就推迟分配。当进程在执行中继续申请资源时,先测试该进程已占用的资源数与本次申请的资源数之和是否超过了该进程对资源的最大需求量。若超过则拒绝分配资源,若没有超过则再测试系统现存的资源能否满足该进程尚需的最大资源量,若能满足则按当前的申请量分配资源,否则也要推迟分配。那么,安全序列在银行家算法中的实际意义在于:系统每次进行资源分配后,如果对于系统中新的资源状况,存在一个安全序列,则至少存在一条确保系统不会进入死锁的路径。2需求分析2.1问题描述运用银行家算法避免死锁的发生是在确保当前系统安全的前提下推进的,对进程请求先进行安全性检查来决定资源分配与否,从而确保系统的安全,有效

8、的避免了死锁的发生。问题的关键在于安全性算法,即查找安全性序列。2.2 基本要求(1)从键盘输入当前系统的资源信息,包括当前可用资源,每个进程对各类资源的最大需求量,每个进程当前已分配的各个资源量和每个进程尚需要的各个资源量;(2)输入进程请求,按照设计好的安全性算法进行检查,得到结果并输出整个执行过程的相关信息和最终结果;(3)要求要有各种异常的处理,程序的可控制性和可连续性执行。包括对进程的存在有无检查,请求向量的不合法检查,试分配失败后的数据恢复和重新接受进程请求等。 2.3 数据流模型用键盘输入信息,对系统资源初始化,输入进程请求,用安全性算法进行安全性检查,系统安全的话就进行试分配,

9、再进行安全性检查;如果试分配失败则恢复系统。如图1所示。图1 数据流模型3概要设计3.1 模块的划分由于该算法规模较小,所以选用结构化的设计方法,将该系统划为四块,分别是:(1)主模块,处在整个系统的最高层,负责组织调用其他模块;(2)初始化模块,负责从键盘读入系统资源和进程状态,并将系统初识资源分配状态打印;(3)试分配模块,负责处理进程请求和相应的数据结构的修改,以与特殊情况的处理;(4)安全性检查,负责试分配后的安全性检查,以与系统不安全时的资源恢复。3.2 模块调用关系银行家算法系统有四个模块,各模块之间的调用关系如图2所示:图2 模块调用关系图3.3 各模块之间的接口系统的四个模块用

10、到三个接口。分别为Flag1,pro,Flag2。它们的功能介绍如下:Flag1:试分配模块Attempt_Allocation与安全性检查Safety_Algorithm之间接口Attempt_Allocation通过检查 flag的真假了判断是否执行。Pro:一个地址,Safety_Algorithm返回给主模块main的信息,不为NULL时表示试分配成功,否则系统转入相应异常处理。Flag2:Safety_Algorithm与主模块之间的接口,为真则调用打印函数,输出最终结果,否则调用恢复函数,恢复之前系统状态。3.4 程序流程图假设Request是进程的请求向量,Need是需求向量,A

11、vailable是可利用资源向量。如果RequestjNeedi,j,则认为出错,进入等待状态。因为它所需要的资源数已经超得过最大值,否则判断Requestj,Availablej。如果RequestjAvailablej,则表示尚无足够资源,进程需要等待。接着,系统试探着把资源分配给进程,系统执行安全性算法。检查此次分配后系统是否处于安全状态。若安全,才正式将资源分配给进程,来完成分配。否则,将本次的试探分配作废,恢复原来的资源分配。具体程序总流程图如图3所示。图3程序总流程图4 详细设计4.1 数据结构选取分析该算法中用到了较多的数据,基于程序的易实现和较好的结构,决定采用结构链表,以进程

12、为单位(结点)。4.2 数据结构设计typedef struct my_process int num; int MaxM; int AllocationM; int NeedM; struct my_process* next; process;int AvailableM=0;int RequestM=0;int Record_workNM=0;int SafetyN=0; 4.3 算法整体设计与调用主函数void main()主要分四大块:(1)首先需要初始化Init_process(process *head,int m,int* count),存储系统当前状态信息;(2)调用安全算法

13、Safety_Algorithm,检测当前系统安全状态,若安全则进行下一步,否则打印相关信息,程序退出;(3)调用试分配函数Attempt_Allocation,进行试分配,若试分配成功,修改相关数据结构,打印当前系统资源分布图,转下一步。否则,打印提示信息,接收其他请求向量;(4)再次调用安全性算法,检查试分配以后的系统安全性,若安全打印安全性序列和当前系统资源分布图,并进入新一轮的执行。否则之前的试分配作废,恢复试分配之前的数据结构,输出相关提示信息,接收下一个进程请求。4.4 程序流图(1)系统以与进程资源初始化Init_process的程序流程图 首先,读入当前系统可用资源;然后,读入

14、进程资源,建立进程链表,输入-1结束初始化;最后,打印当前系统资源分配表。如图4所示。图4 初始化Init_process的程序流程图 (2)安全性算法的程序流程图首先,初识化work,finish。然后,判断异常情况,利用Reasonable函数找到当前可执行的进程。最后,执行安全检查,并显示检查后结果,返回给flag。如图5所示。 图6试分配的程序流程图图5 安全性算法的程序流程图 (3)接受进程请求,试分配的程序流程图首先,p指针指向弧的结点。如果为空,则输出无此进程,然后,输入请求向量,检查合法性,进行试分配。如图6所示。(4)对试分配后的系统,进行安全性检查的程序流程图和图5大致一样

15、,唯一一点在于当找不到安全序列时,将本次试分配作废,恢复该次试分配之前的数据结构。如图7所示。 图7 试分配后,安全性检查的程序流程图 5 程序分析测试5.1 分模块分析与测试(1)初始化系统资源模块Init_process的测试图8初始化系统资源模块Init_process的测试 按提示输入,以-1结束整个初始化过程,并打印结果。起初效果不理想,经过一些调整后,显示才比较理想。如图8所示。(2)试分配模块Attempt_Allocation的测试图9 试分配模块Attempt_Allocation的测试试分配模块,主要是在系统进入第一次安全检查后,对系统资源的一次尝试性分配,试分配完成后,相

16、关的数据结构被修改。如图9所示。(3)安全模块Safety_Algorithm的调试 试分配前的安全算法,结果如果输出一个安全性序列,并且经过人工检查该安全性序列,确实有效,则该模块正确,如图10所示;如果系统不安全,打印出相关信息,返回上一层。如图11所示。图10 安全模块Safety_Algorithm的调试的安全状态图11 安全模块Safety_Algorithm的调试的不安全状态 试分配后的安全算法,结果如果输出一个安全性序列,并且经过人工检查该安全性序列,确实有效,则该模块正确,如图12所示;否则,之前的试分配作废,恢复试分配前的资源状态。如图13所示。图12 试分配后输出一个安全性

17、序列图13 试分配后不安全状态的资源恢复5.2 集成测试各模块测试通过后,集成在一起测试,系统初始资源和模块测试时保持一致,以下是测试用例以与结果,基本包括了该算法的所有情况。(1)06: 结果: 无此进程。(2)01: Request(2,0,2) 结果: 系统不能满足。(3)01: Request(1,0,2) 结果: 两次安全性检查都通过,并打印出最终结果。(4)00: Request(0,2,0) 结果: 试分配后,系统不安全,试分配作废。(5)00: Request(0,1,0) 结果: 两次安全性检查都通过,并打印出最终结果。6 结论银行家算法避免死锁的研究与实现作为我的毕业设计。

18、首先,我在网上收集了一些关于银行家算法的资料,包括它的起源,以与在实际中多个领域的应用,加深了对它的理解。之后,确定自己设计的算法分四大模块。首先需要初识化系统资源;其次,安全性检查;再者,试分配;最后是试分配后的安全性检查。在程序测试中出现了很多问题。譬如,死循环,逻辑关系的设计不当,还有显示效果不理想等等。但通过查阅书本,对算法细节重新建立正确的认识后,再通过单步调试后,最终解决。在集成测试中,由于之前的模块测试做的比较扎实,所以相对只是一些细节上的问题,很快也达到了预期的效果。 参考文献1严蔚敏,吴伟民.数据结构(C语言版)M.:清华大学出社,2005.2汤小丹,梁红兵,哲凤屏等.计算机

19、操作系统(第三版)M.:电子科技大学,2007.3谭浩强.C语言程序设计M.:清华大学,2006.4于帆,妮.程序设计基础M.:清华大学,2006.5罗宇.操作系统课程M.:设计机械工业,2005.6黄水松,黄干平,曾平.计算机操作系统M.:大学,2003.7鞠时光.操作系统原理M.:理工大学,2003.8何炎祥,熊前兴.操作系统原理M.:华中科技大学,2001.9丽芬,美华.操作系统原理教程M.:电子工业,2004.10火.数据结构与算法M.:大学,2009.11扣根.操作系统概念(第七版)M.:高等教育,1992.12莉,国梁,喁喁,徐飞.Java程序设计教程M.:科技大学,2009.13

20、向群,向勇,王雷.Windows操作系统原理(第二版)M.:机械工业,2004.Bankers Algorithm To Avoid Deadlock Research and Implementation Major:Computer Science and technology Name: Wang Zidan Student ID:09407227 Supervisor:Shan FenliAbstract:Bankers algorithm what Dijkstraput forward is the most representative of the algorithm to a

21、void deadlock, this algorithm can be used for the banking system because of its cash loans. Bankers algorithm is advancing in the premise of ensuring the system security. The first is that security check to process requests, to determine the allocation of resources or not, so as to ensure the safety

22、 of the system, to avoid deadlock.This paper on the understanding and analysis of the essential meaning of bankers algorithm as well as the state of the core idea, the algorithm is implemented in the overall design, including the module design of algorithm, and the algorithm of each module through a

23、 flow chart, block coding, and testing, the final program in the test, the design ideas on strictly according to the thought of software engineering implementation, to ensure that the design and implementation of feasible, credible.Keywords:bankers algorithm; deadlock; avoid deadlock; secure sequenc

24、e致在论文的写作过程中遇到了无数的困难和障碍,都在同学和老师的帮助下度过了。尤其要感我的论文指导老师陕粉丽老师,她对我进行了无私的指导和帮助,不厌其烦的帮助进行论文的修改和改进。另外,在校图书馆查找资料的时候,图书馆的老师也给我提供了很多方面的支持与帮助。在此向帮助和指导过我的各位老师表示最真诚的感! 此外,还要感我的同学和朋友,在我写论文的过程中给予我很多素材,还在论文的撰写和排版的过程中提供热情的帮助。由于我的学术水平有限,所写论文难免有不足之处,恳请各位老师批评和指正!附录/银行家算法#include#include#include#define M 3#define N 10#defi

25、ne D12 %5d%5d%5d%5d%5d%5d%5d%5d%5d%5d%5d%5d typedef struct my_process int num; int MaxM; int AllocationM; int NeedM; struct my_process* next;process;void Insret_Tail(process *head,process node) process* p=(process*)malloc(sizeof(process); process* last=NULL; memcpy(p,&node,sizeof(process); p-next=NU

26、LL; if(NULL=*head) *head=p; else last=*head; while(last-next!=NULL) last=last-next; last-next=p; void Init_process(process *head,int m,int* count) int i,j=0; process node; printf(请初始化一组进程,进程编号从P0开始,输入-1 结束输入:n); do node.num=j+;printf(请输入第 %d个进程信息 :n,node.num); printf(最大需求矩阵: ); scanf(%d,&node.MaxP0)

27、; if(node.MaxP0!=-1) for(i=1;im;i+) scanf(%d,&node.Maxi); printf(分配矩阵: ); for(i=0;im;i+) scanf(%d,&node.Allocationi); printf(需求矩阵: ); for(i=0;im;i+) scanf(%d,&node.Needi); Insret_Tail(head,node); (*count)+; else break; while(1);void Print(process *head,int *avail,int m) process* p=NULL;int i,j; char

28、 ch; p=head; if(NULL=p) printf(当前无进程 !n); exit(0); else printf(| Process | Max | |Allocation| | Need | |Available|nn); printf(t); for(i=0;i4;i+) ch=A; for(j=0;jnum);for(j=0;jMaxj); printf(t); for(j=0;jAllocationj); printf(t); for(j=0;jNeedj); printf(t); for(j=0;jnext; puts(); process* Location(process* head,int pro_num) process *p=NULL; p=head; if(NULL=p) printf(error !n); return p; else while(p!=NULL) if(p-num=pro_num) break; else

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2