银行家算法处理死锁避免
- 编写实现银行家算法,在算法执行过程中,首先判断申请资源的进程所申请的资源数目是否合法,若合法,则可以为其进行试分配,再利用安全性算法判断是否存在安全序列,若存在,则说明可以给申请资源的进程分配资源。否则,不进行资源的分配。
全局变量:
boolean f=true; //标记是否输入系统可用资源
private int tCounts; //记录进程数
private int rCounts; //记录资源数
private int[][] max; // 最大需求矩阵,定义系统中进程对各类资源的最大需求数目
private int[][] allocation ; // 分配矩阵,定义已分配的资源数
private int[][] need; // 需求矩阵,定义仍需求的资源
private int[] available; // 可利用资源向量
银行家算法:
public void bankerAlgo() {
sc=new Scanner(System.in);
if(f) {
//定义系统各类资源可用量
available=new int[rCounts];
System.out.println("请输入当前时刻系统中各类可用资源数量");
for(int i=0;i<rCounts;i++) {
System.out.print("资源"+i+"可用数量:");
available[i]=sc.nextInt();
}
}
boolean check=checkSecurity();
if(check) { //判断是否存在安全序列
f=true;
System.out.print("请输入申请的进程号(0-"+(tCounts-1)+"):");
int t=sc.nextInt(); //记录输入的进程
if(t>=tCounts) { //判断输入的进程号是否有效
System.out.println("输入进程号无效,请重新输入!!!");
f=false;
bankerAlgo();
}
//存储申请的资源数。
System.out.println("请输入该进程申请的各类资源量:");
int[] request=new int[rCounts]; //存储申请的资源数
for(int i=0;i<rCounts;i++) {
System.out.print("资源"+i+":");
request[i]=sc.nextInt(); //记录申请的资源数
//判断进程请求资源是否小于仍需资源且小于系统资源可用量
if(request[i]>need[t][i]||request[i]>available[i]) {
System.out.println();
if(request[i]>available[i]) {
System.out.println("进程"+t+"资源"+i+"为"+request[i]+"大于系统可用资源"+available[i]);
}else {
System.out.println("进程"+t+"资源"+i+"为"+request[i]+"大于所需量"+need[t][i]+"");
}
System.out.println("申请不合法,请重新输入!!!");
i=i-1;
}
}
//判断检验申请资源的正确数是否与资源数一致,一致尝试分配
int[][] allocation2=new int[tCounts][];
System.arraycopy(allocation, 0, allocation2, 0, allocation.length);
int[][] need2=new int[tCounts][];
System.arraycopy(need, 0, need2, 0, need.length);
int[] available2=new int[rCounts];
System.arraycopy(available, 0, available2, 0, available.length);
for (int j=0;j<rCounts;j++) {
allocation[t][j] += request[j];
need[t][j] -= request[j];
available[j] -= request[j];
}
System.out.println();
System.out.println("------------打印试分配结构------------");
boolean flag=checkSecurity();//判断是否存在安全序列
if(flag) {
initOutput(); //打印系统当前状态
//打印各类资源可用数量
System.out.println("各类资源可用数量(available):");
for(int i=0;i<rCounts;i++) {
System.out.print("资源"+i+"可用量:"+available[i]+"\t");
}
System.out.println();
System.out.println("------------------------------------------");
System.out.println();
}else {
available=available2;
need=need2;
allocation=allocation2;
}
//是否重新请求资源(按1继续,按0退出)
System.out.print("是否重新请求资源(按1继续,按0退出):");
int q=sc.nextInt();
if(q==1) {
bankerAlgo();
}else {
return;
}
}else {
bankerAlgo();
}
}