1.创建二维数组等数据结构用来表示进程对资源的
时间: 2023-08-07 09:03:00 浏览: 78
申请和分配情况,可以使用以下的数据结构:
```java
// 进程对资源的申请情况
int[][] request;
// 进程对资源的分配情况
int[][] allocation;
```
其中,`request[i][j]` 表示第 `i` 个进程对第 `j` 个资源的申请情况,`allocation[i][j]` 表示第 `i` 个进程已经被分配的第 `j` 个资源的数量。这两个二维数组的行数应该等于进程的数量,列数应该等于资源的数量。
相关问题
1.创建二维数组等数据结构用来表示进程对资源的使用情况,相关数据包括进程名称、进程数目、资源数目、最大需求数目、已分配数目、仍需数目及当前状态下可利用数目等。 2.在用户输入所有初始化信息后,首先对信息以矩阵形式输出,再输入一组可用资源数目,此时系统判断是否存在安全序列,若有则输出一个安全序列;若无,则表示初始化不正确,请重新输入。用java实现
好的,我可以为您提供一个用Java实现银行家算法的示例代码,具体如下:
```
import java.util.Scanner;
public class BankerAlgorithm {
private int[][] allocation; // 进程已分配资源数
private int[][] max; // 进程最大需求数
private int[][] need; // 进程还需要资源数
private int[] available; // 系统可用资源数
private int numOfProcess; // 进程数
private int numOfResource; // 资源数
private boolean[] finish; // 进程是否完成标记
// 初始化各种数据结构
public void init() {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入进程数目:");
numOfProcess = scanner.nextInt();
System.out.print("请输入资源数目:");
numOfResource = scanner.nextInt();
allocation = new int[numOfProcess][numOfResource];
max = new int[numOfProcess][numOfResource];
need = new int[numOfProcess][numOfResource];
available = new int[numOfResource];
finish = new boolean[numOfProcess];
// 输入各进程已分配资源数
System.out.println("请输入各进程已分配资源数:");
for (int i = 0; i < numOfProcess; i++) {
for (int j = 0; j < numOfResource; j++) {
allocation[i][j] = scanner.nextInt();
}
}
// 输入各进程最大需求数
System.out.println("请输入各进程最大需求数:");
for (int i = 0; i < numOfProcess; i++) {
for (int j = 0; j < numOfResource; j++) {
max[i][j] = scanner.nextInt();
need[i][j] = max[i][j] - allocation[i][j];
}
}
// 输入系统可用资源数
System.out.println("请输入系统可用资源数:");
for (int i = 0; i < numOfResource; i++) {
available[i] = scanner.nextInt();
}
}
// 判断是否存在安全序列
public boolean isSafe() {
int[] work = new int[numOfResource];
System.arraycopy(available, 0, work, 0, numOfResource); // 初始化work向量
for (int i = 0; i < numOfProcess; i++) {
if (finish[i]) {
continue;
}
boolean flag = true;
for (int j = 0; j < numOfResource; j++) {
if (need[i][j] > work[j]) {
flag = false;
break;
}
}
if (flag) {
for (int j = 0; j < numOfResource; j++) {
work[j] += allocation[i][j];
}
finish[i] = true;
i = -1; // 重新遍历
}
}
for (boolean f : finish) {
if (!f) {
return false;
}
}
return true;
}
// 输出安全序列
public void safeSequence() {
int[] work = new int[numOfResource];
int[] sequence = new int[numOfProcess];
System.arraycopy(available, 0, work, 0, numOfResource); // 初始化work向量
int count = 0;
while (count < numOfProcess) {
int i;
for (i = 0; i < numOfProcess; i++) {
if (finish[i]) {
continue;
}
boolean flag = true;
for (int j = 0; j < numOfResource; j++) {
if (need[i][j] > work[j]) {
flag = false;
break;
}
}
if (flag) {
for (int j = 0; j < numOfResource; j++) {
work[j] += allocation[i][j];
}
finish[i] = true;
sequence[count] = i;
count++;
break;
}
}
if (i == numOfProcess) { // 没有找到可以分配的进程,退出循环
break;
}
}
if (count == numOfProcess) { // 存在安全序列
System.out.print("安全序列为:");
for (int i : sequence) {
System.out.print("P" + i + " ");
}
} else { // 不存在安全序列
System.out.println("不存在安全序列!");
}
}
public static void main(String[] args) {
BankerAlgorithm banker = new BankerAlgorithm();
banker.init();
banker.safeSequence();
}
}
```
以上代码实现了银行家算法,包括输入进程已分配资源数、最大需求数和系统可用资源数,判断是否存在安全序列,输出安全序列等功能。您可以根据自己的需要进行修改和扩展。
编写实现银行家算法,在算法执行过程中,首先判断申请资源的进程所申请的资源数目是否合法,若合法,则可以为其进行试分配,再利用安全性算法判断是否存在安全序列,若存在,则说明可以给申请资源的进程分配资源。否则,不进行资源的分配。 1.创建二维数组等数据结构用来表示进程对资源的使用情况,相关数据包括进程名称、进程数目、资源数目、最大需求数目、已分配数目、仍需数目及当前状态下可利用数目等。 2.在用户输入所有初始化信息后,首先对信息以矩阵形式输出,再输入一组可用资源数目,此时系统判断是否存在安全序列,若有则输出一个安全序列;若无,则表示初始化不正确,请重新输入。 3.在已经处于安全状态的前提下,某进程提出新的资源申情,包括进程名称、申请资源数目等,先对用户提出的请求进行合法性检查,若请求合法,则进行试分配。最后对试分配后的状态,调用安全性检查算法进行是否存在安全序列的判断。若安全,给出分配后资源使用情况,并输出一个安全序列。否则,拒绝申请并打印出相应的拒绝原因。用Java实现。
以下是基于银行家算法的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();
}
}
```
在程序运行时,首先会要求用户输入系统的初始化信息,包括进程数量、资源数量、每个进程的最大需求矩阵和已分配矩阵,以及可利用资源向量。然后程序会根据输入的信息判断系统是否处于安全状态,若处于安全状态,则输出一个安全序列;否则提示用户重新输入初始化信息。
程序会一直运行,直到用户输入了一个进程的资源请求,程序会先对这个请求进行合法性检查,如果请求合法,则进行试分配,并调用安全性检查算法判断是否存在安全序列。若存在安全序列,则给出分配后的资源使用情况,并输出一个安全序列;否则,拒绝申请并打印出相应的拒绝原因。
阅读全文