《银行家算法课程实习报告(共6页).docx》由会员分享,可在线阅读,更多相关《银行家算法课程实习报告(共6页).docx(6页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上实习题目:银行家算法设计实现【需求规格说明】对I/O系统的死锁资源的问题的解决主要的方法是银行家算法,单种资源的银行家算法和多种资源的银行家算法的解决思路一致,要求设计实现多种银行家算法,并要求所涉及的模型最少更够满足如下要求:(1) 程序能够根据进程的请求进行判断,给出系统是否安全的的提示,如果安全,要求能够显示一组进程执行的安全序列;(2) 能够根据需要,显示当前系统中各种资源的分配情况;【算法设计】(1)设计思想:1.首先初始化多总资源的总量Alln,及多个进程所需的这些资源的总量Maxij,和当前已分配的资源数Allocationij,并得到这些进程还需资源量
2、Needij,以及每种资源的剩余量Avaliablen等。2.检查一个状态是否安全:查找每个进程中未被满足的资源数是否小于或等于Avaliablej,若是,则apply+。当该进程所有资源都被检查完后,若apply=资源种类,说明它可以获得所需的所有资源并运行结果,并将该进程的finishi=true,表示改进程运行完,在将该进程获得的资源加到Avaliable上,表示为目前可用资源数。最后将i=-1,表示重新执行上诉步骤,直到所有进程都被标记为结束。若apply!=资源种类,说明它不能获得所需的资源,不能运行,则坚持下一个进程。并重新执行上诉步骤,直到所有进程都被标记为结束,或发生死锁,即找
3、不到满足的进程。若所有进程都被标记为结束,则表示该状态是安全的;若发生死锁,则说明该状态不安全。(2)设计表示:下图为银行家算法中判断某一状态是否为安全的算法模块结构图:否是否是IsSafe( )for循环判断每个进程是否能分配仍需的每种资源判断每个进程是否都标记结束该状态为安全,则输出安全的进程执行序列该状态不安全,发生死锁将该进程标记为运行结束,并将其资源释放出去该进程不能得到所需的所有资源,判断下一个进程(3)详细设计表示:下图为IsSave()函数主要的算法流程图:是是是是iM&Finishi=Falseapply+;j+jN&Needij=AvaliablejlseApply=0;a
4、pply=NAvaliablem=Avaliablem+Allocationim;Finishi=True;否IM&Finishi=FalseeReturn -1Return 1否【调试报告】主要算法是判断该状态是否为安全状态,因此,在查找每个进程中未被满足的资源数是否小于或等于Avaliablej时,首先是要判断Finishi=False是否为真,当该进程已经运行结束就不需要再执行for循环内的判断。 当有一个进程能分配所需资源而被运行后,需要标记该进程已结束,即finishi=true且需要把该进程的资源释放出来。当这些完成后,需要注意将i=-1,因为此时要重新查找每一个进程,而不是简单的
5、执行下一个循环(会出现问题)。 整个代码都将数组的大小暂定为100,因为一般资源及进程都不会超过100,且不能太大和太小。【用户手册】由于只是简单的win32程序,加ctrl+F5即可运行。其中需要按照提示输入资源种类、每种资源的最大数量、进程数量、及每个进程需要各种资源的总量、和已分配的资源数量,由这些数据进行初始化变量,继而调用showdata()可以显示资源总量、当前每种资源的剩余量、及每个进程所需每种资源的总量的矩阵、已分配每种资源的数量的矩阵、和每个进程还需的每种资源量的矩阵。最后调用IsSave()来判断该状态是否处于安全状态。【附录】主要代码实现:判断该状态是否为安全状态IsSa
6、ve():int IsSafe()/安全性算法int i,j,k=0,m,apply,Finish100=0;for(i=0;iM;i+)/查找每个进程 if(Finishi=False)/判断该进程是否已经运行结束apply=0;/能满足该进程所需的资源的种类for(j=0;jN;j+)/对该进程的每个资源进行判断if (Needij=Avaliablej)/是否有可用的资源满足 apply+;/有一种资源可以被满足if(apply=N)/如果每种资源都能被满足,则该进程被执行for(m=0;mN;m+)Avaliablem=Avaliablem+Allocationim;/将该进程占用资源
7、释放,变为可用资源 Finishi=True;/标记该进程已经运行结束tempk=i;/存放安全序列i=-1; /从第一个进程开始,重新检查每一个进程k+;for(i=0;iM;i+)if(Finishi=False)/逐一判断每个进程最后是否都被执行结束,若没有则该状态不安全cout系统不安全endl;/不成功系统不安全return -1;/否则系统安全cout系统是安全的!endl;/如果安全,输出成功cout分配的序列:;for(i=0;iM;i+)/输出运行进程数组couttempi;if(iM-1) cout;coutendl;return 0;输出此时的状态showdata():v
8、oid showdata()/显示资源矩阵int i,j;cout系统的所有资源的总数量All:endl;for(i=0;iN;i+)coutnamei ;coutendl;for (j=0;jN;j+)coutAllj ;/输出分配资源coutendl;cout系统目前可用的资源Avaliable:endl;for(i=0;iN;i+)coutnamei ;coutendl;for (j=0;jN;j+)coutAvaliablej ;/输出分配资源coutendl;cout Max Allocation Needendl;cout进程名 ;for(j=0;j3;j+)for(i=0;iN;i+)coutnamei ;cout ;coutendl;for(i=0;iM;i+)cout i ;for(j=0;jN;j+)coutMaxij ;cout ;for(j=0;jN;j+)coutAllocationij ;cout ;for(j=0;jN;j+)coutNeedij ;coutendl;测试结果:专心-专注-专业