操作系统课程设计报告题目:银行家算法院(系):软件学院专业:软件工程班级:姓名:学号:指导教师:张静实验三银行家算法一、实验内容简要描述1.实验目标:加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。要求编写和调试一个系统动态分配资源的简单模拟程序,观察死锁产生的条件,并采用银行家算法,有效的防止和避免死锁的发生。2.实验要求:银行家算法是避免死锁的一种重要方法,本实验要求用高级语言编写和调试一个简单的银行家算法程序。用银行家算法实现资源分配。设计五个进程{p0,p1,p2,p3,p4}共享三类资源{A,B,C}的系统,例如,{A,B,C}的资源数量分别为10,5,7。进程可动态地申请资源和释放资源,系统按进程的申请动态地分配资源,要求程序具有显示和打印各进程的某一个时刻的资源分配表和安全序列;显示和打印各进程依次要求申请的资源号以及为某进程分配资源后的有关资源数据。二、报告主要内容1.设计思路A、设计进程对各在资源最大申请表示及初值确定。B、设定系统提供资源初始状态。C、设定每次某个进程对各类资源的申请表示。D、编制程序,依据银行家算法,决定其申请是否得到满足。2.主要数据结构假设有M个进程N类资源,则有如下数据结构:MAX[M*N]M个进程对N类资源的最大需求量AVAILABLE[N]系统可用资源数ALLOCATION[M*N]M个进程已经得到N类资源的资源量NEED[M*N]M个进程还需要N类资源的资源量3.主要代码importjava.util.Scanner;publicclassTest1{intno1,no2;staticintMax[][];//最大需求staticintAllocation[][];//已分配资源数staticintNeed[][];//仍需资源数staticintAvailable[];//可利用资源数staticStringname1[];staticStringname2[];staticboolean[]Finish;staticint[]temp={0};//存放安全序列staticintwork[];staticint[]Request;Scannerinput=newScanner(System.in);publicstaticvoidmain(String[]args){Test1t=newTest1();t.printFrame();//t.print();t.Safty();t.judge();}/*输入初始化数据*/publicvoidprintFrame(){System.out.println(*****************************************************);System.out.println(**);System.out.println(*银行家算法设计与实现*);System.out.println(**);System.out.println(*****************************************************);System.out.print(请输入系统中进程的个数:);no1=input.nextInt();System.out.print(请输入资源的种类数:);no2=input.nextInt();Max=newint[no1][no2];Allocation=newint[no1][no2];Need=newint[no1][no2];Available=newint[no2];name1=newString[no1];name2=newString[no2];intsum[]=newint[3];for(inti=0;ino1;i++){System.out.print(请输入进程+i+的名字:);name1[i]=input.next();}for(inti=0;ino2;i++){System.out.print(请输入资源+i+的名字:);name2[i]=input.next();}for(inti=0;ino1;i++){for(intj=0;jno2;j++){System.out.print(请输入进程+name1[i]+的+name2[j]+类资源最大需求量:);Max[i][j]=input.nextInt();}}for(inti=0;ino1;i++){for(intj=0;jno2;j++){System.out.print(请输入进程+name1[i]+的+name2[j]+类资源已占有资源量:);Allocation[i][j]=input.nextInt();Need[i][j]=Max[i][j]-Allocation[i][j];}}for(inti=0;ino2;i++){System.out.print(请输入类资源+name2[i]+的可利用资源数:);Available[i]=input.nextInt();}//for(inti=0;ino2;i++)//算出资源分配后,系统的可利用资源数//{//for(intj=0;jno1;j++)//{sum[i]+=Allocation[j][i];}//}for(inti=0;ino2;i++){Available[i]=Available[i]-sum[i];}}/*打印輸出*/publicvoidprint(){System.out.println(**************此时刻资源分配情况**************);System.out.println(NumberNameMaxAllocationNeed);for(inti=0;ino1;i++){System.out.print(+i+);System.out.print(name1[i]+);for(intj=0;jno2;j++){System.out.print(Max[i][j]+);}for(intj=0;jno2;j++){System.out.print(+Allocation[i][j]);}for(intj=0;jno2;j++){System.out.print(+Need[i][j]);}System.out.println();}System.out.print(各个类资源可利用的资源数分别为:);for(intj=0;jno2;j++){System.out.print(+Available[j]);}System.out.println();}/***进行安全性检测*/publicvoidSafty(){Finish=newboolean[no1];temp=newint[no1];inti,k=0,m,apply,j;//k为安全序列的序列数intflag=0;work=newint[no2];for(i=0;ino2;i++){work[i]=Available[i];}for(i=0;ino1;i++)//当前执行换后,重第一个开始检测{apply=0;for(j=0;jno2;j++){if(Finish[i]==false&&Need[i][j]=work[j])//{apply++;if(apply==no2){for(m=0;mno2;m++)work[m]=work[m]+Allocation[i][m];//变分配数Finish[i]=true;temp[k]=i+1;//保存安全序列i=-1;//k++;flag++;}}}}for(i=0;ino2;i++){if(Finish[i]==false){System.out.println(系统不安全!);}else{System.out.print(系统是安全的,安全序列为:);for(i=0;ino1;i++)//输出运行进程数组{System.out.print(temp[i]+--);}System.out.println();print();}}}/*进行资源分配*/publicvoidchangdata(inti){intj;for(j=0;jno2;j++){Available[j]=Available[j]-Request[j];Allocation[i][j]=Allocation[i][j]+Request[j];Need[i][j]=Need[i][j]-Request[j];}}/*利用银行家算法对申请资源对进行判定*/voidjudge(){Request=newint[no2];charch='y';inti=0,j=0;System.out.print(请输入您要分配的资源进程号:);for(j=0;j10;j++){i=input.nextInt();if(ino1){System.out.println(输入错误,请重新输入:);continue;}elsebreak;}//System.out.println(错误次数太多,看来您今天不适合进行操作,系统退出!);//System.exit(0);}System.out.println(请输入进程+i+申请的资源:);for(j=0;jno2;j++){System.out.print(name2[j]+类资源请求:);Request[j]=input.nextInt();//输入需要申请的资源}for(j=0;jno2;j++){if(Request[j]Need[i][j])//判断申请是否大于需求,若大于则出错{System.out.println(进程+i+申请的资源大于它所需要的资源。);System.out.println(分配不合理,不予分配!);ch='n';break;}else{if(Request[j]Available[j])//判断申请是否大于当前资源,若大于则{System.out.println(进程+i+申请的资源大于系统现在可利用的资源。);System.out.println(分配不合理,不予分配!);ch='n';break;}}}if(ch=='y'){changdata(i);//根据进程需求量变换资源Safty();//根据进程需求量进行银行家算法判断}System.out.println(请输入您所要进行的操作:1:继续分配2:退出);for(i=0;i5;i++){intchoice=input.nextInt();if(choice==1)judge();elseif(choice==2)System.exit(0);elseSystem.out.println(输入错误,请重新输入:);}System.out.println(错误次数太多,看来您今天不适合进行操作,系统退出!);System.exit(0);}4实验结果1设计五个进程{p0,p1,p2,p3,p4}共享三类资源{A,B,C}的系统2.初始化相关数据并打印输出3.用例测试a:进程1发出请求Request(2,1,2)——RequestNeed,可以分配。三、实验心得(实验中遇到的问题及解决过程、实验中产生的错误及原因分析、实验的体会及收获、对做好今后实验提出建设性建议等。)首先,输入欲申请资源的进程以及其所申请的资源数,存放在Request数组中。然后,判断进程请求的资源数是否大于其所需的资源数,若大于则报错并返回,若不大于则继续判断它是否大于系统在此时刻可利用的资源数,同样,如果大于则报错并反回,如果不大于则调用changedata()函数来进行预分配,之后再调用安全型算法safty检查。最后,无论此次分配是否成功,我们都可以选择继续分配或者退出系统。安全性检测我们是用safty()函数来实现的。