https://blog.csdn.net/qq_33414271/article/details/80245715 《一句话+一张图说清楚——银行家算法》土豆洋芋山药蛋
当一个进程申请使用资源的时候,银行家算法通过先 试探 分配给该进程资源,然后通过安全性算法判断分配后的系统是否处于安全状态,若不安全则试探分配作废,让该进程继续等待。
Process:进程名
Alloction:已分配的资源
Need:还需要的资源
Available:系统空闲的资源
当某个进程申请资源时,先试着分配给该进程,若申请的资源数量小于等于Available,然后接着判断分配给P1后剩余的资源(包括该进程执行后释放的资源),能不能使进程队列的某个进程执行完毕,若没有进程可执行完毕,则系统处于不安全状态。(所有进程都要执行完毕,否则不安全)
//进程类
public class Process {
private String name;
// 需要的资源数
private int Max_A;
private int Max_B;
private int Max_C;
private int Max_D;
// 已有的资源数
private int A;
private int B;
private int C;
private int D;
public Process(String name, int max_A, int max_B, int max_C, int max_D) {
super();
this.name = name;
Max_A = max_A;
Max_B = max_B;
Max_C = max_C;
Max_D = max_D;
}
/**
* 设置已拥有资源
* @param A
* @param B
* @param C
* @param D
*/
public void init(int A, int B, int C, int D) {
this.A = A;
this.B = B;
this.C = C;
this.D = D;
}
/**
* 检查该进程是否安全
* @param a
* @param b
* @param c
* @param d
* @return
*/
public boolean isSecurity(int a, int b, int c, int d) {
if (Max_A - A <= a && Max_B - B <= b && Max_C - C <= c && Max_D - D <= d) {
return true;
}
return false;
}
//get()
//set()
@Override
public String toString() {
return "Process [name=" + name + "]";
}
}
//银行管理类
public class BankManager {
static int PROCESS_COUNT = 5;
ArrayList<Process> arr = new ArrayList<Process>();
// 空闲资源数
int a, b, c, d;
public BankManager(int a, int b, int c, int d) {
super();
this.a = a;
this.b = b;
this.c = c;
this.d = d;
}
/**
* 求安全序列
* @param array
* @param arr
* @return
*/
public ArrayList<Process> getSequence(ArrayList<Process> array, ArrayList<Process> arr) {
// 不安全进程数count,当count+arr.length等于总进程数 PROCESS_COUNT 时,无安全序列
int count = 0;
while (count + arr.size() < PROCESS_COUNT) {
for (Process p : array) {
if (!arr.contains(p)) {
if (p.isSecurity(a, b, c, d)) {
// 释放资源
release(p.getA(), p.getB(), p.getC(), p.getD());
// 加入新集合
arr.add(p);
// 因为空闲资源更新,重置不安全序列
count = 0;
} else {
count++;
}
}
}
}
return arr;
}
/**
* 释放资源
* @param pa
* @param pb
* @param pc
* @param pd
* @return
*/
public void release(int pa, int pb, int pc, int pd) {
// this
this.a += pa;
this.b += pb;
this.c += pc;
this.d += pd;
}
//get()
//set()
}
public class Test {
public static void main(String[] args) {
// 设置空闲资源
int a = 1;
int b = 6;
int c = 2;
int d = 2;
// 加载空闲资源
BankManager bn = new BankManager(a, b, c, d);
// 五个进程,并设置所需资源
Process p1 = new Process("p1", 0, 0, 4, 4);
Process p2 = new Process("p2", 2, 7, 5, 0);
Process p3 = new Process("p3", 3, 6, 10, 10);
Process p4 = new Process("p4", 0, 9, 8, 4);
Process p5 = new Process("p5", 0, 6, 6, 10);
// 已分配资源数
p1.init(0, 0, 3, 2);
p2.init(1, 0, 0, 0);
p3.init(1, 3, 5, 4);
p4.init(0, 3, 3, 2);
p5.init(0, 0, 1, 4);
System.out.println();
// 将进程装入一个集合中
ArrayList<Process> list = new ArrayList<>();
list.add(p1);
list.add(p2);
list.add(p3);
list.add(p4);
list.add(p5);
// 接受返回的安全序列
ArrayList<Process> result = new ArrayList<>();
result = bn.getSequence(list, result);
if (result.size() == 5) {
result.stream().forEach(s -> System.out.println(s));
} else {
System.out.println("无安全序列");
}
}
}