算法描述
程序实现思路银行家算法顾名思义是来源于银行的借贷业务,一定数量的本金要应多个客户的借贷周转,为了防止银行加资金无法周转而倒闭,对每一笔贷款,必须考察其是否能限期归还。在操作系统中研究资源分配策略时也有类似问题,系统中有限的资源要供多个进程使用,必须保证得到的资源的进程能在有限的时间内归还资源,以供其他进程使用资源。如果资源分配不得到就会发生进程循环等待资源,则进程都无法继续执行下去的死锁现象。把一个进程需要和已占有资源的情况记录在进程控制中,假定进程控制块 PCB 其中“状态”有就绪态、等待态和完成态。当进程在处于等待态时,表示系统不能满足该进程当前的资源申请。“资源需求总量”表示进程在整个执行过程中总共要申请的资源量。显然,每个进程的资源需求总量不能超过系统拥有的资源总数, 银行算法进行资源分配可以避免死锁.
流程图
代码实现
变量说明
1.可利用资源向量 Available ,Available[j]= k 表示系统中现有 j 类资源k个。
2.最大需求矩阵 Max,Max[i][j]= k 表示进程 i 需要 j 类资源的最大数目为 k 。
3.分配矩阵 Allocation, Allocation[i][j]= k 表示进程 i 当前已经分到 j 类资源的数目为 k 。Allocation[i]表示进程i的分配向量。
4.需求矩阵 Need,Need[i][j] = k,表示进程i还需要 j 类资源 k 个,才能完成其任务。Need[i]表示进程i的需求向量。
上述三个矩阵间存在关系:Need[i][j] = Max[i][j] - Allocation[i][j];
Java实现
Main.java
package BankersAlgorithm;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class Main {
public static int N = 100;
public static int M = 100;
public static void main(String[] args) throws FileNotFoundException {
//定义变量
File file = new File("D:\\data2021219\\java-learning\\java-learning\\src\\BankersAlgorithm\\input.txt");
Scanner scanner = new Scanner(file);
int[] Available = new int[N];
int[] Request = new int[N]; //0号位置存放请求者编号
int[][] Max = new int[M][N];
int[][] Allocation = new int[M][N];
int[][] Need = new int[M][N];
int m,n; //m个进程,n种资源。
// 初始化
m = scanner.nextInt();
n = scanner.nextInt();
for(int i = 1;i<=n;i++)
Available[i] = scanner.nextInt();
for(int i = 1;i<= m;i++) {
for(int j = 1;j<=n;j++) {
Max[i][j] = scanner.nextInt();
}
}
for(int i = 1;i<= m;i++) {
for(int j = 1;j<=n;j++) {
Allocation[i][j] = scanner.nextInt();
Need[i][j] = Max[i][j] - Allocation[i][j];
}
}
for(int i = 1