银行家算法——java实现

package Banker;

 

import java.util.Scanner;

 

public class TestBanker

{

 

public static void main(String[] args)

{

boolean Choose = true;

        String C;

        Scanner in = new Scanner(System.in);

        Banker T = new Banker();

        System.out.println(这是一个5个进程,初始系统可用三类资源为{10,5,7}的银行家算法:);

 

        T.initVariable();

        while (Choose == true) {

            T.setRequest();

            System.out.println(您是否还要进行请求:y/n?”);

            C = in.nextLine();

            if (C.endsWith(“n”)) {

                Choose = false;

            }

        }

 

 

}

 

}

 


package Banker;

 

import java.util.Scanner;

 

public class Banker

{

int[] Available={10,5,7};

int[][] Max=new int[5][3];

int[][] Allocation = new int[5][3];

int[][] Need = new int[5][3];

int[][] Request = new int[5][3];

int[] Work = new int[3];

static int num = 0;//全局变量  表示进程编号

Scanner in = new Scanner(System.in);

public Banker()

{

}

public void initVariable()  //初始化变量

{

setMax();

setAllocation();

printSystemVariable();

        SecurityAlgorithm();

}

 

private void setAllocation()

{

 System.out.println(请设置请各进程分配矩阵Alloction);

        for (int i = 0; i < 5; i++) {

            System.out.println(请输入进程P” + i + 的分配资源量:);

            for (int j = 0; j < 3; j++) {

                Allocation[i][j] = in.nextInt();

            }

        }

        System.out.println(“Available=Available-Allocation.”);

        System.out.println(“Need=Max-Alloction.”);

        for (int i = 0; i < 3; i++)

        {//设置Available矩阵

            for (int j = 0; j < 5; j++)

            {

                Available[i] = Available[i] – Allocation[j][i];

            }

        }

        for (int i = 0; i < 5; i++)

        {//设置Need矩阵

            for (int j = 0; j < 3; j++)

            {

                Need[i][j] = Max[i][j] – Allocation[i][j];

            }

        }

 

}

 

private void setMax()

{

System.out.println(请设置各进程的最大需求矩阵Max);

        for (int i = 0; i < 5; i++) {

            System.out.println(请输入进程P” + i + 三类资源的最大资源需求量:);

            for (int j = 0; j < 3; j++) {

                Max[i][j] = in.nextInt();

            }

        }

}

public void printSystemVariable(){

        System.out.println(此时资源分配量如下:);

        System.out.println(进程  +”   Max   “+”   Alloction “+”    Need  “+”     Available “);

        for(int i=0;i<5;i++)

        {

            System.out.print(“P”+i+”  “);

            for(int j=0;j<3;j++)

            {

               System.out.print(Max[i][j]+”  “);

            }

            System.out.print(“|  “);

            for(int j=0;j<3;j++)

            {

               System.out.print(Allocation[i][j]+”  “);

            }

            System.out.print(“|  “);

            for(int j=0;j<3;j++)

            {

               System.out.print(Need[i][j]+”  “);

            }

            System.out.print(“|  “);

            if(i==0)

            {

                for(int j=0;j<3;j++)

                {

                    System.out.print(Available[j]+”  “);

                }

            }

            System.out.println();

        }

    }

    public void setRequest()

    {//设置请求资源量Request

     System.out.println(请输入请求资源的进程编号:);

        num= in.nextInt();//设置全局变量进程编号num

        System.out.println(请输入请求各资源的数量:);

        for (int j = 0; j < 3; j++) {

            Request[num][j] = in.nextInt();

        }

        System.out.println(即进程P” + num + 对各资源请求Request(“ + Request[num][0] + “,” + Request[num][1] + “,” + Request[num][2] + “).”);

 

        BankerAlgorithm();

    }

 

private void BankerAlgorithm()

{

boolean T = true;   //标志位

if(Request[num][0]<=Need[num][0]&&Request[num][1]<=Need[num][1]&&Request[num][2]<=Need[num][2])

{

//请求资源小于所需要的资源

if(Request[num][0] <= Available[0]&&Request[num][1] <= Available[1]&&Request[num][2] <= Available[2])

{

for(int i = 0;i < 3;i++)

{

Available[i] -= Request[num][i];

Allocation[num][i] += Request[num][i];

Need[num][i] -= Request[num][i];

}

}

else

{

System.out.println(当前没有足够的资源可分配,进程P” + num + 需等待。);

T = false;

}

}

else {

System.out.println(进程P” + num + 请求已经超出最大需求量Need.”);

            T=false;

}

if(T == true)//分配成功 安全检查

{

printSystemVariable();

System.out.println(现在进入安全算法:);

        SecurityAlgorithm();

}

}

 

private void SecurityAlgorithm()

{

boolean[] Finish = {false,false,false,false,false};//初始化

int count = 0;  //完成 进程数目

int circle = 0; //循环圈数

boolean flag = true;

int[] S=new int[5];//存储当前的安全序列

 

for (int i = 0; i < 3; i++)

{//设置工作向量

            Work[i] = Available[i];

        }

while(count<5)

{

if(flag)

{

System.out.println(进程  +”   Work  “+”   Alloction “+”    Need  “+”     Work+Alloction”);

flag = false;

}

for (int i = 0; i < 5; i++)

{

 

if (Finish[i] == false&&Need[i][0] <= Work[0]&&Need[i][1] <= Work[1]&&Need[i][2] <= Work[2])

{   //判断当前进程是否满足条件

count++;//足进程数加1

Finish[i]=true;//当当前进程能满足时

S[count-1]=i;//设置当前序列排号

System.out.print(“P”+i+”  “);

for (int k = 0; k < 3; k++)

{

System.out.print(Work[k]+”  “);

}

System.out.print(“|  “);

for (int j = 0; j<3;j++)

{

Work[j] += Allocation[i][j];

}

for(int j=0;j<3;j++)

{

System.out.print(Allocation[i][j]+”  “);

}

System.out.print(“|  “);

for(int j=0;j<3;j++)

{

System.out.print(Need[i][j]+”  “);

}

System.out.print(“|  “);

for(int j=0;j<3;j++)

{

System.out.print(Work[j]+”  “);

}

System.out.println();

}

}

circle++;//循环圈数加1

 

if(count == 5)

{//判断是否满足所有进程需要

System.out.print(此时存在一个安全序列:);

for (int i = 0; i<5;i++)

{//输出安全序列

System.out.print(“P”+S[i]+” “);

}

System.out.println(故当前可分配!);

break;//跳出循环

}

if(count<circle)

{//判断完成进程数是否小于循环圈数

count=7;

System.out.println(当前系统处于不安全状态,故不存在安全序列。);

break;//跳出循环

}

}

}

}

 

    原文作者:银行家问题
    原文地址: https://blog.csdn.net/zl1107604962/article/details/53524057
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞