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

上传人:b****1 文档编号:13431227 上传时间:2023-06-14 格式:DOCX 页数:34 大小:220.91KB
下载 相关 举报
银行家算法避免死锁的研究与实现毕业论文.docx_第1页
第1页 / 共34页
银行家算法避免死锁的研究与实现毕业论文.docx_第2页
第2页 / 共34页
银行家算法避免死锁的研究与实现毕业论文.docx_第3页
第3页 / 共34页
银行家算法避免死锁的研究与实现毕业论文.docx_第4页
第4页 / 共34页
银行家算法避免死锁的研究与实现毕业论文.docx_第5页
第5页 / 共34页
银行家算法避免死锁的研究与实现毕业论文.docx_第6页
第6页 / 共34页
银行家算法避免死锁的研究与实现毕业论文.docx_第7页
第7页 / 共34页
银行家算法避免死锁的研究与实现毕业论文.docx_第8页
第8页 / 共34页
银行家算法避免死锁的研究与实现毕业论文.docx_第9页
第9页 / 共34页
银行家算法避免死锁的研究与实现毕业论文.docx_第10页
第10页 / 共34页
银行家算法避免死锁的研究与实现毕业论文.docx_第11页
第11页 / 共34页
银行家算法避免死锁的研究与实现毕业论文.docx_第12页
第12页 / 共34页
银行家算法避免死锁的研究与实现毕业论文.docx_第13页
第13页 / 共34页
银行家算法避免死锁的研究与实现毕业论文.docx_第14页
第14页 / 共34页
银行家算法避免死锁的研究与实现毕业论文.docx_第15页
第15页 / 共34页
银行家算法避免死锁的研究与实现毕业论文.docx_第16页
第16页 / 共34页
银行家算法避免死锁的研究与实现毕业论文.docx_第17页
第17页 / 共34页
银行家算法避免死锁的研究与实现毕业论文.docx_第18页
第18页 / 共34页
银行家算法避免死锁的研究与实现毕业论文.docx_第19页
第19页 / 共34页
银行家算法避免死锁的研究与实现毕业论文.docx_第20页
第20页 / 共34页
亲,该文档总共34页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

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

《银行家算法避免死锁的研究与实现毕业论文.docx》由会员分享,可在线阅读,更多相关《银行家算法避免死锁的研究与实现毕业论文.docx(34页珍藏版)》请在冰点文库上搜索。

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

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

长治学院

2013届学士学位毕业论文

 

银行家算法避免死锁的研究与实现

 

学号:

09407227

姓名:

王子丹

指导教师:

陕粉丽

专业:

计算机科学与技术

系别:

计算机系

 

完成时间:

2013年5月

 

银行家算法避免死锁的研究与实现

专业:

计算机科学与技术:

王子丹学号:

09407227

指导教师:

陕粉丽

摘要:

Dijkstra的银行家算法是最有代表性的避免死锁的算法,该算法由于能用于银行系统现金贷款的发放而得名。

银行家算法是在确保当前系统安全的前提下推进的。

对进程请求先进行安全性检查,来决定资源分配与否,从而确保系统的安全,有效的避免了死锁的发生。

该论文在理解和分析了银行家算法的核心思想以与状态的本质含义的前提下,对算法的实现在总体上进行了设计,包括对算法分模块设计,并对各个模块的算法思想通过流程图表示,分块编写代码,并进行测试,最后进行程序的测试,在设计思路上严格按照软件工程的思想执行,确保了设计和实现的可行性。

关键词:

银行家算法;死锁;避免死锁;安全性序列

 

银行家算法避免死锁的研究与实现

1前言

1.1课题背景

在多道程序系统中,虽可以借助多个进程的并发执行来改善系统的资源利用率,提高系统吞吐量,但可能发生一种危险——死锁。

如此,寻求一种避免死锁的方法便显得很重要。

死锁产生的一般原因有两点:

竞争资源和进程间推进顺序非法。

因此,我们只需在当前的有限资源下,找到一组合法的执行顺序,便能很好的避免死锁。

而银行家算法起源于银行系统的发放贷款,和计算机操作系统的资源分配完全符合,因此可以借鉴该算法的思想,设计出一种有效的算法程序,解决该问题。

1.2死锁

死锁是进程死锁的简称,是指多个进程循环等待它方占有的资源而无限期地僵持下去的局面。

很显然,如果没有外力的作用,那么死锁涉与到的各个进程都将永远处于封锁状态。

虽然进程在运行过程中会产生死锁,但死锁的发生也必须具备四个条件:

(1)互斥条件;

(2)请求与保持条件;(3)不剥夺条件;(4)环路与等待条件。

为保证系统中诸进程的正常运行,应事先采取必要的措施,来预防发生死锁。

目前,预防死锁的方法可归结为以下两种:

(1)预防死锁。

它是通过设置某些限制条件。

去破坏产生死锁的四个条件中的一个或几个条件,来预防发生死锁。

(2)避免死锁。

同样是实现预防的策略但是他并不是实现采取各种限制措施去破坏产生死锁的四个条件,而是在资源分配过程中,用某种方法去防止系统进入不安全的状态,从而避免死锁。

(3)检测死锁。

这种方法并不须事先采取任何限制性措施,也不需检查系统是否进入不安全区,而是允许系统在运行过程中发生死锁。

通过系统设置的检测机构,与时的检测出死锁的发生。

然后,采取适当的手段,将死锁清除掉。

(4)解除死锁。

与检测死锁相配套,当系统发生死锁的时候,将进程从死锁中解除出来。

1.3系统安全状态

预防死锁和解除死锁都是通过施加条件限制,来预防发生死锁。

但预防死锁所施加的条件较严格,这往往会影响进程的并发执行,而避免死锁所施加的限制条件则较宽松,这给进程的运行提供了较宽松的环境,有利于进程的并发执行。

要想避免死锁,就必须考虑进程是否处于安全状态,只要处于安全状态就可以避免死锁。

所谓的安全状态就是指系统按某种进程顺序(P1,P2,……,Pn)(称为安全序列),来为某种进程分配资源,直至满足每个进程对资源的最大需求,使每个进程都能够顺利完成。

但如果系统无法找到这样一个安全序列,则称系统处于不安全状态。

1.4银行家算法

银行家算法是最具有代表性的避免死锁的算法,是由于该算法能用于银行系统现金贷款的发放而得名。

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

为保证资金的安全,银行家规定:

(1)当一个顾客对资金的最大需求量不超过银行家现有的资金时就可接纳该顾客;

(2)顾客可以分次贷款,但贷款的总数不能超过最大需求量;

(3)当银行家现有的资金不能满足顾客尚需的贷款数额时,对顾客的贷款可推迟支付,但总能使顾客在有限的时间里得到贷款;

(4)当顾客得到所需的资金后,一定能在有限的时间里归还所有的资金。

操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。

当进程在执行中继续申请资源时,先测试该进程已占用的资源数与本次申请的资源数之和是否超过了该进程对资源的最大需求量。

若超过则拒绝分配资源,若没有超过则再测试系统现存的资源能否满足该进程尚需的最大资源量,若能满足则按当前的申请量分配资源,否则也要推迟分配。

那么,安全序列在银行家算法中的实际意义在于:

系统每次进行资源分配后,如果对于系统中新的资源状况,存在一个安全序列,则至少存在一条确保系统不会进入死锁的路径。

2需求分析

2.1问题描述

运用银行家算法避免死锁的发生是在确保当前系统安全的前提下推进的,对进程请求先进行安全性检查来决定资源分配与否,从而确保系统的安全,有效的避免了死锁的发生。

问题的关键在于安全性算法,即查找安全性序列。

2.2基本要求

(1)从键盘输入当前系统的资源信息,包括当前可用资源,每个进程对各类资源的最大需求量,每个进程当前已分配的各个资源量和每个进程尚需要的各个资源量;

(2)输入进程请求,按照设计好的安全性算法进行检查,得到结果并输出整个执行过程的相关信息和最终结果;

(3)要求要有各种异常的处理,程序的可控制性和可连续性执行。

包括对进程的存在有无检查,请求向量的不合法检查,试分配失败后的数据恢复和重新接受进程请求等。

2.3数据流模型

用键盘输入信息,对系统资源初始化,输入进程请求,用安全性算法进行安全性检查,系统安全的话就进行试分配,再进行安全性检查;如果试分配失败则恢复系统。

如图1所示。

 

 

图1数据流模型

3概要设计

3.1模块的划分

由于该算法规模较小,所以选用结构化的设计方法,将该系统划为四块,分别是:

(1)主模块,处在整个系统的最高层,负责组织调用其他模块;

(2)初始化模块,负责从键盘读入系统资源和进程状态,并将系统初识资源分配状态打印;

(3)试分配模块,负责处理进程请求和相应的数据结构的修改,以与特殊情况的处理;

(4)安全性检查,负责试分配后的安全性检查,以与系统不安全时的资源恢复。

3.2模块调用关系

银行家算法系统有四个模块,各模块之间的调用关系如图2所示:

 

图2模块调用关系图

3.3各模块之间的接口

系统的四个模块用到三个接口。

分别为Flag1,pro,Flag2。

它们的功能介绍如下:

Flag1:

试分配模块Attempt_Allocation与安全性检查Safety_Algorithm之间接口Attempt_Allocation通过检查flag的真假了判断是否执行。

Pro:

一个地址,Safety_Algorithm返回给主模块main的信息,不为NULL时表示试分配成功,否则系统转入相应异常处理。

Flag2:

Safety_Algorithm与主模块之间的接口,为真则调用打印函数,输出最终结果,否则调用恢复函数,恢复之前系统状态。

3.4程序流程图

假设Request是进程的请求向量,Need是需求向量,Available是可利用资源向量。

如果Request[j]≥Need[i,j],则认为出错,进入等待状态。

因为它所需要的资源数已经超得过最大值,否则判断Request[j],Available[j]。

如果Request[j]≥Available[j],则表示尚无足够资源,进程需要等待。

接着,系统试探着把资源分配给进程,系统执行安全性算法。

检查此次分配后系统是否处于安全状态。

若安全,才正式将资源分配给进程,来完成分配。

否则,将本次的试探分配作废,恢复原来的资源分配。

具体程序总流程图如图3所示。

 

图3程序总流程图

4详细设计

4.1数据结构选取分析

该算法中用到了较多的数据,基于程序的易实现和较好的结构,决定采用结构链表,以进程为单位(结点)。

4.2数据结构设计

typedefstructmy_process

{

intnum;

intMax[M];

intAllocation[M];

intNeed[M];

structmy_process*next;

}process;

intAvailable[M]={0};

intRequest[M]={0};

intRecord_work[N][M]={0};

intSafety[N]={0};

4.3算法整体设计与调用

主函数voidmain()主要分四大块:

(1)首先需要初始化Init_process(process**head,intm,int*count),存储系统当前状态信息;

(2)调用安全算法Safety_Algorithm,检测当前系统安全状态,若安全则进行下一步,否则打印相关信息,程序退出;

(3)调用试分配函数Attempt_Allocation,进行试分配,若试分配成功,修改相关数据结构,打印当前系统资源分布图,转下一步。

否则,打印提示信息,接收其他请求向量;

(4)再次调用安全性算法,检查试分配以后的系统安全性,若安全打印安全性序列和当前系统资源分布图,并进入新一轮的执行。

否则之前的试分配作废,恢复试分配之前的数据结构,输出相关提示信息,接收下一个进程请求。

4.4程序流图

(1)系统以与进程资源初始化Init_process的程序流程图

首先,读入当前系统可用资源;然后,读入进程资源,建立进程链表,输入-1结束初始化;最后,打印当前系统资源分配表。

如图4所示。

 

图4初始化Init_process的程序流程图

(2)安全性算法的程序流程图

首先,初识化work,finish[]。

然后,判断异常情况,利用Reasonable函数找到当前可执行的进程。

最后,执行安全检查,并显示检查后结果,返回给flag。

如图5所示。

 

 

图6试分配的程序流程图

 

图5安全性算法的程序流程图

(3)接受进程请求,试分配的程序流程图

首先,p指针指向弧的结点。

如果为空,则输出无此进程,然后,输入请求向量,检查合法性,进行试分配。

如图6所示。

(4)对试分配后的系统,进行安全性检查的程序流程图

和图5大致一样,唯一一点在于当找不到安全序列时,将本次试分配作废,恢复该次试分配之前的数据结构。

如图7所示。

 

 

 

图7试分配后,安全性检查的程序流程图

5程序分析测试

5.1分模块分析与测试

(1)初始化系统资源模块Init_process的测试

图8初始化系统资源模块Init_process的测试

按提示输入,以-1结束整个初始化过程,并打印结果。

起初效果不理想,经过一些调整后,显示才比较理想。

如图8所示。

(2)试分配模块Attempt_Allocation的测试

图9试分配模块Attempt_Allocation的测试

试分配模块,主要是在系统进入第一次安全检查后,对系统资源的一次尝试性分配,试分配完成后,相关的数据结构被修改。

如图9所示。

(3)安全模块Safety_Algorithm的调试

试分配前的安全算法,结果如果输出一个安全性序列,并且经过人工检查该安全性序列,确实有效,则该模块正确,如图10所示;如果系统不安全,打印出相关信息,返回上一层。

如图11所示。

图10安全模块Safety_Algorithm的调试的安全状态

图11安全模块Safety_Algorithm的调试的不安全状态

试分配后的安全算法,结果如果输出一个安全性序列,并且经过人工检查该安全性序列,确实有效,则该模块正确,如图12所示;否则,之前的试分配作废,恢复试分配前的资源状态。

如图13所示。

 

图12试分配后输出一个安全性序列

图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结论

银行家算法避免死锁的研究与实现作为我的毕业设计。

首先,我在网上收集了一些关于银行家算法的资料,包括它的起源,以与在实际中多个领域的应用,加深了对它的理解。

之后,确定自己设计的算法分四大模块。

首先需要初识化系统资源;其次,安全性检查;再者,试分配;最后是试分配后的安全性检查。

在程序测试中出现了很多问题。

譬如,死循环,逻辑关系的设计不当,还有显示效果不理想等等。

但通过查阅书本,对算法细节重新建立正确的认识后,再通过单步调试后,最终解决。

在集成测试中,由于之前的模块测试做的比较扎实,所以相对只是一些细节上的问题,很快也达到了预期的效果。

参考文献

[1]严蔚敏,吴伟民.数据结构(C语言版)[M].:

清华大学出社,2005.

[2]汤小丹,梁红兵,哲凤屏等.计算机操作系统(第三版)[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]向群,向勇,王雷.Windows操作系统原理(第二版)[M].:

机械工业,2004.

 

BankersAlgorithmToAvoidDeadlockResearchandImplementation

Major:

ComputerScienceandtechnologyName:

WangZidan

StudentID:

09407227Supervisor:

ShanFenli

Abstract:

BankersalgorithmwhatDijkstraputforwardisthemostrepresentativeofthealgorithmtoavoiddeadlock,thisalgorithmcanbeusedforthebankingsystembecauseofitscashloans.Bankersalgorithmisadvancinginthepremiseofensuringthesystemsecurity.Thefirstisthatsecuritychecktoprocessrequests,todeterminetheallocationofresourcesornot,soastoensurethesafetyofthesystem,toavoiddeadlock.

Thispaperontheunderstandingandanalysisoftheessentialmeaningofbankersalgorithmaswellasthestateofthecoreidea,thealgorithmisimplementedintheoveralldesign,includingthemoduledesignofalgorithm,andthealgorithmofeachmodulethroughaflowchart,blockcoding,andtesting,thefinalprograminthetest,thedesignideasonstrictlyaccordingtothethoughtofsoftwareengineeringimplementation,toensurethatthedesignandimplementationoffeasible,credible.

Keywords:

bankersalgorithm;deadlock;avoiddeadlock;securesequence

 

在论文的写作过程中遇到了无数的困难和障碍,都在同学和老师的帮助下度过了。

尤其要感我的论文指导老师——陕粉丽老师,她对我进行了无私的指导和帮助,不厌其烦的帮助进行论文的修改和改进。

另外,在校图书馆查找资料的时候,图书馆的老师也给我提供了很多方面的支持与帮助。

在此向帮助和指导过我的各位老师表示最真诚的感!

此外,还要感我的同学和朋友,在我写论文的过程中给予我很多素材,还在论文的撰写和排版的过程中提供热情的帮助。

由于我的学术水平有限,所写论文难免有不足之处,恳请各位老师批评和指正!

 

附录

//银行家算法

#include

#include

#include

#defineM3

#defineN10

#defineD12%5d%5d%5d%5d%5d%5d%5d%5d%5d%5d%5d%5d

typedefstructmy_process

{

intnum;

intMax[M];

intAllocation[M];

intNeed[M];

structmy_process*next;

}process;

voidInsret_Tail(process**head,processnode)

{

process*p=(process*)malloc(sizeof(process));

process*last=NULL;

memcpy(p,&node,sizeof(process));

p->next=NULL;

if(NULL==*head)

{

*head=p;

}

else

{

last=*head;

while(last->next!

=NULL)

{

last=last->next;

}

last->next=p;

}

}

voidInit_process(process**head,intm,int*count)

{

inti,j=0;

processnode;

printf("请初始化一组进程,进程编号从P0开始,输入-1结束输入:

\n");

do

{

node.num=j++;

printf("请输入第%d个进程信息:

\n",node.num);

printf("最大需求矩阵:

");

scanf("%d",&node.Max[P0]);

if(node.Max[P0]!

=-1)

{

for(i=1;i

{

scanf("%d",&node.Max[i]);

}

printf("分配矩阵:

");

for(i=0;i

{

scanf("%d",&node.Allocation[i]);

}

printf("需求矩阵:

");

for(i=0;i

{

scanf("%d",&node.Need[i]);

}

Insret_Tail(head,node);

(*count)++;

}

else

{

break;

}

}

while

(1);

}

voidPrint(process*head,int*avail,intm)

{

process*p=NULL;

inti,j;

charch;

p=head;

if(NULL==p)

{

printf("当前无进程!

\n");

exit(0);

}

else

{

printf("|Process|Max||Allocation||Need||Available|\n\n");

printf("\t");

for(i=0;i<4;i++)

{

ch='A';

for(j=0;j

{

printf("%4c",ch++);

}

printf("\t");

}

puts("");

while(p!

=NULL)

{

printf("%8.2d",p->num);

for(j=0;j

{

printf("%4d",p->Max[j]);

}

printf("\t");

for(j=0;j

{

printf("%4d",p->Allocation[j]);

}

printf("\t");

for(j=0;j

{

printf("%4d",p->Need[j]);

}

printf("\t");

for(j=0;j

{

printf("%4d",avail[j]);

}

printf("\n");

p=p->next;

}

puts("");

}

}

process*Location(process*head,intpro_num)

{

process*p=NULL;

p=head;

if(NULL==p)

{

printf("error!

\n");

returnp;

}

else

{

while(p!

=NULL)

{

if(p->num==pro_num)

{

break;

}

else

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 医药卫生 > 基础医学

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

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