银行家算法设计实现报告.docx
- 文档编号:12858787
- 上传时间:2023-06-08
- 格式:DOCX
- 页数:9
- 大小:146.02KB
银行家算法设计实现报告.docx
《银行家算法设计实现报告.docx》由会员分享,可在线阅读,更多相关《银行家算法设计实现报告.docx(9页珍藏版)》请在冰点文库上搜索。
银行家算法设计实现报告
实习题目:
银行家算法设计实现
【需求规格说明】
对I/O系统的死锁资源的问题的解决主要的方法是银行家算法,单种资源的银行家算法和多种资源的银行家算法的解决思路一致,要求设计实现多种银行家算法,并要求所涉及的模型最少更够满足如下要求:
(1)程序能够根据进程的请求进行判断,给出系统是否安全的的提示,如果安全,要求能够显示一组进程执行的安全序列;
(2)能够根据需要,显示当前系统中各种资源的分配情况;
【算法设计】
(1)设计思想:
1.首先初始化多总资源的总量All[n],及多个进程所需的这些资源的总量Max[i][j],和当前已分配的资源数Allocation[i][j],并得到这些进程还需资源量Need[i][j],以及每种资源的剩余量Avaliable[n]等。
2.检查一个状态是否安全:
查找每个进程中未被满足的资源数是否小于或等于Avaliable[j],若是,则apply++。
当该进程所有资源都被检查完后,若apply==资源种类,说明它可以获得所需的所有资源并运行结果,并将该进程的finish[i]=true,表示改进程运行完,在将该进程获得的资源加到Avaliable上,表示为目前可用资源数。
最后将i=-1,表示重新执行上诉步骤,直到所有进程都被标记为结束。
若apply!
=资源种类,说明它不能获得所需的资源,不能运行,则坚持下一个进程。
并重新执行上诉步骤,直到所有进程都被标记为结束,或发生死锁,即找不到满足的进程。
若所有进程都被标记为结束,则表示该状态是安全的;若发生死锁,则说明该状态不安全。
IsSafe()
for循环判断每个进程是否能分配仍需的每种
资源
判断每个进程是否都标记结束
则输出安全的进程执行序列
该状态不安全,发生死
锁
将该进程标记为运行结束,并将其资源释放出
该进程不能得到所需的所有资源,判断下
一个进程
(2)设计表示:
下图为银行家算法中判断某一状态是否为安全的算法模块结构图:
否
否
是
是
该状态为安全,
去
(3)详细设计表示:
下图为IsSave()函数主要的算法流程图:
apply++;j++
Apply=0;
Avaliable[m]=Avaliable[m
]+Allocation[i][m];
Finish[i]=True;
Return-1
Return1
否
否
i e 是 j Avaliable[j] lse 是 apply==N 是 I 是 【调试报告】 主要算法是判断该状态是否为安全状态,因此,在查找每个进程中未被满足的资源数是否小于或等于Avaliable[j]时,首先是要判断Finish[i]==False是否为真,当该进程已经运行结束就不需要再执行for循环内的判断。 当有一个进程能分配所需资源而被运行后,需要标记该进程已结束,即finish[i]=true且需要把该进程的资源释放出来。 当这些完成后,需要注意将i=-1,因为此时要重新查找每一个进程,而不是简单的执行下一个循环(会出现问题)。 整个代码都将数组的大小暂定为100,因为一般资源及进程都不会超过100,且不能太大和太小。 【用户手册】 由于只是简单的win32程序,加ctrl+F5即可运行。 其中需要按照提示输入资源种类、每种资源的最大数量、进程数量、及每个进程需要各种资源的总量、和已分配的资源数量,由这些数据进行初始化变量,继而调用showdata()可以显示资源总量、当前每种资源的剩余量、及每个进程所需每种资源的总量的矩阵、已分配每种资源的数量的矩阵、和每个进程还需的每种资源量的矩阵。 最后调用IsSave()来判断该状态是否处于安全状态。 【附录】 主要代码实现: 判断该状态是否为安全状态IsSave(): intIsSafe()//安全性算法 { inti,j,k=0,m,apply,Finish[100]={0}; for(i=0;i { if(Finish[i]==False)//判断该进程是否已经运行结束 { apply=0;//能满足该进程所需的资源的种类 for(j=0;j { if(Need[i][j]<=Avaliable[j])//是否有可用的资源满足 { apply++;//有一种资源可以被满足 } } if(apply==N) {//如果每种资源都能被满足,则该进程被执行 for(m=0;m Avaliable[m]=Avaliable[m]+Allocation[i][m];//将该进程占用资源释放, 变为可用资源 Finish[i]=True;//标记该进程已经运行结束 temp[k]=i;//存放安全序列 i=-1;//从第一个进程开始,重新检查每一个进程 k++; } } } for(i=0;i { if(Finish[i]==False) {//逐一判断每个进程最后是否都被执行结束,若没有则该状态不安全cout<<"系统不安全"< return-1; } } //否则系统安全 cout<<"系统是安全的! "< cout<<"分配的序列: "; for(i=0;i {//输出运行进程数组 cout< if(i } cout< return0; } 输出此时的状态showdata(): voidshowdata()//显示资源矩阵 { inti,j; cout<<"系统的所有资源的总数量[All]: "< for(i=0;i cout< cout< for(j=0;j cout< cout< cout<<"系统目前可用的资源[Avaliable]: "< for(i=0;i cout< cout< for(j=0;j cout< cout< cout<<"MaxAllocationNeed"< cout<<"进程名 for(j=0;j<3;j++){ "; for(i=0;i cout< cout<<""; } cout< for(i=0;i cout<<""< for(j=0;j cout< cout<<""; for(j=0;j cout< cout<<""; for(j=0;j cout< cout< } } 测试结果:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 银行家 算法 设计 实现 报告