银行家算法.docx

上传人:b****2 文档编号:11791964 上传时间:2023-06-02 格式:DOCX 页数:18 大小:336.11KB
下载 相关 举报
银行家算法.docx_第1页
第1页 / 共18页
银行家算法.docx_第2页
第2页 / 共18页
银行家算法.docx_第3页
第3页 / 共18页
银行家算法.docx_第4页
第4页 / 共18页
银行家算法.docx_第5页
第5页 / 共18页
银行家算法.docx_第6页
第6页 / 共18页
银行家算法.docx_第7页
第7页 / 共18页
银行家算法.docx_第8页
第8页 / 共18页
银行家算法.docx_第9页
第9页 / 共18页
银行家算法.docx_第10页
第10页 / 共18页
银行家算法.docx_第11页
第11页 / 共18页
银行家算法.docx_第12页
第12页 / 共18页
银行家算法.docx_第13页
第13页 / 共18页
银行家算法.docx_第14页
第14页 / 共18页
银行家算法.docx_第15页
第15页 / 共18页
银行家算法.docx_第16页
第16页 / 共18页
银行家算法.docx_第17页
第17页 / 共18页
银行家算法.docx_第18页
第18页 / 共18页
亲,该文档总共18页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

银行家算法.docx

《银行家算法.docx》由会员分享,可在线阅读,更多相关《银行家算法.docx(18页珍藏版)》请在冰点文库上搜索。

银行家算法.docx

银行家算法

实验二银行家算法

一、实验目的

利用银行家算法,可以来检测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;m

work[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次后系统将自动关闭。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2