package banktext;
import java.util.Scanner;
public class BankerClass {
int[] Available;
int[][] Max ;
int[][] Alloction ;
int[][] Need ;
int[][] Request;
int[] Work ;
boolean[] Finish ;
int processNum;
int resourceNum ;
int availableNum;
int num = 0;// 进程编号
Scanner in = new Scanner(System.in);
public static void main(String[] args) {
// TODO code application logic here
boolean Choose = true;
String C;
Scanner in = new Scanner(System.in);
BankerClass T = new BankerClass();
System.out.println("Hello!");
T.setSystemVariable();
while (Choose == true) {
T.setRequest();
System.out.println("您是否还要进行请求:y/n?");
C = in.nextLine();
if (C.endsWith("n")) {
Choose = false;
System.out.println("程序结束!");
}
}
}
public BankerClass() {
// Max={{6,3,2},{5,6,1},{2,3,2}};
}
public void setSystemVariable() {// 设置各初始系统变量,并判断是否处于安全状态。
init();
setMax();
setAlloction();
printSystemVariable();
SecurityAlgorithm();
}
private void init() {//初始化变量
// TODO Auto-generated method stub
System.out.println("请设置进程数量:");
processNum = in.nextInt();
System.out.println("请设置资源数量:");
resourceNum = in.nextInt();
Max = new int[processNum][resourceNum];
Alloction = new int[processNum][resourceNum];
Need = new int[processNum][resourceNum];
Request = new int[processNum][resourceNum];
Work = new int[resourceNum];
Available=new int[resourceNum];
Finish=new boolean[processNum];
System.out.println("请设置初始资源数:");
for (int i = 0; i < resourceNum; i++) {
Available[i]=in.nextInt();
}
}
public void setMax() {// 设置Max矩阵
System.out.println("请设置各进程的最大需求矩阵Max:");
for (int i = 0; i < processNum; i++) {
System.out.println("请输入进程P" + i + "的最大资源需求量:");
for (int j = 0; j < resourceNum; j++) {
Max[i][j] = in.nextInt();
}
}
}
public void setAlloction() {// 设置已分配矩阵Alloction
System.out.println("请设置请各进程分配矩阵Alloction:");
for (int i = 0; i < processNum; i++) {
System.out.println("请输入进程P" + i + "的分配资源量:");
for (int j = 0; j < resourceNum; j++) {
Alloction[i][j] = in.nextInt();
}
}
System.out.println("Available=Available-Alloction.");
System.out.println("Need=Max-Alloction.");
for (int i = 0; i < resourceNum; i++) {// 设置Available矩阵
for (int j = 0; j < processNum; j++) {
Available[i] = Available[i] - Alloction[j][i];
}
}
for (int i = 0; i < processNum; i++) {// 设置Need矩阵
for (int j = 0; j < resourceNum; j++) {
Need[i][j] = Max[i][j] - Alloction[i][j];
}
}
}
public void printSystemVariable() {
System.out.println("此时资源分配量如下:");
System.out.println("进程 " + " Max " + " Alloction "
+ " Need " + " Available ");
for (int i = 0; i < processNum; i++) {
System.out.print("P" + i + " ");
for (int j = 0; j < resourceNum; j++) {
System.out.print(Max[i][j] + " ");
}
System.out.print("| ");
for (int j = 0; j < resourceNum; j++) {
System.out.print(Alloction[i][j] + " ");
}
System.out.print("| ");
for (int j = 0; j < resourceNum; j++) {
System.out.print(Need[i][j] + " ");
}
System.out.print("| ");
if (i == 0) {
for (int j = 0; j < resourceNum; j++) {
System.out.print(Available[j] + " ");
}
}
System.out.println();
}
}
public void setRequest() {// 设置请求资源量Request
System.out.println("请输入请求资源的进程编号:");
num = in.nextInt();// 设置全局变量进程编号num
System.out.println("请输入请求各资源的数量:");
for (int j = 0; j < resourceNum; j++) {
Request[num][j] = in.nextInt();
}
//System.out.println("即进程P" + num + "对各资源请求Request:(" + Request[num][0]
// + "," + Request[num][1] + "," + Request[num][2] + ").");
BankerAlgorithm();
}
public void BankerAlgorithm() {
System.out.println("银行家算法");// 银行家算法
boolean T = true;
boolean ReqNeed=true;
boolean ReqAva=true;
for (int i = 0; i < resourceNum; i++) {
if (!(Request[num][i]<=Need[num][i] )) {
ReqNeed=false;
}
}
for (int i = 0; i < resourceNum; i++) {
if (!(Request[num][i]<=Available[i])) {
ReqAva=false;
}
}
if (ReqNeed) {// 判断Request是否小于Need
if (ReqAva) {// 判断Request是否小于Available
for (int i = 0; i < resourceNum; i++) {
Available[i] -= Request[num][i];
Alloction[num][i] += Request[num][i];
Need[num][i] -= Request[num][i];
}
} else {
System.out.println("当前没有足够的资源可分配,进程P" + num + "需等待。");
T = false;
}
} else {
System.out.println("进程P" + num + "请求已经超出最大需求量Need.");
T = false;
}
if (T == true) {
printSystemVariable();
System.out.println("现在进入安全算法:");
boolean flag = SecurityAlgorithm();
if (!flag) {
System.out.println("因为不安全,所以退回资源!");
for (int i = 0; i < resourceNum; i++) {
Available[i] += Request[num][i];
Alloction[num][i] -= Request[num][i];
Need[num][i] += Request[num][i];
}
}
}
}
public boolean SecurityAlgorithm() {// 安全算法
System.out.println("安全算法");
int count = 0;// 完成进程数
int circle = 0;// 循环圈数
int[] S = new int[processNum];// 安全序列
for (int i = 0; i < resourceNum; i++) {// 设置工作向量
Work[i] = Available[i];
}
for (int i = 0; i < processNum; i++) {//设置finish初始值
Finish[i]=false;
}
boolean flag = true;
boolean NeedWork=true;
while (count < processNum) {
if (flag) {
System.out.println("进程 " + " Work " + " Alloction "
+ " Need " + " Work+Alloction ");
flag = false;
}
for (int i = 0; i < processNum; i++) {
NeedWork=true;
for (int j = 0; j < resourceNum; j++) {
if(!(Finish[i] == false && Need[i][j] <= Work[j])){
NeedWork=false;
}
}
if (NeedWork) {// 判断条件
System.out.print("P" + i + " ");
for (int k = 0; k < resourceNum; k++) {
System.out.print(Work[k] + " ");
}
System.out.print("| ");
for (int j = 0; j < resourceNum; j++) {
Work[j] += Alloction[i][j];
}
Finish[i] = true;// 当当前进程能满足时
S[count] = i;// 设置当前序列排号
count++;// 满足进程数加1
for (int j = 0; j < resourceNum; j++) {
System.out.print(Alloction[i][j] + " ");
}
System.out.print("| ");
for (int j = 0; j < resourceNum; j++) {
System.out.print(Need[i][j] + " ");
}
System.out.print("| ");
for (int j = 0; j < resourceNum; j++) {
System.out.print(Work[j] + " ");
}
System.out.println();
}
}
circle++;// 循环圈数加1
if (count == processNum) {// 判断是否满足所有进程需要
System.out.print("此时存在一个安全序列:");
for (int i = 0; i < processNum; i++) {// 输出安全序列
System.out.print("P" + S[i] + " ");
}
System.out.println("故当前可分配!");
return true;
}
if (count < circle) {// 判断完成进程数是否小于循环圈数
// count = processNum+1;
System.out.println("当前系统处于不安全状态,故不存在安全序列。");
return false;
}
}
return false;
}
}
银行家算法(java实现)
猜你喜欢
转载自blog.csdn.net/qq_42404593/article/details/85929165
今日推荐
周排行