import java.util.Scanner;
class bank2 {
int Max[][] = new int[100][100];// 各进程所需各类资源的最大需求
int Avaliable[] = new int[100];// 系统可用资源
String name[] = new String[100];// 资源的名称
int Allocation[][] = new int[100][100];// 系统已分配资源
int Need[][] = new int[100][100];// 还需要资源
int Request[] = new int[100];// 请求资源向量
int temp[] = new int[100];// 存放安全序列
int Work[] = new int[100];// 存放系统可提供资源
int M = 100;// 进程的最大数为100
int N = 100;// 资源的最大数为100
/**
* 进行初始化,显示各个资源情况
*/
void showdata(){
int i, j;
System.out.println("系统目前可用的资源[work]:");
for (i = 0; i < N; i++)
System.out.print(name[i] + " ");
System.out.println();
for (j = 0; j < N; j++)
System.out.print(Work[j] + " ");// 输出可用资源
System.out.println();
System.out.println(" Max Allocation Need work");
System.out.print("进程名 ");
for (j = 0; j < 4; j++) {
for (i = 0; i < N; i++)
System.out.print(name[i] + " ");
System.out.print(" ");
}
System.out.println();
for (i = 0; i < M; i++) {
System.out.print(" " + i + " ");
for (j = 0; j < N; j++)
System.out.print(Max[i][j] + " ");
System.out.print(" ");
for (j = 0; j < N; j++)
System.out.print(Allocation[i][j] + " ");
System.out.print(" ");
for (j = 0; j < N; j++)
System.out.print(Need[i][j] + " ");
System.out.print(" ");
for (j = 0; j < N; j++)
System.out.print(Work[j] + " ");
System.out.println();
}
}
/**
* 进行资源分配
*/
int changedata(int i){
int j;
for (j = 0; j < M; j++) {
Avaliable[j] = Avaliable[j] - Request[j];
Allocation[i][j] = Allocation[i][j] + Request[j];
Need[i][j] = Need[i][j] - Request[j];
Work[j] = Avaliable[j];
}
return 1;
}
/**
* 恢复当前的资源
*/
int getdata(int i){
int j;
for (j = 0; j < M; j++) {
Avaliable[j] = Avaliable[j] + Request[j];
Allocation[i][j] = Allocation[i][j] - Request[j];
Need[i][j] = Need[i][j] + Request[j];
Work[j] = Avaliable[j];
}
return 1;
}
/**
* 寻找安全序列
*/
int safe(){
int i, k = 0, m, apply;
boolean Finish[] = new boolean[100];
int j;
for (i = 0; i < M; i++) {
apply = 0;
for (j = 0; j < N; j++) {
if (Finish[i] == false && Need[i][j] <= Work[j]) {
apply++;
if (apply == N) {//申请的资源全部满足时运行
for (m = 0; m < N; m++)
Work[m] = Work[m] + Allocation[i][m];// 变分配数
Finish[i] = true;
temp[k] = i;
i = -1;// 每次都要从0号进程进行安全性检查,并且每次++
k++;
}
}
}//控制资源的循环结束
}//控制进程的循环结束
for (i = 0; i < N; i++) {
Work[i] = Avaliable[i];
}
for (i = 0; i < M; i++) {
if (Finish[i] == false) {
System.out.println("系统不安全");// 不成功系统不安全
return -1;
}else{
System.out.println("系统是安全的!");// 如果安全,输出成功
System.out.print("安全序列是:");
for (i = 0; i < M; i++) {// 输出运行进程数组
System.out.print(temp[i]);
if (i < M - 1)
System.out.print("-->");
}
}
}
System.out.println();
return 0;
}
/**
* 分配资源,检查死锁
*/
void share(){// 利用银行家算法对申请资源对进行判定
char ch = 'y';
int i = 0, j = 0;
int count = 0;
System.out.print("请输入你要求分配的资源进程号(0-" + (M - 1) + "):");
Scanner sc = new Scanner(System.in);
i = sc.nextInt();// 输入须申请的资源号
System.out.println("请输入进程 " + i + " 申请的资源:");
for (j = 0; j < N; j++) {
System.out.print(name[j] + ":");
Scanner sc1 = new Scanner(System.in);
Request[j] = sc1.nextInt();// 输入需要申请的资源
}
for (j = 0; j < N; j++) {
if (Request[j] > Need[i][j])// 判断申请是否大于需求,若大于则出错
{
System.out.print("进程 " + i + "申请的资源大于它需要的资源");
System.out.println(" 分配不合理,不予分配!");
ch = 'n';
// showdata();
break;
}
if (Request[j] > Avaliable[j]) {// 判断申请是否大于当前资源,若大于则出错
System.out.print("进程" + i + "申请的资源大于系统现在可利用的资源");
System.out.println(" 分配出错,不予分配!");
ch = 'n';
break;
}
}
if (ch == 'y') {
changedata(i);// 根据进程需求量变换资源
if (safe() == -1) {
getdata(i);
System.out.println(" 分配出错,不予分配!");
System.out.println("现有资源!");
// for(i=0;i<N;i++){Avaliable[i]=Work[i];}
}// 根据进程需求量进行银行家算法判断
if (safe() == 0) {
for (i = 0; i < M; i++) {
count = 0;
for (j = 0; j < N; j++) {
if (Max[i][j] == Allocation[i][j]) {
count++;
}
if (count == N) {
for (j = 0; j < N; j++) {
Work[j] = Work[j] + Allocation[i][j];
Allocation[i][j] = 0;
Avaliable[j] = Work[j];
}
}
}
}
showdata();// 根据进程需求量显示变换后的资源
}
}
}
}
public class Bank {
public static void main(String[] args) {// 主函数
int i, j, number, choice = 1, m, n, flag;
String ming;
System.out.println("*****************资源管理系统的设计与实现*****************");
System.out.print("请首先输入系统可供资源种类的数量:");
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
bank2 b = new bank2();
b.N = n;
for (i = 0; i < n; i++) {
System.out.print("请输入第"+(i + 1) + "资源" + "的名称:");
Scanner sc1 = new Scanner(System.in);
ming = sc1.next();
b.name[i] = ming;
System.out.print("请输入第"+(i + 1) + "资源" + "的数量:");
Scanner sc11 = new Scanner(System.in);
number = sc11.nextInt();
b.Avaliable[i] = number;
b.Work[i] = number;
}
System.out.println("请输入进程数量:");
Scanner sc11 = new Scanner(System.in);
m = sc11.nextInt();
b.M = m;
//System.out.println("请输入各进程的最大需求量(" + m + "*" + n + "矩阵)[Max]:");
for (i = 0; i < m; i++) {
System.out.println("请输入各进程第"+(i + 1)+"资源的最大需求量:");
for (j = 0; j < n; j++) {
Scanner sc111 = new Scanner(System.in);
b.Max[i][j] = sc111.nextInt();
}
do {
flag = 0;
System.out.println("请输入各进程已经申请的资源量(" + m + "*" + n+ "矩阵)[Allocation]:");
for (i = 0; i < m; i++)
for (j = 0; j < n; j++) {
Scanner sc111 = new Scanner(System.in);
b.Allocation[i][j] = sc111.nextInt();
if (b.Allocation[i][j] > b.Max[i][j])
flag = 1;
b.Need[i][j] = b.Max[i][j] - b.Allocation[i][j];
b.Work[j] = b.Work[j] - b.Allocation[i][j];
b.Avaliable[j] = b.Work[j];
}
if (flag == 1)
System.out.println("申请的资源大于最大需求量,请重新输入!");
} while (flag == 1);
b.showdata();// 显示各种资源
b.safe();// 用银行家算法判定系统是否安全
do {
System.out.println("是否分配资源 ");
System.out.println("1:是 ");
System.out.println("2:否 ");
Scanner sc111 = new Scanner(System.in);
choice = sc111.nextInt();
switch (choice) {
case 1:
b.share();
break;
case 2:
choice = 0;System.out.println("你已经退出了该系统");
break;
default:
System.out.println("你输入有错,欢迎下次使用!!!!");
break;
}
} while (choice != 0);
System.exit(0);
}
}