人人都看得懂的银行家算法——Java版
概述
关于银行家算法的基本概念就不罗列了,有点多,直接上代码。这是我优化过的,对新手比较友好
代码看起来可能有点多,因为,为了能够方便大家能够看懂,我加了许多的注释,结构清晰,希望能对你们有所帮助,如果某些地方做的不是特别好,也希望你们能评论留言指出
源码
package bank;
import java.util.Arrays;
import java.util.Scanner;
public class Bank {
/**
* 可利用的资源
*/
int available[] = new int[]{
3,3,2};
/**
* 每个进程最大资源数
*/
int max[][] = new int[][]{
{
7,5,3},{
3,2,2},{
9,0,2},{
2,2,2},{
4,3,3}};
/**
* 每个进程目前拥有的资源数
*/
int allocation[][] = new int[][]{
{
0,1,0},{
2,0,0},{
3,0,2},{
2,1,1},{
0,0,2}};
/**
* 每个进程需要的资源数
*/
int need[][] = new int[][]{
{
7,4,3},{
1,2,2},{
6,0,0},{
0,1,1},{
4,3,1}};
/**
* 请求资源的进程
*/
int processNum;
/**
* 请求的资源
*/
int request[] = new int[3];
/**
* 打印基础信息
*/
void showData() {
//展示数据输出每个进程的相关数
System.out.print("进程号\tMax\t\t\tAll\t\t\tNeed\n");
System.out.print("\t\tA B C\t\tA B C\t\tA B C\n");
for(int i = 0;i<5;i++){
System.out.print(i+"\t\t");
for(int m = 0;m<3;m++) {
System.out.print(max[i][m] + " ");
}
System.out.print("\t");
for(int m = 0;m<3;m++) {
System.out.print(allocation[i][m] + " ");
}
System.out.print("\t");
for(int m = 0;m<3;m++) {
System.out.print(need[i][m]+" ");
}
System.out.println();
}
}
void showAvaliable() {
Arrays.stream(available).forEach(n -> {
System.out.print(n + " ");
});
System.out.println();
}
/**
* 输入请求的进程以及request向量
*/
void inputRequest() {
Scanner input = new Scanner(System.in);
/**
* 输入进程号 0 - 4
*/
System.out.println("请输入要请求的进程号(0--4):");
processNum = input.nextInt();
/**
* 输入请求的A B C资源的数目
*/
String source[] = new String[]{
"A","B","C"};
System.out.print("请输入请求的资源数目");
for(int i = 0;i<3;i++)
{
System.out.println("请求的资源" + source[i] + "的数目:");
request[i] = input.nextInt();
}
}
/**
* 根据请求分配资源
*/
boolean Allocate() {
/**
* 判断是否满足条件
*/
for (int i = 0; i < 3; i++){
if (request[i] > need[processNum][i]) {
System.out.println("请求的资源数超过了所需要的最大值!");
return false;
}
}
for (int i = 0; i < 3; i++){
if (request[i] > available[i]) {
System.out.println("尚无足够资源分配");
return false;
}
}
/**
* 试着分配内存
*/
for(int i = 0;i<3;i++)
{
available[i] = available[i]-request[i];
allocation[processNum][i] = allocation[processNum][i] + request[i];
need[processNum][i] = need[processNum][i] - request[i];
}
/**
* 若存在安全队列,则分配内存
*/
if (isSafe()) {
System.out.println("能够安全分配");
return true;
}else {
System.out.println("不能够安全分配");
for(int i = 0;i<3;i++) {
available[i] = available[i]+request[i];
allocation[processNum][i] = allocation[processNum][i] - request[i];
need[processNum][i] = need[processNum][i] + request[i];
}
return false;
}
}
/**
* 检查是否存在安全队列
* @return
*/
private boolean isSafe() {
/**
* 初始化work
*/
int work[] = new int[3];
for (int i = 0; i < 3; i++) {
work[i] = request[i];
}
/**
* 初始化finish[]
*/
boolean finish[] = new boolean[5];
/**
* 循环查找安全队列
*/
for (int i = 0; i < 5;) {
/**
* 如果可以分配资源并使其执行完成,则置为true,并更新available
*/
if (finish[i] == false && need[i][0]<=work[0]&&need[i][1]<=work[1]&&need[i][2]<=work[2]) {
System.out.println("进程" + i + "分配成功");
for(int m = 0; m < 3; m++) {
work[m] =work[m] + allocation[i][m];
}
finish[i] = true;
//找到后继续从头开始循环
i=0;
}else {
i++;
}
}
/**
* 判断是否存在安全序列
*/
for (int i = 0; i < 5; i++) {
if (finish[i] == false) {
return false;
}
}
return true;
}
public static void main(String[] args) {
Bk bk = new Bk();
bk.showData();
bk.showAvaliable();
bk.inputRequest();
if (bk.Allocate()) {
System.out.println("分配成功");
}
}
}
运行结果
进程号 Max All Need
A B C A B C A B C
0 7 5 3 0 1 0 7 4 3
1 3 2 2 2 0 0 1 2 2
2 9 0 2 3 0 2 6 0 0
3 2 2 2 2 1 1 0 1 1
4 4 3 3 0 0 2 4 3 1
请输入要请求的进程号(0--4):
0
请输入请求的资源数目A资源的数目:
1
B资源的数目:
1
C资源的数目:
1
分配成功的是3
分配成功的是1
分配成功的是0
分配成功的是2
分配成功的是4
能够安全分配
是否再请求分配(y/n)
--------------------------------------华-----------丽------------分------------隔------------线-------------------------------