1.创建二维数组等数据结构用来表示进程对资源的使用情况,相关数据包括进程名称、进程数目、资源数目、最大需求数目、已分配数目、仍需数目及当前状态下可利用数目等。 2.在用户输入所有初始化信息后,首先对信息以矩阵形式输出,再输入一组可用资源数目,此时系统判断是否存在安全序列,若有则输出一个安全序列;若无,则表示初始化不正确,请重新输入。 3.在已经处于安全状态的前提下,某进程提出新的资源申情,包括进程名称、申请资源数目等,先对用户提出的请求进行合法性检查,若请求合法,则进行试分配。最后对试分配后的状态,调用安全性检查算法进行是否存在安全序列的判断。若安全,给出分配后资源使用情况,并输出一个安全序列。否则,拒绝申请并打印出相应的拒绝原因。 用 Java 实现
时间: 2024-03-16 20:43:50 浏览: 43
以下是一个可能的 Java 实现:
```
import java.util.Scanner;
public class BankerAlgorithm {
private int processNum; // 进程数目
private int resourceNum; // 资源数目
private int[][] max; // 最大需求数目
private int[][] allocated; // 已分配数目
private int[][] need; // 仍需数目
private int[] available; // 当前状态下可利用数目
public void init() {
Scanner scanner = new Scanner(System.in);
// 输入进程和资源的数目
System.out.print("请输入进程数目:");
processNum = scanner.nextInt();
System.out.print("请输入资源数目:");
resourceNum = scanner.nextInt();
// 输入进程的最大需求数目和已分配数目
max = new int[processNum][resourceNum];
allocated = new int[processNum][resourceNum];
need = new int[processNum][resourceNum];
for (int i = 0; i < processNum; i++) {
System.out.print("请输入进程" + (i + 1) + "的最大需求数目:");
for (int j = 0; j < resourceNum; j++) {
max[i][j] = scanner.nextInt();
}
System.out.print("请输入进程" + (i + 1) + "的已分配数目:");
for (int j = 0; j < resourceNum; j++) {
allocated[i][j] = scanner.nextInt();
need[i][j] = max[i][j] - allocated[i][j];
}
}
// 输入当前状态下可利用数目
available = new int[resourceNum];
System.out.print("请输入当前状态下可利用的资源数目:");
for (int i = 0; i < resourceNum; i++) {
available[i] = scanner.nextInt();
}
}
public void show() {
System.out.println("进程名称\t最大需求数目\t已分配数目\t仍需数目");
for (int i = 0; i < processNum; i++) {
System.out.print("进程" + (i + 1) + "\t");
for (int j = 0; j < resourceNum; j++) {
System.out.print(max[i][j] + "\t\t");
}
for (int j = 0; j < resourceNum; j++) {
System.out.print(allocated[i][j] + "\t\t");
}
for (int j = 0; j < resourceNum; j++) {
System.out.print(need[i][j] + "\t\t");
}
System.out.println();
}
System.out.print("当前状态下可利用的资源数目:");
for (int i = 0; i < resourceNum; i++) {
System.out.print(available[i] + " ");
}
System.out.println();
}
public boolean isSafe() {
boolean[] finish = new boolean[processNum];
int[] work = new int[resourceNum];
for (int i = 0; i < resourceNum; i++) {
work[i] = available[i];
}
int count = 0;
while (count < processNum) {
boolean flag = false;
for (int i = 0; i < processNum; i++) {
if (!finish[i]) {
boolean enough = true;
for (int j = 0; j < resourceNum; j++) {
if (need[i][j] > work[j]) {
enough = false;
break;
}
}
if (enough) {
for (int j = 0; j < resourceNum; j++) {
work[j] += allocated[i][j];
}
finish[i] = true;
count++;
flag = true;
}
}
}
if (!flag) {
return false;
}
}
return true;
}
public boolean request(int processId, int[] request) {
for (int i = 0; i < resourceNum; i++) {
if (request[i] > need[processId][i] || request[i] > available[i]) {
return false;
}
}
for (int i = 0; i < resourceNum; i++) {
available[i] -= request[i];
allocated[processId][i] += request[i];
need[processId][i] -= request[i];
}
if (isSafe()) {
return true;
} else {
for (int i = 0; i < resourceNum; i++) {
available[i] += request[i];
allocated[processId][i] -= request[i];
need[processId][i] += request[i];
}
return false;
}
}
public static void main(String[] args) {
BankerAlgorithm banker = new BankerAlgorithm();
banker.init();
banker.show();
Scanner scanner = new Scanner(System.in);
System.out.print("请输入一组可用资源数目:");
int[] request = new int[banker.resourceNum];
for (int i = 0; i < banker.resourceNum; i++) {
request[i] = scanner.nextInt();
}
if (banker.isSafe()) {
System.out.println("存在安全序列");
System.out.println("安全序列为:" + banker.getSafeSequence());
if (banker.request(1, request)) {
System.out.println("资源分配成功");
banker.show();
} else {
System.out.println("资源分配失败");
}
} else {
System.out.println("不存在安全序列,初始化错误");
}
}
private String getSafeSequence() {
int[] work = new int[resourceNum];
for (int i = 0; i < resourceNum; i++) {
work[i] = available[i];
}
boolean[] finish = new boolean[processNum];
int count = 0;
StringBuilder sb = new StringBuilder();
while (count < processNum) {
boolean flag = false;
for (int i = 0; i < processNum; i++) {
if (!finish[i]) {
boolean enough = true;
for (int j = 0; j < resourceNum; j++) {
if (need[i][j] > work[j]) {
enough = false;
break;
}
}
if (enough) {
for (int j = 0; j < resourceNum; j++) {
work[j] += allocated[i][j];
}
finish[i] = true;
count++;
sb.append("进程" + (i + 1) + " ");
flag = true;
}
}
}
if (!flag) {
break;
}
}
return sb.toString();
}
}
```
这个实现包括了三个主要功能:初始化进程和资源信息、判断安全性和处理资源请求。其中,安全性检查算法使用银行家算法,分配资源的方法采用试分配法。此外,该实现还包括了一个简单的输出函数 `show()` 和一个获取安全序列的函数 `getSafeSequence()`。在 `main()` 函数中,我们先输入一组可用资源数目,然后判断是否存在安全序列。如果存在,则试图分配资源;否则,认为初始化不正确。
阅读全文