银行家算法java简单实现代码

银行家算法

参考

https://blog.csdn.net/qq_33414271/article/details/80245715 《一句话+一张图说清楚——银行家算法》土豆洋芋山药蛋

简介

当一个进程申请使用资源的时候,银行家算法通过先 试探 分配给该进程资源,然后通过安全性算法判断分配后的系统是否处于安全状态,若不安全则试探分配作废,让该进程继续等待。

例题

银行家算法java简单实现代码_第1张图片

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("无安全序列");
		}
	}
}

结果

银行家算法java简单实现代码_第2张图片

你可能感兴趣的:(银行家算法java简单实现代码)