package Banker;
import java.util.Scanner;
public class TestBanker
{
public static void main(String[] args)
{
boolean Choose = true;
String C;
Scanner in = new Scanner(System.in);
Banker T = new Banker();
System.out.println(“这是一个5个进程,初始系统可用三类资源为{10,5,7}的银行家算法:“);
T.initVariable();
while (Choose == true) {
T.setRequest();
System.out.println(“您是否还要进行请求:y/n?”);
C = in.nextLine();
if (C.endsWith(“n”)) {
Choose = false;
}
}
}
}
package Banker;
import java.util.Scanner;
public class Banker
{
int[] Available={10,5,7};
int[][] Max=new int[5][3];
int[][] Allocation = new int[5][3];
int[][] Need = new int[5][3];
int[][] Request = new int[5][3];
int[] Work = new int[3];
static int num = 0;//全局变量 表示进程编号
Scanner in = new Scanner(System.in);
public Banker()
{
}
public void initVariable() //初始化变量
{
setMax();
setAllocation();
printSystemVariable();
SecurityAlgorithm();
}
private void setAllocation()
{
System.out.println(“请设置请各进程分配矩阵Alloction:“);
for (int i = 0; i < 5; i++) {
System.out.println(“请输入进程P” + i + “的分配资源量:“);
for (int j = 0; j < 3; j++) {
Allocation[i][j] = in.nextInt();
}
}
System.out.println(“Available=Available-Allocation.”);
System.out.println(“Need=Max-Alloction.”);
for (int i = 0; i < 3; i++)
{//设置Available矩阵
for (int j = 0; j < 5; j++)
{
Available[i] = Available[i] – Allocation[j][i];
}
}
for (int i = 0; i < 5; i++)
{//设置Need矩阵
for (int j = 0; j < 3; j++)
{
Need[i][j] = Max[i][j] – Allocation[i][j];
}
}
}
private void setMax()
{
System.out.println(“请设置各进程的最大需求矩阵Max:“);
for (int i = 0; i < 5; i++) {
System.out.println(“请输入进程P” + i + “三类资源的最大资源需求量:“);
for (int j = 0; j < 3; j++) {
Max[i][j] = in.nextInt();
}
}
}
public void printSystemVariable(){
System.out.println(“此时资源分配量如下:“);
System.out.println(“进程 “+” Max “+” Alloction “+” Need “+” Available “);
for(int i=0;i<5;i++)
{
System.out.print(“P”+i+” “);
for(int j=0;j<3;j++)
{
System.out.print(Max[i][j]+” “);
}
System.out.print(“| “);
for(int j=0;j<3;j++)
{
System.out.print(Allocation[i][j]+” “);
}
System.out.print(“| “);
for(int j=0;j<3;j++)
{
System.out.print(Need[i][j]+” “);
}
System.out.print(“| “);
if(i==0)
{
for(int j=0;j<3;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 < 3; j++) {
Request[num][j] = in.nextInt();
}
System.out.println(“即进程P” + num + “对各资源请求Request:(“ + Request[num][0] + “,” + Request[num][1] + “,” + Request[num][2] + “).”);
BankerAlgorithm();
}
private void BankerAlgorithm()
{
boolean T = true; //标志位
if(Request[num][0]<=Need[num][0]&&Request[num][1]<=Need[num][1]&&Request[num][2]<=Need[num][2])
{
//请求资源小于所需要的资源
if(Request[num][0] <= Available[0]&&Request[num][1] <= Available[1]&&Request[num][2] <= Available[2])
{
for(int i = 0;i < 3;i++)
{
Available[i] -= Request[num][i];
Allocation[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(“现在进入安全算法:“);
SecurityAlgorithm();
}
}
private void SecurityAlgorithm()
{
boolean[] Finish = {false,false,false,false,false};//初始化
int count = 0; //完成 进程数目
int circle = 0; //循环圈数
boolean flag = true;
int[] S=new int[5];//存储当前的安全序列
for (int i = 0; i < 3; i++)
{//设置工作向量
Work[i] = Available[i];
}
while(count<5)
{
if(flag)
{
System.out.println(“进程 “+” Work “+” Alloction “+” Need “+” Work+Alloction”);
flag = false;
}
for (int i = 0; i < 5; i++)
{
if (Finish[i] == false&&Need[i][0] <= Work[0]&&Need[i][1] <= Work[1]&&Need[i][2] <= Work[2])
{ //判断当前进程是否满足条件
count++;//足进程数加1满
Finish[i]=true;//当当前进程能满足时
S[count-1]=i;//设置当前序列排号
System.out.print(“P”+i+” “);
for (int k = 0; k < 3; k++)
{
System.out.print(Work[k]+” “);
}
System.out.print(“| “);
for (int j = 0; j<3;j++)
{
Work[j] += Allocation[i][j];
}
for(int j=0;j<3;j++)
{
System.out.print(Allocation[i][j]+” “);
}
System.out.print(“| “);
for(int j=0;j<3;j++)
{
System.out.print(Need[i][j]+” “);
}
System.out.print(“| “);
for(int j=0;j<3;j++)
{
System.out.print(Work[j]+” “);
}
System.out.println();
}
}
circle++;//循环圈数加1
if(count == 5)
{//判断是否满足所有进程需要
System.out.print(“此时存在一个安全序列:“);
for (int i = 0; i<5;i++)
{//输出安全序列
System.out.print(“P”+S[i]+” “);
}
System.out.println(“故当前可分配!“);
break;//跳出循环
}
if(count<circle)
{//判断完成进程数是否小于循环圈数
count=7;
System.out.println(“当前系统处于不安全状态,故不存在安全序列。“);
break;//跳出循环
}
}
}
}