//如果该进程已经得到过足够资源就不进行判断
if (!p.finish) {
//如果该进程不需要等待就直接返回false
if (!needWait§) {
return false;
}
}
}
return true;
}
private void mainOperation(PCB pcb) {
//运行到这说明该进程可以得到足够的资源,那么直接将该进程已分配的资源放回到系统中
//并将finish改为true
for (int i = 0; i < this.work.length; i++) {
this.work[i].num += pcb.allocation[i].num;
pcb.finish = true;
}
}
private boolean needWait(PCB pcb) {
//挨个判断此时pcb这个进程所需要的每个资源,如果need大于系统当前可分配资源,就说明需要等待
for (int i = 0; i < this.work.length; i++) {
if (this.work[i].num < pcb.need[i].num) {
return true;
}
}
return false;
}
}
测试数据及结果
======================================================================
数据
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.print(“输入资源有几种:”);
int resKindNum = scan.nextInt();
Resources[] Available = new Resources[resKindNum];//系统总资源
System.out.println();
System.out.println(“输入每个系统资源名称、系统资源数量”);
for (int i = 0; i < Available.length; i++) {
System.out.println(“初始化第” + (i +1) + “个资源”);
System.out.println();
System.out.print(“资源名称:”);
String name = scan.next();
System.out.println();
System.out.print(“该资源数量:”);
int num = scan.nextInt();
Available[i] = new Resources(name, num);
System.out.println();
System.out.println(“第” + (i +1) + “个资源初始化完毕”);
System.out.println(“====================”);
}
System.out.println();
System.out.println(“系统资源初始化完毕,开始初始化进程”);
System.out.println();
System.out.print(“输入进程个数:”);
int pcbNums = scan.nextInt();
PCB[] pcbs = new PCB[pcbNums];
for (int i = 0; i < pcbNums; i++) {
System.out.println(“初始化第” + (i +1) + “个进程”);
System.out.println();
System.out.print(“输入进程名:”);
String name = scan.next();
System.out.println();
System.out.print(“输入该进程最大需求资源:”);
Resources[] max = new Resources[resKindNum];
int[] maxResNum = new int[resKindNum];
for (int j = 0; j < resKindNum; j++) {
maxResNum[j] = scan.nextInt();
}
for (int j = 0; j < max.length; j++) {
max[j] = new Resources(Available[j].name, maxResNum[j]);
}
System.out.println();
System.out.print(“输入该进程已分配资源数目:”);
Resources[] allocation = new Resources[resKindNum];
int[] allocReesNum = new int[resKindNum];
for (int j = 0; j < resKindNum; j++) {
allocReesNum[j] = scan.nextInt();
}
for (int j = 0; j < allocation.length; j++) {
allocation[j] = new Resources(Available[j].name, allocReesNum[j]);
}
System.out.println();
//此时一个进程的所有需要的东西都已输入完毕
pcbs[i] = new PCB(name, max, allocation);
System.out.println(“第” + (i +1) + “个进程初始化完毕”);
System.out.println(“====================”);
}
System.out.println();
System.out.println(“所有进程初始化完毕,开始资源分配”);
System.out.println();
boolean key = true;
while (key) {
BetterBankerAlgorithm bankerAlgorithm = new BetterBankerAlgorithm(Available, pcbs);
bankerAlgorithm.resAllocation();
System.out.println();
System.out.println("是否需要再次申请资源输入: y or n ");
char ch = scan.next().charAt(0);
if (ch == ‘n’ || ch == ‘N’) {
key = false;
} else {
System.out.print(“输入要申请资源的进程名:”);
String name = scan.next();
System.out.println();
System.out.print(“输入要申请资源的数量:”);
int[] res = new int[resKindNum];
for (int i = 0; i < resKindNum; i++) {
res[i] = scan.nextInt();
}
System.out.println();
for (PCB p : pcbs
) {
p.finish = false;
if (p.name.equals(name)) {
for (int i = 0; i < p.allocation.length; i++) {
p.allocation[i].num += res[i];
}
}
}
System.out.println();
System.out.println(“再次申请资源完毕,开始资源分配”);
System.out.println();
}
}
}
}
结果
输入资源有几种:4
输入每个系统资源名称、系统资源数量
初始化第1个资源
资源名称:R1
该资源数量:6
第1个资源初始化完毕
====================
初始化第2个资源
资源名称:R2
该资源数量:7
第2个资源初始化完毕
====================
初始化第3个资源
资源名称:R3
该资源数量:12
第3个资源初始化完毕
====================
初始化第4个资源
资源名称:R4
该资源数量:12
第4个资源初始化完毕
====================
系统资源初始化完毕,开始初始化进程
输入进程个数:5
初始化第1个进程
输入进程名:P0
输入该进程最大需求资源:0 0 1 2
输入该进程已分配资源数目:0 0 1 2
第1个进程初始化完毕
====================
初始化第2个进程
输入进程名:P1
输入该进程最大需求资源:2 7 5 0
输入该进程已分配资源数目:2 0 0 0
第2个进程初始化完毕
====================
初始化第3个进程
输入进程名:P2
输入该进程最大需求资源:6 6 5 6
输入该进程已分配资源数目:0 0 3 4
第3个进程初始化完毕
====================
初始化第4个进程
输入进程名:P3
输入该进程最大需求资源:4 3 5 6
输入该进程已分配资源数目:2 3 5 4
第4个进程初始化完毕
====================
初始化第5个进程
输入进程名:P4
输入该进程最大需求资源:0 6 5 2
输入该进程已分配资源数目:0 3 3 2
第5个进程初始化完毕
====================
所有进程初始化完毕,开始资源分配
P0进程已得到足够资源
此时系统可用资源为:
====================
资源R1有2
资源R2有1
资源R3有1
资源R4有2
====================
P3进程已得到足够资源
此时系统可用资源为:
====================
资源R1有4
资源R2有4
资源R3有6
资源R4有6
====================
P4进程已得到足够资源
此时系统可用资源为:
====================
资源R1有4
资源R2有7
资源R3有9
资源R4有8
====================
P1进程已得到足够资源
此时系统可用资源为:
====================
资源R1有6
资源R2有7
资源R3有9
资源R4有8
====================
P2进程已得到足够资源
此时系统可用资源为:
====================
资源R1有6
资源R2有7
资源R3有12
资源R4有12
====================
系统处于安全状态
是否需要再次申请资源输入: y or n
Y
输入要申请资源的进程名:P2
输入要申请资源的数量:0 1 0 0
再次申请资源完毕,开始资源分配
P0进程已得到足够资源