人人都看得懂的银行家算法——Java版

人人都看得懂的银行家算法——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)

--------------------------------------华-----------丽------------分------------隔------------线-------------------------------

猜你喜欢

转载自blog.csdn.net/weixin_44829930/article/details/110848054