1南华大学计算机学院实验报告(2018学年春季学期)课程名称操作系统实验名称银行家算法姓名学号专业网络工程班级1班地点教师曹军2一、实验题目:系统中有m个同类资源被n个进程共享,每个进程对资源的最大需求数分别为S1,S2,…,Sn,且Max(Si)=m,(i=1,2,…n)。进程可以动态地申请资源和释放资源。编写一个程序,实现银行家算法,当系统将资源分配给某一进程而不会死锁时,就分配之。否则,推迟分配,并显示适当的信息。二、实验目的:当系统的总资源数m小于或等于所有进程对资源的最大需求Snni∑i−=1时,就可能产生死锁。死锁会引起计算机系统的瘫痪。银行家算法是在实现资源分配时避免死锁的一个著名算法,该算法是在能确保系统处于安全状态时才把资源分配给申请者。通过本实验进一步理解死锁的概念,并选择一个算法来避免死锁。进一步理解利用银行家算法避免死锁的问题;在了解和掌握银行家算法。理解和掌握安全序列、安全性算法。三、实验内容及要求:1、设计进程对各类资源最大申请表示及初值的确定。2、设定系统提供资源的初始状况。3、设定每次某个进程对各类资源的申请表示。4、编制程序,依据银行家算法,决定其资源申请是否得到满足。5、显示资源申请和分配时的变化情况。四、实验过程:程序要求:1.判断当前状态是否安全,如果安全,给出安全序列;如果不安全给出理由。2.对于下一个时刻T1,某个进程Pk会提出请求Request(R1,…,Rm),判断分配给Pk进程请求的资源之后是否安全。如果安全,给出安全序列;如果不安全给出理由。3.输入:进程个数n,资源种类m,T0时刻各个进程的资源分配情况(可以运行输入,也可以在程序中设置)。4.输出:如果安全输出安全的进程序列,不安全提示信息。进程调度的实现过程:1.变量初始化;2.接收用户输入n,m,(输入或者默认的)Allocationij,Needij;3.按照银行家算法判断当前状态安全与否,安全给出安全序列,不安全给出提示;4.如果安全,提示用户输入下一时刻进程Pk的资源请求Request(R1,…,Rm);5.如果不安全或者无新请求则退出。3源代码:#includestdio.h#includeiostream#includeiomanip#includefstream#includewindows.husingnamespacestd;#defineMaxNumber20staticintn;staticintm;staticintAvailable[MaxNumber];staticintMax[MaxNumber][MaxNumber];staticintAllocation[MaxNumber][MaxNumber];staticintNeed[MaxNumber][MaxNumber];staticintRequest[MaxNumber];staticintSafeOrder[MaxNumber];staticboolFinish[MaxNumber];staticboolisDisplayAvaliable=true;staticcharsourceName[]={'A','B','C','D','E','F','G','H','I','J','K'};//资源名称voidinput();boolisSystemSafe();voidbankerAlgorithm();voiddisplay();intmain(){input();bankerAlgorithm();system(pause);return0;}voidinput(){//intn=6;//intm=3;ifstreaminData;inData.open(C:/476.txt);//读取数据inDatan;inDatam;4for(inti=0;im;i++){inDataAvailable[i];}for(inti=0;in;i++){for(intj=0;jm;j++){inDataAllocation[i][j];}}for(inti=0;in;i++){for(intj=0;jm;j++){inDataNeed[i][j];}}for(inti=0;in;i++){for(intj=0;jm;j++){Max[i][j]=Need[i][j]+Allocation[i][j];}}cout*****************************程序开始*******************************endl;display();}boolisSystemSafe(){intwork[MaxNumber];for(inti=0;im;i++)//m是资源个数A,B,C{work[i]=Available[i];}for(inti=0;in;i++)//n是进程个数{Finish[i]=false;SafeOrder[i]=-1;//初始化安全序列}intFinishNumebr=0;intisSafe;5inti=0,j;while(in){isSafe=0;for(j=0;jm;j++){if(Finish[i]==false&&Need[i][j]=work[j]){isSafe++;}elsebreak;}if(isSafe==m)//当且仅当进程对应的所有资源的数量都满足的时候才成立{Finish[i]=true;SafeOrder[FinishNumebr]=i;FinishNumebr++;for(j=0;jm;j++){work[j]+=Allocation[i][j];}i=0;//找到满足条件的进程后,从头开始再进行寻找}elsei++;if(FinishNumebr==n){cout**********************************Safe!******************************endl;cout对应的安全序列为:endl;coutPSafeOrder[0];for(inti=1;in;i++){cout--PSafeOrder[i];}coutendl;returntrue;}}cout******************************unSafe!*************************6*****endl;returnfalse;}voidbankerAlgorithm(){intchooseProcess;charisContinue;while(true){//设置两个布尔变量:判别请求向量是等待还是系统已经不再分配新的资源boolisRequestNeedOK=true;boolisRequestAvailableOK=true;cout请输入要申请资源的进程号(注意:第一个进程为0号,第二个进程为1号,以此类推!)endlchooseProcess=;cinchooseProcess;cout请输入进程所请求的各类资源的数量:(ABC)endl;for(inti=0;im;i++){cinRequest[i];}//输入错误判断for(inti=0;im;i++){if(Request[i]Need[chooseProcess][i]){cout**************************当前运行结果*****************************endl;cout您输入的请求进程所对应的资源数量超过最大需求量,请重新输入!endl;//cout****************************************************************endl;isRequestNeedOK=false;continue;}if(Request[i]Available[i]){cout**************************当前运行结果*****************************endl;cout您输入的请求进程的资源数量超过系统所供给的最大资源数量pi必须等待,请重新输入!endl;//cout****************************************************************endl;isRequestAvailableOK=false;7continue;}}for(intj=0;jm;j++){Available[j]-=Request[j];Allocation[chooseProcess][j]+=Request[j];Need[chooseProcess][j]-=Request[j];}cout**********************************************************************endl;if(!isSystemSafe())//如何不满足系统安全性算法,将本次试探作废,恢复到原来的值{for(intj=0;jm;j++){Available[j]+=Request[j];Allocation[chooseProcess][j]-=Request[j];Need[chooseProcess][j]+=Request[j];}//当请求向量Request满足和Need、Available的关系时,证明系统已不能再分配资源if(isRequestAvailableOK&&isRequestNeedOK){cout**************************当前运行结果*****************************endl;cout当前可利用资源已经不能满足任何进程的需求,故系统进入不安全状态,系统不分配资源!endl;cout****************************************************************endl;}}cout尝试根据p(i)发出的请求向量后的资源情况:endl;display();cout*******************************************************************endl;cout是否继续输入请求变量request进行测试,是(Y),否(N)endl;coutisContinue=;cinisContinue;if(isContinue=='Y'||isContinue=='y')8{//input();//实现多次请求(保留上一次请求的状态)continue;}elseif(isContinue=='N'||isContinue=='n'){cout******************************程序结束*****************************endl;break;}}}voiddisplay(){charprocessName[]={'1','2','3','4','5','6'};cout----------------------------------------------------------------------endl;cout当前进程个数为n=nendl;cout当前资源个数为m=mendl;cout系统可利用资源数情况如下:endl;for(inti=0;im;i++){coutsetw(5)sourceName[i];}coutendl;coutsetw(5)Available[0]