编写实现银行家算法,在算法执行过程中,首先判断申请资源的进程所申请的资源数目是否合法,若合法,则可以为其进行试分配,再利用安全性算法判断是否存在安全序列,若存在,则说明可以给申请资源的进程分配资源。否则,不进行资源的分配。 1.创建二维数组等数据结构用来表示进程对资源的使用情况,相关数据包括进程名称、进程数目、资源数目、最大需求数目、已分配数目、仍需数目及当前状态下可利用数目等。 2.在用户输入所有初始化信息后,首先对信息以矩阵形式输出,再输入一组可用资源数目,此时系统判断是否存在安全序列,若有则输出一个安全序列;若无,则表示初始化不正确,请重新输入。 3.在已经处于安全状态的前提下,某进程提出新的资源申情,包括进程名称、申请资源数目等,先对用户提出的请求进行合法性检查,若请求合法,则进行试分配。最后对试分配后的状态,调用安全性检查算法进行是否存在安全序列的判断。若安全,给出分配后资源使用情况,并输出一个安全序列。否则,拒绝申请并打印出相应的拒绝原因。用Java实现。
时间: 2024-03-16 15:44:30 浏览: 60
用银行家算法实现资源分配
4星 · 用户满意度95%
以下是基于银行家算法的Java代码实现:
```java
import java.util.Scanner;
public class BankerAlgorithm {
private int[][] max; // 最大需求矩阵
private int[][] allocation; // 已分配矩阵
private int[][] need; // 需求矩阵
private int[] available; // 可利用资源向量
private int processNum; // 进程数量
private int resourceNum; // 资源种类数量
private boolean[] finish; // 完成状态向量
// 构造函数
public BankerAlgorithm() {
Scanner sc = new Scanner(System.in);
System.out.print("请输入进程数量:");
processNum = sc.nextInt();
System.out.print("请输入资源数量:");
resourceNum = sc.nextInt();
max = new int[processNum][resourceNum];
allocation = new int[processNum][resourceNum];
need = new int[processNum][resourceNum];
available = new int[resourceNum];
finish = new boolean[processNum];
// 初始化最大需求矩阵
System.out.println("请按行输入各进程的最大需求矩阵:");
for (int i = 0; i < processNum; i++) {
for (int j = 0; j < resourceNum; j++) {
max[i][j] = sc.nextInt();
}
}
// 初始化已分配矩阵和需求矩阵
System.out.println("请按行输入各进程的已分配矩阵:");
for (int i = 0; i < processNum; i++) {
for (int j = 0; j < resourceNum; j++) {
allocation[i][j] = sc.nextInt();
need[i][j] = max[i][j] - allocation[i][j];
}
}
// 初始化可利用资源向量
System.out.println("请输入可利用资源向量:");
for (int i = 0; i < resourceNum; i++) {
available[i] = sc.nextInt();
}
}
// 输出矩阵
private void printMatrix(int[][] matrix, String name) {
System.out.println(name + "矩阵如下:");
for (int i = 0; i < processNum; i++) {
for (int j = 0; j < resourceNum; j++) {
System.out.print(matrix[i][j] + " ");
}
System.out.println();
}
}
// 输出向量
private void printVector(int[] vector, String name) {
System.out.println(name + "向量如下:");
for (int i = 0; i < resourceNum; i++) {
System.out.print(vector[i] + " ");
}
System.out.println();
}
// 判断是否满足安全性
private boolean isSafe() {
int[] work = new int[resourceNum]; // 工作向量
boolean[] tempFinish = new boolean[processNum]; // 暂存完成状态向量
// 初始化工作向量和完成状态向量
for (int i = 0; i < resourceNum; i++) {
work[i] = available[i];
}
for (int i = 0; i < processNum; i++) {
tempFinish[i] = false;
}
// 寻找安全序列
int count = 0; // 计数器,记录已找到的进程数
while (count < processNum) {
boolean flag = false; // 标记是否找到符合条件的进程
for (int i = 0; i < processNum; i++) {
if (!tempFinish[i]) {
int j;
for (j = 0; j < resourceNum; j++) {
if (need[i][j] > work[j]) {
break;
}
}
if (j == resourceNum) {
flag = true;
tempFinish[i] = true;
count++;
for (j = 0; j < resourceNum; j++) {
work[j] = work[j] + allocation[i][j];
}
}
}
}
if (!flag) {
break; // 找不到符合条件的进程,退出循环
}
}
return count == processNum;
}
// 检查进程请求是否合法
private boolean checkRequest(int processId, int[] request) {
for (int i = 0; i < resourceNum; i++) {
if (request[i] > need[processId][i] || request[i] > available[i]) {
return false;
}
}
return true;
}
// 处理进程请求
public void processRequest() {
Scanner sc = new Scanner(System.in);
System.out.print("请输入申请资源的进程编号:");
int processId = sc.nextInt();
System.out.print("请输入申请的资源向量:");
int[] request = new int[resourceNum];
for (int i = 0; i < resourceNum; i++) {
request[i] = sc.nextInt();
}
if (checkRequest(processId, request)) {
// 试分配资源
for (int i = 0; i < resourceNum; i++) {
available[i] -= request[i];
allocation[processId][i] += request[i];
need[processId][i] -= request[i];
}
// 判断是否安全
if (isSafe()) {
printMatrix(allocation, "分配");
printMatrix(need, "需求");
printVector(available, "可利用资源");
System.out.println("存在安全序列,分配成功!");
} else {
// 回滚
for (int i = 0; i < resourceNum; i++) {
available[i] += request[i];
allocation[processId][i] -= request[i];
need[processId][i] += request[i];
}
System.out.println("不存在安全序列,分配失败!");
}
} else {
System.out.println("进程请求不合法,分配失败!");
}
}
public static void main(String[] args) {
BankerAlgorithm ba = new BankerAlgorithm();
ba.printMatrix(ba.max, "最大需求");
ba.printMatrix(ba.allocation, "已分配");
ba.printMatrix(ba.need, "需求");
ba.printVector(ba.available, "可利用资源");
if (ba.isSafe()) {
System.out.println("系统处于安全状态,存在安全序列。");
} else {
System.out.println("系统处于不安全状态,不存在安全序列。");
return;
}
ba.processRequest();
}
}
```
在程序运行时,首先会要求用户输入系统的初始化信息,包括进程数量、资源数量、每个进程的最大需求矩阵和已分配矩阵,以及可利用资源向量。然后程序会根据输入的信息判断系统是否处于安全状态,若处于安全状态,则输出一个安全序列;否则提示用户重新输入初始化信息。
程序会一直运行,直到用户输入了一个进程的资源请求,程序会先对这个请求进行合法性检查,如果请求合法,则进行试分配,并调用安全性检查算法判断是否存在安全序列。若存在安全序列,则给出分配后的资源使用情况,并输出一个安全序列;否则,拒绝申请并打印出相应的拒绝原因。
阅读全文