1、银行家算法实验报告操作系统课程设计报告题目: 银行家算法 院 系班 级 姓 名学 号 指 导 教 师 银行家算法实验报告 一、概述编写算法,实现银行家算法、安全性算法、死锁检测算法判断系统安全状态、判断进程的资源请求是否可以被满足、判定系统是否为死锁状态。银行家算法是避免死锁的一种重要方法,通过编写一个简单的银行家算法程序,加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。二、设计的基本概念和原理1、算法思路:先对用户提出的请求进行合法性检查,即检查请求是否大于需要的,是否大于可利用的。若请求合法,则进行预分配,对分配后的状态调用安全性算法进行检查。若安全,则分配
2、;若不安全,则拒绝申请,恢复到原来的状态,拒绝申请。2、银行家算法步骤:(1)如果Requestior =Need,则转向步骤(2);否则,认为出错,因为它所需要的资源数已超过它所宣布的最大值。(2)如果Requestor=Available,则转向步骤(3);否则,表示系统中尚无足够的资源,进程必须等待。(3)系统试探把要求的资源分配给进程Pi,并修改下面数据结构中的数值: Available=Available-Requesti; Allocation=Allocation+Request;Need=Need-Request;(4)系统执行安全性算法,检查此次资源分配后,系统是否处于安全状
3、态。 3、安全性算法步骤: (1)设置两个向量工作向量Work。它表示系统可提供进程继续运行所需要的各类资源数目,执行安全算法开始时,Work=Allocation;布尔向量Finish。它表示系统是否有足够的资源分配给进程,使之运行完成,开始时先做Finishi=false,当有足够资源分配给进程时,令Finishi=true。(2)从进程集合中找到一个能满足下述条件的进程:Finishi=falseNeedor=Work如找到,执行步骤(3);否则,执行步骤(4)。(3)当进程P获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行:Work=Work+Allocation;F
4、inishi=true; 转向步骤(2)。(4)如果所有进程的Finishi=true,则表示系统处于安全状态;否则,系统处于不安全状态。4、死锁检测和解除编程实现死锁检测算法、死锁解除算法,数据动态输入,解锁采用释放最大死锁进程资源的方法实现。三、总体设计运用c+实现对这三个算法的进行实现,通过自定义进程数和进程资源的各项数据情况对其进行分配,将其用函数分开,在实现每一步时进行调用。数据结构:int Available20;int Max1020;int Allocation1020;int Need1020;int Request1020;bool Finish10;int p10;int
5、 Work20;int m,n;string showdata14=Max ,Allo,Need,Aval;string showdata25=Work,Need,Allo,W+al,Finish;流程图:系统主要过程流程图银行家算法流程图安全性算法流程图四、详细设计#include #include #include #include using namespace std;int Available20;int Max1020;int Allocation1020;int Need1020;int Request1020;bool Finish10;int p10;int Work20;i
6、nt m,n;string showdata14=Max ,Allo,Need,Aval;string showdata25=Work,Need,Allo,W+al,Finish;void iShow() int size,size2; cout系统; for(int k=0;k4;k+) size=showdata1k.length(); size2=(n*3+5-size)/2; coutsetw(size2+size)showdata1ksetw(size2) ; coutendl; cout资源; for(int k=0;k4;k+) char sourcename=A; cout ;
7、 for(int kk=0;kkn;kk+) cout sourcename; sourcename+; cout ; coutendl; for(int ii=0;iim;ii+) coutPii ; for(int jj=0;jjn;jj+) coutsetw(3)Maxiijj; cout ; for(int jj=0;jjn;jj+) coutsetw(3)Allocationiijj; cout ; for(int jj=0;jjn;jj+) coutsetw(3)Neediijj; cout ; if(ii=0) for(int iii=0;iiin;iii+) coutsetw(
8、3)Availableiii; cout endl; void fShow() cout系统; for(int k=0;k5;k+) int size=showdata2k.length(); int size2=(n*3+5-size)/2; coutsetw(size2+size)showdata2ksetw(size2) ; coutendl; cout资源; for(int k=0;k4;k+) char sourcename=A; cout ; for(int kk=0;kkn;kk+) coutsetw(3)sourcename; sourcename+; cout ; coute
9、ndl;void Init() /*初始化算法*/ int i,j; ifstream myfile (a.txt); if(!myfile) cout Unable to open myfile; coutm; coutn; cout请输入每个进程最多Max所需的各资源数,按照mxn矩阵输入endl; for(i=0;im;i+) for(j=0;jMaxij; cout请输入每个进程已分配Allocation的各资源数,按照mxn矩阵输入endl; for(i=0;im;i+) for(j=0;jAllocationij; Needij=Maxij-Allocationij; cout请输
10、入各个资源现有的Available数目:endl; for(i=0;iAvailablei; iShow();bool Safe() fShow(); int i,j,k,l=0; for(i=0;in;i+) Worki=Availablei; for(i=0;im;i+) Finishi=false; for(i=0;im;i+) if(Finishi=true) continue; else for(j=0;jWorkj) break; if(j=n) Finishi=true; coutPi ; for(k=0;kn;k+) coutsetw(3)Workk; cout ; for(k
11、=0;kn;k+) coutsetw(3)Needik; cout ; for(k=0;kn;k+) coutsetw(3)Allocationik; cout ; for(k=0;kn;k+) coutsetw(3)Workk+Allocationik; cout ; coutsetw(10)trueendl; for(k=0;kn;k+) Workk+=Allocationik; pl+=i; i=-1; /*再次由进程从小到大遍历*/ else continue; if(l=m) /*进程记录p的数量等于资源总量,全部进程均已经满足*/ cout系统是安全的endl; cout安全序列:
12、endl; for(i=0;il;i+) coutpi; if(i!=l-1) cout; coutendl; return true; coutn无法继续找到可满足的进程!endl; cout系统是不安全的endl; return false;void Bank() int i,cusneed; char again; while(1) coutcusneed; coutn请输入进程所请求的各资源的数量endl; for(i=0;iRequestcusneedi; for(i=0;iNeedcusneedi) cout您输入的请求数超过进程的需求量!请重新输入!Availablei) cou
13、t您输入的请求数超过系统有的资源数!请重新输入!endl; continue; for(i=0;in;i+) Availablei-=Requestcusneedi; Allocationcusneedi+=Requestcusneedi; Needcusneedi-=Requestcusneedi; if(Safe() cout同意分配请求!endl; else cout您的请求被拒绝!endl; for(i=0;in;i+)/*资源分配后不安全,回滚分配资源操作*/ Availablei+=Requestcusneedi; Allocationcusneedi-=Requestcusnee
14、di; Needcusneedi+=Requestcusneedi; for(i=0;im;i+) Finishi=false; cout您还想再次请求分配吗?是请按y/Y,否请按其它键again; if(again=y|again=Y) continue; break; int main() while(true) Init(); if(Safe() break; cout当前系统不安全,请重新初始化系统; Bank(); return 0;5、测试与数据分析假设系统中有三个进程p,q,r和三类资源a,b,c,各种资源的数量分别为10,5,7,在T0时刻的资源分配情况如图资源情况进程Maxa
15、 b cAllocationa b cNeeda b c Availablea b c P7 5 3 0 1 07 4 33 3 2 Q3 2 22 0 01 2 2 R9 0 23 0 26 0 0运行程序后输入数据如图使用银行家算法所分配的情况和安全检查情况为死锁检测与排除的运行结果为六、完成的情况、简要的使用说明这两个程序已经完成了对进程以资源之间检测与分配功能,并且能够在给出资源的分配情况后检测需求是否会发生死锁状况并给出解除方案。运行程序后只需按照提示操作即可观察到进程对资源的调用情况。七、结果分析程序运行稳定,安全,充分展示了银行家算法、安全性算法、死锁检测与解除算法的实现情况。八、总结多个进程同时运行时,系统根据各类系统资源的最大需求和各类系统的剩余资源为进程安排安全序列,使得系统能快速且安全地运行进程,不至发生死锁。银行家算法是避免死锁的主要方法,其思路在很多方面都非常值得我们来学习借鉴。通过对算法的编写让我了解到计算机在调度进程时的具体过程,也明白了解决死锁的原理。九、参考文献 1 汤子瀛 梁红兵 哲凤屏 汤子灜.计算机操作系统(第三版).西安:西安电子科技大学出版社,2007.5. 2 谭浩强. C+面向对象程序设计.北京:清华大学出版社,2006.01.
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1