银行家算法.docx
《银行家算法.docx》由会员分享,可在线阅读,更多相关《银行家算法.docx(18页珍藏版)》请在冰点文库上搜索。
银行家算法
实验二银行家算法
一、实验目的
利用银行家算法,可以来检测CPU为进程分配资源的情况,决定CPU是否响应某进程的的请求并为其分配资源,从而很好避免了死锁的产生。
使用高级编程语言编写程序,来模拟银行家算法的实现过程
二、实验内容
(1)如果Requesti<or=Need,则转向步骤
(2);否则,认为出错,因为它所需要的资源数已超过它所宣布的最大值。
(2)如果Request<or=Available,则转向步骤(3);否则,表示系统中尚无足够的资源,进程必须等待。
(3)系统试探把要求的资源分配给进程Pi,并修改下面数据结构中的数值:
Available=Available-Request[i];
Allocation=Allocation+Request;
Need=Need-Request;
(4)系统执行安全性算法,检查此次资源分配后,系统是否处于安全状态。
三、程序流程图
1、系统主要过程流程图
2、银行家算法流程图
3、安全性算法流程图
注:
程序流程图是根据自己程序的整个流程用photoshop制成,再插入进来。
四、源程序清单
packagebank;
importjava.util.Scanner;
publicclassTest
{
intno1,no2;
staticintMax[][];//最大需求
staticintAllocation[][];//已分配资源数
staticintNeed[][];//仍需资源数
staticintAvailable[];//可利用资源数
staticStringname1[];
staticStringname2[];
staticboolean[]Finish;
staticint[]temp={0};//存放安全序列
staticintwork[];
staticint[]Request;
Scannerinput=newScanner(System.in);
publicstaticvoidmain(String[]args){
Testt=newTest();
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;i{
System.out.print("请输入进程"+i+"的名字:
");
name1[i]=input.next();
}
for(inti=0;i{
System.out.print("请输入资源"+i+"的名字:
");
name2[i]=input.next();
}
for(inti=0;i{
for(intj=0;j{
System.out.print("请输入进程"+name1[i]+"的"+name2[j]
+"类资源最大需求量:
");
Max[i][j]=input.nextInt();
}
}
for(inti=0;i{
for(intj=0;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;i{
System.out.print("请输入类资源"+name2[i]+"的可利用资源数:
");
Available[i]=input.nextInt();
}
//for(inti=0;i//{
//for(intj=0;j//{sum[i]+=Allocation[j][i];}
//}
for(inti=0;i{Available[i]=Available[i]-sum[i];}
}
/*打印輸出*/
publicvoidprint()
{
System.out.println("**************此时刻资源分配情况**************");
System.out.println("NumberNameMaxAllocationNeed");
for(inti=0;i{
System.out.print(""+i+"");
System.out.print(name1[i]+"");
for(intj=0;j{System.out.print(Max[i][j]+"");}
for(intj=0;j{System.out.print(""+Allocation[i][j]);}
for(intj=0;j{System.out.print(""+Need[i][j]);}
System.out.println();
}
System.out.print("各个类资源可利用的资源数分别为:
");
for(intj=0;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;i{work[i]=Available[i];}
for(i=0;i{
apply=0;
for(j=0;j{
if(Finish[i]==false&&Need[i][j]<=work[j])//
{
apply++;
if(apply==no2)
{
for(m=0;mwork[m]=work[m]+Allocation[i][m];//变分配数
Finish[i]=true;
temp[k]=i+1;//保存安全序列
i=-1;//
k++;
flag++;
}
}
}
}
for(i=0;i{
if(Finish[i]==false){System.out.println("系统不安全!
");}
else
{
System.out.print("系统是安全的,安全序列为:
");
for(i=0;i{System.out.print(temp[i]+"-->");}
System.out.println();
print();
}
}
}
/*进行资源分配*/
publicvoidchangdata(inti)
{
intj;
for(j=0;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;j<10;j++)
{
i=input.nextInt();
if(i>no1)
{System.out.println("输入错误,请重新输入:
");continue;}
elsebreak;
}
//System.out.println("错误次数太多,看来您今天不适合进行操作,系统退出!
");
//System.exit(0);}
System.out.println("请输入进程"+i+"申请的资源:
");
for(j=0;j{
System.out.print(name2[j]+"类资源请求:
");
Request[j]=input.nextInt();//输入需要申请的资源
}
for(j=0;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;i<5;i++)
{
intchoice=input.nextInt();
if(choice==1)judge();
elseif(choice==2)System.exit(0);
elseSystem.out.println("输入错误,请重新输入:
");
}
System.out.println("错误次数太多,看来您今天不适合进行操作,系统退出!
");
System.exit(0);
}
}
五、结果及分析
5.1测试用例为课本上的例题:
某系统有R1、R2和R3共3种资源,在T0时刻P1、P2、P3和P4这4个进程对资源的占用和需求情况见下表,此刻系统的可用资源为(2,1,2)。
进程最大需求量占有量
R1R2R3R1R2R3
P1322100
P2613411
P3314211
P4422002
取了4种不同的例子,来测试系统的主要功能是否实现:
进程iRequest[i]检测结果
a.1212Request>Need
b.0222Request>Available
c.1101可以分配
d.0101系统不安全
5.2测试结果截图:
开始界面
初始化并打印输出
用例测试a:
进程1发出请求Request(2,1,2)——Request>Need,不予分配。
用例测试b:
进程0发出请求Request(2,2,2)——Request>Available,不予分配。
用例测试c:
进程1发出请求Request(1,0,1)——可以分配。
用例测试d:
进程0发出请求Request(1,0,1)——系统不安全。
输入测试a:
如果所输入的要分配资源的进程号不在存在的进程,则报错请求重新输入。
输入测试b:
在选择继续分配还是退出中,如果输入不符合要求,则报错请求重新输入,连续错误5次后系统将自动关闭。