银行家算法的实现与应用.docx
- 文档编号:28535402
- 上传时间:2023-07-18
- 格式:DOCX
- 页数:14
- 大小:141.28KB
银行家算法的实现与应用.docx
《银行家算法的实现与应用.docx》由会员分享,可在线阅读,更多相关《银行家算法的实现与应用.docx(14页珍藏版)》请在冰豆网上搜索。
银行家算法的实现与应用
银行家算法的实现与应用
学生姓名:
xxx学号:
xxxxxxxxxx
学院:
网络工程学院专业:
网络工程
指导老师:
xxx职称:
副教授
摘要:
银行家算法是一种能够避免死锁的经典算法,它通过模拟银行借贷系统的分配策略,来确保操作系统的安全运行。
本文依据操作系统课程中死锁及银行家算法的相关知识,描述了它的数据结构和算法流程,并使用C语言具体实现了该算法。
由于银行家算法中安全检查过程要求严格,导致系统开销过大,效率不高。
对此,本文对它的性能做了改进。
最后用改进后的银行家算法解决扶贫基金的有效分配问题,试验结果表明,使用该算法对扶贫基金进行分配可使扶贫基金的分配更合理,效率更高效,资产质量更优良。
关键字:
操作系统;死锁;进程;数据结构;银行家算法;资源分配
ImplementationAndApplicationof
Banker’sAlgorithm
Abstract:
Banker’salgorithm,aclassicalalgorithmtoavoiddeadlock,isusetoensurethecomputeroperatingsystemtorunsafelythroughsimulatingtheallocationstrategyofthebankborrowingandlendingsystem.Thedatastructureandflowofworkaredescribedinthepaper,andthealgorithmisimplementedbyClanguageprogramaccordingtotherelevantknowledgeaboutdeadlockandbanker’salgorithm.Asthesafetyinspectionprocessisstrict,itleadstohighsystemoverheadandlowefficiency.Soweimprovetheperformanceofalgorithm.Intheend,theimprovedbanker’salgorithmisappliedtosolvetheeffectivedistributionofpovertyalleviationfund.Theexperienceresultsshowthatusingthealgorithmofthepovertyalleviationfundsallocatedtopovertyalleviationfundallocationmorereasonable,moreefficient,moreexcellentassetquality.
KeyWords:
TheOperatingSystem;Deadlock;Process;DataStructure;Banker’sAlgorithm;TheAllocationofResources
引言
研究银行家算法就不得不提到死锁[1],在操作系统课程中,死锁作为一个重要概念在整个操作系统中占有举足轻重的地位。
为了提高资源利用率和系统吞吐量,现代操作系统大量采用多任务并行调度策略[2],因此死锁在计算机软件和硬件都迅猛发展的当代依然广泛存在。
在设计操作系统时,无法回避对死锁问题的考虑和处理。
银行家算法作为一种经典的解决死锁问题的方案,其研究的意义和重要性都是不言而喻的。
基于相关课程的学习,对银行家算法的具体实现和推广进行研究、分析并加以应用。
1.课题研究的目的和意义
1.1课题研究的目的
就目前而言,尽管人们对银行家算法已经有了相当深入的认识和研究,并已经作为一个经典算法编入教科书。
但是,仍然有继续深入研究的价值。
就本文而言,通过研究银行家算法的具体实现和现实应用,第一可以更加深入的理解死锁的特性和危害,第二可以更加深刻的掌握处理死锁的策略以及银行家算法的基本思想和流程,第三基于对银行家算法深入的认识可以对它的局限性做一些改进也可以在解决实际问题中灵活地运用它们。
1.2课题研究的意义
在计算机操作系统中银行家算法有重要的研究意义。
第一,利用银行家算法,可以检测系统为进程分配资源的情况,决定系统是否响应某进程的请求并为其分配资源,从而很好的避免了死锁的发生。
第二,在三种死锁的处理策略中,避免死锁的方法所施加的限制条件较弱,不需要特别的软硬件资源即可获得令人满意的系统性能。
第三,现实生活中资源分配的例子很多,可借助于该算法进行合理分配,达到优化资源的目的。
所以研究银行家算法是很有必要的,也是很有现实意义的。
2.银行家算法的原理分析
2.1银行家算法的基本思想
计算机系统中软硬件资源是有限的,而运行进程对资源的要求是非常多的,绝大多数情况下,系统往往不能满足当前运行进程的所有资源需求之和。
但可以采取各个击破的方法,在情况允许下先满足部分进程的需求,等这些进程运行结束后,把资源释放给系统,系统再进行分配资源给剩下的进程。
最后所有进程都得到满足。
银行家算法就是这种思想的具体体现。
Dijkstra提出的银行家算法[3]就是在银行发放一笔贷款前,预测该笔贷款是否会引起银行资金周转困难。
可以把操作系统看作是银行家,操作系统管理的资源就相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。
银行家能预测一笔贷款业务对银行是否安全,也能预测一次资源分配对计算机系统是否安全。
要解释银行家算法,必须先解释操作系统中安全状态和不安全状态[4]。
安全状态是指:
如果存在一个由系统中所有进程构成的安全序列P1,…,Pn,则系统处于安全状态。
安全状态一定没有死锁发生。
反之,如果系统中不存在一个安全序列则系统处于不安全状态。
当然,不安全状态也并不意味着一定会导致死锁[5]。
为了实现银行家算法,系统中必须设置若干数据结构。
2.2银行家算法的数据结构和描述
(1)数据结构
1 最大需求矩阵ZD:
它是一个s×t的二维数组,它定义了系统中s个进程中的每个进程对t类资源的最大需求。
如果ZD[i,j]=K,则表示process[i]需要Rj类资源的最大数目为K。
2 需求矩阵XQ:
它是一个s×t的二维数组,它用来表示每个进程尚需的各类资源数目。
如果XQ[i,j]=K,则表示process[i]还需要Rj类资源K个,才能顺利完成任务。
3 已分配矩阵FP:
它是一个s×t的二维数组,它定义了系统中每类资源当前已分配给每个进程的资源数。
如果FP[i,j]=K,则表示process[i]当前已分得Rj类资源的数目为K。
4 当前可用资源集合DQ:
它是一个含有t个元素的一维数组,其中的每个元素代表一类可利用的资源数目,其初始值是系统中所配置的该类全部可用资源的数目,计算机系统中有处理器资源、存储器资源、I/O设备资源和应用软件、文件系统等资源。
如果DQ[j]=K,则表示系统中现有Rj类资源K个。
并且上述三个矩阵之间有如下关系:
XQ[i,j]=ZD[i,j]—FP[i,j]
(2)算法流程描述
银行家算法的流程大致分为三步进行,分别是:
资源的预分配;系统的安全性检查;资源的正式分配[6]。
例如当一个进程Pi发出资源请求后,系统按下述步骤对进程Pi进行检查,银行家算法流程图如图1:
1 如果进程Pi的请求资源数目是小于等于进程Pi的需求资源数目,就执行第二步;否则认为是非法的。
2 如果进程Pi的请求资源数目是小于等于进程Pi的当前可用资源数目,就执行第三步;否则就表示当前系统中没有足够的资源供进程i使用,进程i须要阻塞等待。
3 系统试探着把资源分配给进程Pi,并修改下面数据结构中的数值:
DQ[j]=DQ[j]-Requesti[j];
FP[i,j]=FP[i,j]+Requesti[j];
XQ[i,j]=XQ[i,j]-Requesti[j];
其中Requesti[j]表示进程Pi发出的对Rj类资源的请求数目。
4 预分配后,系统执行安全性检查,安全性检查流程图如图2。
检查此次资源分配后,系统是否处于安全状态。
若安全,才正式将资源分配给进程,以完成本次分配;否则,将本次的试探分配作废,恢复原来的资源分配状态,让进程Pi等待。
图1银行家算法流程图
图2安全性算法流程图
3.银行家算法的实现和改进
3.1银行家算法的实现
(1)开发平台
银行家算法是在如下开发环境中实现的:
戴尔笔记本个人电脑;Window7操作系统;C语言;MicrosoftVisualC++6.0开发工具;
(2)实现过程
实现过程分四步进行,它们分别是:
数据的输入;预分配;安全性检查;正式分配;
1 数据的输入:
#include
#defineMaxProcess50/*最大进程数*/
#defineMaxResource50/*最大资源数*/
intDQ[MaxResource];/*可用资源数组*/
intZD[MaxProcess][MaxResource];/*最大需求矩阵*/
intFP[MaxProcess][MaxResource];/*分配矩阵*/
intXQ[MaxProcess][MaxResource];/*需求矩阵*/
intRequest[MaxProcess][MaxResource];/*进程需要资源数*/
intn,m,i,j;/*m个资源,n个进程*/
2 预分配:
IntYFP()/*预分配函数*/
{
DQ[j]=DQ[j]-Request[j];
FP[i][j]=FP[i][j]+Request[j];
XQ[i][j]=XQ[i][j]-Request[j];
/*系统尝试把资源分配给请求的进程*/
}
3 安全性检查:
Voidcheck()/*安全检查函数*/
{
for(i=0;i /*初始化进程均没有得到足够资源数并完成*/ For(j=0;j /*work[j]表示可提供进程继续运行的各类资源数*/ For(i=0;i { If(finish[i]==true) Continue;}Else { For(j=0;j {If(XQ[i][j]>work[j]){ Printf(“notenoughresource,process[%d]waiting…\n”,i); Break; }}} If(j==n)/*找到还没有完成且需求数小于可提供进程继续运行的资源数的进程*/ { Finish[i]=true; For(j=0;j Work[j]+=FP[i][j];}}/*释放该进程已分配的资源*/ (3)调试测试 下面分三种情况进行演示。 1 第一种情况: 有5个进程,每个进程需要3种资源。 当进程P1申请资源向量为(1,0,2)时,利用银行家算法和安全性算法进行检查,系统是安全的,并同意分配请求。 如图3所示: 图3第一种情况演示图 2 第二种情况: 有4个进程,每个进程需要3种资源。 当进程P1申请资源向量为(0,0,1)时,利用银行家算法和安全性算法进行检查[7],系统是安全的,并同意分配请求。 如图4所示: 图4第二种情况演示图 3 第三种情况: 有4个进程,每个进程需要3种资源。 当进程P0申请资源向量为(0,0,1)时,利用银行家算法和安全性算法进行检查,系统是不安全的,并拒绝分配请求。 图5第三种情况演示图 3.2银行家算法的改进 通过上面的操作很容易看出,银行家算法有个重要优点: 不需要像死锁预防那样添加种种限制[8],也就是所说的不需要破坏死锁产生的四个条件之一,但是银行家算法要求过于严格,在实际运行中很难得到预想的效果,例如,进程必须预先申明需要的资源总量;系统也必须提供固定数量的资源供进程使用;进程之间是相互独立的,它们的执行顺序是取决于系统安全,而不是进程间的同步要求。 尤其是,银行家算法要结合安全性算法,而安全性算法的检测需要花费过多时间,造成系统开销过大。 本文在前人研究的基础上,仔细分析算法的执行过程,从银行家算法的核心部分(安全检查)着手,尽量减少安全检查的次数,提出了改进的银行家算法。 3.2.1改进的银行家算法基本思想 改进的银行家算法基本思想: 假设系统当前各类资源可用数目大于或等于process[i]当前还需要各类资源的最大数量,则process[i]不必执行安全性检查就可以执行完。 该进程执行完后会释放它所占用的所有资源,系统可用资源增加。 在新的条件下用相同的方法去寻找其他进程,直到找不到为止,如果这样可以把所有的进程都执行完,则说明系统当前的状态是安全的,否则是不安全的。 经典的银行家算法大部分系统开销都用于了安全性检查,而改进的算法,减少了调用安全性检查函数的次数,从而有效的提高了算法效率。 3.2.2改进的银行家算法描述 第一,如果Request[i]>XQ,那么系统将认定为不安全,因为此时申请资源量超过了该进程所需的资源量;否则执行第二步。 第二,如果Request[i]>DQ,表示系统现拥有的可利用资源量不能满足进程需求,进程等待;否则执行第三步。 第三,系统试探性地把申请的资源分配给该进程,也就是在分配之前先进行数据结构的修改,看能否满足要求,然后执行第四步。 DQ=DQ-Request[i];FP=FP+Request[i];XQ=XQ-Request[i]; 第四,如果XQ<=DQ,资源顺利分配,此算法结束,否则执行第五步。 第五,系统进行安全性检查,若检查到资源分配后系统处于安全状态则按照第三步进行资源分配,否则放弃此次操作。 3.2.3改进的分析与总结 分析: 经典的银行家算法需要执行的计算量是: (m+1)*(n+2)*n/2;改进的算法在一般情况下(安全性检查涉及部分进程)所需的计算量约是: kmn/2,其中k(1<=k<=n)是安全性检查所涉及的进程个数。 以上改进的银行家算法与经典的算法相比[9],改进的算法中增加了第四步,即如果XQ<=DQ,此算法结束,所以不再耗费系统资源进行安全性检查,减小了系统开销。 总结: 改进的银行家算法,减少了安全性检查次数,从而降低了系统循环调用安全性检查函数的开销,减化了I/O操作,提高系统吞吐量;同时,也提高了银行家算法的效率,增强了实用性。 虽然本算法在理论上是出色的,能非常有效地避免死锁。 但从某种意义上来说,它缺乏实用价值。 4.银行家算法的应用 银行家算法作为一种避免死锁的经典算法,尽管存在某些算法局限性,但是它仍然是一种实用性的算法,特别在理论上有很广泛的应用,在实际生活中也可以基于银行家算法的思想应用于生活中的许多方面。 4.1基于银行家算法的扶贫基金的有效分配问题 银行家算法是一种动态分配资源的算法,利用它可使资源的分配更合理,更快捷。 2006年诺贝尔和平奖授予孟加拉国银行以及该银行创始人穆罕默德尤努斯。 尤努斯建立的孟加拉国乡村银行—“格莱珉银行”。 它是一个非政府组织的向穷人发放小额贷款以帮助其脱贫的金融模式,主要特点是: 瞄准最贫困的农户,并以贫困家庭中的妇女作为主要目标客户;提供小额短期贷款,按周期还款;无须抵押和担保人,以五人小组联保代替担保,相互监督,形成内部约束机制;按照一定比例的贷款额收取小组基金和强制储蓄作为风险基金;执行小组会议和中心会议制度,检查项目落实和资金使用情况,办理放、还、存款手续,同时还交流致富信息,传播科技知识,提高贷款人的经营和发展能力。 在批准客户的最大贷款额度后,客户对资金的使用是按阶段的。 即客户并不是第一次就申请全部额度的贷款,而是其最大额度的一部分,以后随着需要,再行申请。 在面对客户申请时,银行有两种资源可以选择。 第一种策略是只要银行还有钱就发放贷款;第二种策略[10]需要考虑发放该贷款后银行面临的风险,只有没有风险的情况下,才发放贷款。 当然,银行唯一的风险是无法满足所有客户的最大贷款额度,从而导致无法收回贷款,因为客户的贷款要求可能未能得到满足,无法完成任务并返还贷款。 4.2实例应用 假设现有扶贫基金总额为20万元,共有5人申请这些扶贫基金,其中3个农民,每人需要5万元用于投资;2个失业工人,每人需要5万元用于创业。 当前资金总额为20万元,而5个申请者共申请的资金总额为25万元。 所以用以第一种策略分配这些资金是不能满足申请者要求的。 因此可以运用银行家算法的基本思想来解决这个现实问题。 就是说可以先满足申请人的部分申请金额。 例如可以分两次来满足农民每人5万元的申请资金,第一次,派发给每个农民4万元的资金,第二次,派发给每个农民1万元的资金。 这样两次下来就满足了3个农民所申请的资金额度。 用同样的办法给2个失业工人派发所申请的资金量,第一次,派发给每个失业工人3万元,第二次,派发给每个失业工人2万元。 现在问题就是在5个申请人都得到申请金额并完成任务后能不能把20万元的扶贫资金全部收回。 接下来就用银行家算法的基本思想来分析解决这个问题[11]。 首先,把3个农民分别看做进程P1,P2,P3;把2个失业工人分别看做进程P4,P5;把20万元资金看做一种资源。 其次,列出进程及资源分配与需求情况,如表1所示: 表1资源分配初始表 进程 (P) 最大需求 (ZD) 已分配 (FP) 还需要 (XQ) 可用 (DQ) P1 5 4 1 2 P2 5 4 1 P3 5 4 1 P4 5 3 2 P5 5 3 2 最后,因为当前可用DQ可以满足5个进程中的任何一个,根据改进的银行家算法知不需要进行安全检查就知道这个分配方案是安全的。 也就是说最后能把全部的扶贫基金收回。 银行家算法是一个动态的有效预防死锁的算法[12],其优点是可合理分配已有的资源,且限制较少,资源利用率高,在有限时间里可满足所有进程的需求。 因此,在扶贫基金的有效分配问题上运用银行家算法可使资金的利用效率最大化。 5.总结 通过对银行家算法的实现与应用的研究,让我进一步对死锁及银行家算法等相关知识有了更深刻的理解和掌握。 在这一阶段的工作中我收获很多,第一,通过前段时间着手准备毕业设计,认真阅读相关文档和文献,查阅总结读后感和心得体会。 使我养成了独立思考和独立解决问题的耐心和能力,也形成了一种运用网络资源的能力。 第二,在做毕业设计的过程中我通过融会贯通这四年所学的专业理论知识和自身实践,培养了我综合运用专业知识分析问题,解决问题的能力。 同时使我对计算机的认识有了质的飞越。 第三,在这个过程中我遇到许多困难,但是最终还是用坚持战胜了它们,在与困难抗衡的过程中,不仅锻炼了勇于迎接挑战的品质,也为我以后的工作打下了坚实的基础。 参考文献 [1]汤子瀛.计算机操作系统[M].第二版.西安: 西安电子科技大学出版社,2009. [2]汤小丹,哲凤屏.计算机操作系统[M].第三版.西安: 西安电子科技大学出版社,2007. [3]刘乃琦,蒲晓蓉.操作系统原理、设计及应用[M].第一版.北京: 高等教育出版社,2008.5. [4]AndrewSTanenbaun.ModemOperatingSystems[M].SecondEdition.NewJersey: Prentice Hall,2002. [5]李春葆,尹为民,李蓉蓉等.数据结构教程[M].第三版.北京: 清华大学出版社,2009. [6]严蔚敏,吴伟民.数据结构(C语言版)[M].第一版.北京: 清华大学出版社,2011.11. [7]AbrahamSilberschatz,OperatingSystemConcepts[M].SixthEdition,2003: 188-191. [8]王晓东.算法设计与分析[M].第三版.北京: 清华大学出版社,2003.8. [9]左万利,王拉柱.银行家算法的改进[J].吉林大学自然科学学报,1997,9 (1): 35-37. [10]李金忠,曾劲涛.对银行家算法设计思想的改进及其代码实现[J].井冈山师范学院学报,2004,5(6): 12-15. [11]何其祎.基于银行家算法的救援物资有效分配方法[J],地理空间信息,2013,11(6): 3-5. [12]WUNaiqi,ZhouMengchu.Avoidingdeadlockandreducingstarvationandblockinginautomatedmanufacturingsystems[J].IEEETransactionsonRoboticsandAutomation,2001: 658-669. 致谢 时光匆匆如流水,一转眼大学四年已接近尾声,离校的日子也越来越近,学年论文的设计也即将画上句号。 首先要感谢赵老师的精心指导,才使我可以顺利地完成了论文。 从选题、开题报告、文献综述、系统设计到最后整个论文的完成,都离不开赵老师的帮助和讲解。 老师分阶段要求并督促我完成本阶段应该完成的任务,分期检查完成任务的情况并提出修改建议。 老师认真指导,大到书写的错误,小到标点符号的不正确,都会指出并及时告诉我。 老师不厌其烦的修改指导,谨向老师表示衷心的感谢和诚挚的敬意。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 银行家 算法 实现 应用