实验报告
N Y N Y N Y Y N
一.实验题目 :银行家算法。
二.实验内容 :通过实验观察系统处于安全状态和不安全状态的现象,写出检验安全状态并生成安全序列的方法。
三.实验目的 :利用银行家算法避免死锁。
四.实验过程 :
1.基本思想
系统中的所有进程放入进程集合,在安全状态下系统受到进程的请求后试探性的把资源分配给进程,系统将剩下的资源和进程集合中其他进程还需要的资源数做比较,找出剩余资源能满足最大需求量的进程,从而保证进程运行完成后还回全部资源。这时系统将该进程从进程集合中将其清除。系统中的资源增加。反复执行上面的步骤,最后检查进程的集合为空时就表明本次申请可行,系统处于安全状态,可以实施本次分配,否则,只要进程集合非空,系统便处于不安全状态,本次不能分配。请进程等待。
2.主要数据结构
1.可利用资源向量AVAILABLE。这是一个含有M个元素的数组,其中的每一个元素代表一类可利用的资源数目,其3初始值是系统中所配置的该类全部可哦那个资源的数目,其数值随该类资源的分配和回收而动态的改变。
2.最大需求矩阵MAX。这是一个M*N的矩阵,它定义了系统中N个进程中的每一个进程对M类资源的最大需求。
3.分配矩阵ALLOCATION。这也是一个M*N的矩阵,它定义了系统中每一类资源当前已分配给每一进程的资源数。
4.需求矩阵NEED。这也是一个M*N的矩阵,用以表示每一个进程尚需的各类资源数。
5.NEED[R,W]=MAX[R,W]-ALLOCATION[R,W]
3.输入、输出
输入:程序开始时,进行初始化输入。将提示输入资源的个数、各类资源的数目、进程个数、每个进程的max向量和allocation向量以及相应的各类资源的个数。将资源存入一个2维数组s[][]包括资源名和资源个数。将进程P存入一个3维数组p[][][];这个三维数组包括进程名,max向量和allocation向量和以及各类资源的个数。当程序进入请求分配阶段是提示输入请求资源的进程和请求的资源的个数。
输出:当输入完成后程序将进行安全性计算。如果存在一个安全序列,显示出安全序列,否则将返回相应阶段重新输入。
4.程序流程图
开始 输入资源数以及各类资源个数 输入进程个数P,i=0 i
5.截屏
6.源程序
import java.util.Scanner;
public class YH { public static void main(String[]args){ //循环输入
while(true){ int s;//资源种类 int p;//进程个数 int p1=0;//进程
int i=0;//数组下标 int k;//
int j=0;//
int P[][][];//进程
int S[];//资源
int AL[] ;//Allocation int AV[]; //Available
Scanner scanner = new Scanner(System.in);
System.out.println(\"请输入资源数\"); s = scanner.nextInt(); S=new int[s]; AV = new int[s]; AL = new int[s];
System.out.println(\"请输入\"+s+\"类资源的数量\"); int s3=0;
while(scanner.hasNext()){ int num = scanner.nextInt(); S[s3]=num; s3++;
if(s3==s){s3=0;break;} }
System.out.println(\"请输入进程数\"); p = scanner.nextInt(); P=new int[p][2][s]; for(k=0;k<2;k++){
for(i=0;i
String st=null; if(k==0)st=\"Max\";
else if (k==1)st=\"Allocation\";
System.out.println(\"请输入进程\"+i+\"的\"+s+\"类资源的\"+st+\"值\"); j=0;
//显示资源状态
String st2=\" \";
for(int str=1;strSystem.out.println(\" MAX\"+st2+\" Allocation\"+st2+\" Need\"+st2+\"
while(scanner.hasNext()){ int num = scanner.nextInt();
P[i][k][j]=num; j++;
if(j==s){j=0;break;} }
//for(int j1=0;j1}
Available\"); for(i=0;i
System.out.print(\"P\"+i);
System.out.print(st2); //MAX
for(j=0;jSystem.out.print(P[i][0][j]+\" \");} System.out.print(st2); //Allocation
for(j=0;jSystem.out.print(P[i][1][j]+\" \");}
System.out.print(st2);
//Need
for(j=0;jSystem.out.print((P[i][0][j]-P[i][1][j])+\" \" System.out.print(st2);
//Available
if(i==0){ for (int i1=0;i1
}
for(int s1=0;s1{
AV[s1]=S[s1]-AL[s1]; System.out.print(AV[s1]+\" \"); }
}
System.out.println(\"\");
}
int W[]=new int[3];//work
for (int w=0;w//判断安全序列
);}
boolean[] PB=new boolean[p];// 进程P 是否进入安全序列 for(int b=0;b
int f1=0;//判断是否有安全进程 while( f
if (i2==p-1)i2=0; else i2=i1; for(;i2
for(j=0;jif (W[j]-(P[i2][0][j]-P[i2][1][j])<0){i1=i2;break; } {
if(PB[i2])continue;
}
if(j==s) { }
if (f1==0) {
System.out.println(\"不安全状态,请重新输入\");fg1=1;break; }
int pf=p;
if (i2==pf)i2=pf-1; else
System.out.print(\"P\"+i2+\" \");
for (int w=0;wif (fg1==1){fg1=0;continue;} //循环输入
f++;f1=1;PB[i2]=true;i1=i2;break; }
else {f1=0;}
while(true){
int fg=0;//是否允许分配 System.out.println(\"\");
System.out.println(\"请输入请求资源的进程:\");
p1 = scanner.nextInt();
System.out.println(\"请输入请求资源的进程的请求向量:\");
int x=0;
int Q[]=new int[s];//请求资源的进程的请求向量 while(scanner.hasNext()){ int num1 = scanner.nextInt(); Q[x]=num1; x++;
if(x==s){x=0;break;} }
for(j=0;jif (Q[j]-(P[p1][0][j]-P[p1][1][j])>0)break;}
if (j==s){System.out.print(\"<=NEED允许分配 \");fg=0;} else {System.out.print(\">NEED不允许分配 \");fg=1;} if (fg==1)continue;
for (int j3=0;j3for(int i5=0;i5
for(int s1=0;s1for(j=0;jAV[s1]=S[s1]-AL[s1];
//System.out.print(\" \"+AV[s1]+\" \");
for( int j1=0;j1{ }
AL[j1]=(AL[j1]+P[i5][1][j1]);
{
if (Q[j]-AV[j]>0)break;}
if (j==s){System.out.println(\"<=Available允许分配 \");fg=0;}
else {System.out.println(\">Available不允许分配 \");fg=1;} if (fg==1)continue;
for(int i4=0;i4for(int str=1;strSystem.out.println(\" MAX\"+st2+\" Allocation\"+st2+\" Need\"+st2+\" Available\"); for(i=0;i
System.out.print(st2); //MAX
for(j=0;jSystem.out.print(P[i][0][j]+\" \");}
System.out.print(st2); for(j=0;jSystem.out.print(P[i][1][j]+\" \");} //Allocation
System.out.print(st2); //Need
for(j=0;jSystem.out.print((P[i][0][j]-P[i][1][j])+\" \");} System.out.print(st2);
for (int j3=0;j3if(i==0){
System.out.println(\"\");
for(int i5=0;i5
{AL[j1]=(AL[j1]+P[i5][1][j1]);}} for(int s1=0;s1AV[s1]=S[s1]-AL[s1];
//Available
System.out.print(AV[s1]+\" \");}
}
for (int w=0;w//判断安全序列2
boolean[] PB1=new boolean[p]; for(int b=0;b
i1=0;//记录当前进程 i2=0; f1=0; while( f
{
if (i2==p-1)i2=0; else i2=i1; for(;i2
if(PB1[i2])continue; for(j=0;jif (W[j]-(P[i2][0][j]-P[i2][1][j])<0){i1=i2;break;}} if(j==s){f++;f1=1;PB1[i2]=true;i1=i2;break;} else {f1=0;} }
if (f1==0){System.out.println(\"不安全状态,请重新输入\");fg=2;break;} int pf=p;
if (i2==pf)i2=pf-1;
else System.out.print(\"P\"+i2+\" \");
//for (int w=0;wfor (int w=0;wif (fg==2){
System.out.println(\"不安全状态,资源不分配\");
for(int i4=0;i47.小结
通过本次银行家算法实验,加深了我对银行家算法的了解,掌握了如何利用银行家算法避免死锁。通过这次的实践,使我学到了更多的知识。
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- efsc.cn 版权所有 赣ICP备2024042792号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务