银行家算法

来源:互联网 发布:js防水是什么意思 编辑:程序博客网 时间:2024/06/11 17:09

import java.util.Scanner;

 

class bank2 {

    int Max[][] = new int[100][100];// 各进程所需各类资源的最大需求

 

    int Avaliable[] = new int[100];// 系统可用资源

 

    String name[] = new String[100];// 资源的名称

 

    int Allocation[][] = new int[100][100];// 系统已分配资源

 

    int Need[][] = new int[100][100];// 还需要资源

 

    int Request[] = new int[100];// 请求资源向量

 

    int temp[] = new int[100];// 存放安全序列

 

    int Work[] = new int[100];// 存放系统可提供资源

 

    int M = 100;// 进程的最大数为100

 

    int N = 100;// 资源的最大数为100

   

    /**

     * 进行初始化,显示各个资源情况 

     */

    void showdata(){

       int i, j;

       System.out.println("系统目前可用的资源[work]:");

 

       for (i = 0; i < N; i++)

           System.out.print(name[i] + " ");

 

       System.out.println();

 

       for (j = 0; j < N; j++)

           System.out.print(Work[j] + " ");// 输出可用资源

 

       System.out.println();

       System.out.println("             Max      Allocation     Need       work");

       System.out.print("进程名             ");

 

       for (j = 0; j < 4; j++) {

           for (i = 0; i < N; i++)

              System.out.print(name[i] + " ");

           System.out.print("      ");

       }

 

       System.out.println();

 

       for (i = 0; i < M; i++) {

           System.out.print(" " + i + "         ");

           for (j = 0; j < N; j++)

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

           System.out.print("      ");

           for (j = 0; j < N; j++)

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

           System.out.print("      ");

           for (j = 0; j < N; j++)

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

           System.out.print("      ");

           for (j = 0; j < N; j++)

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

           System.out.println();

       }

    }

   

    /**

     * 进行资源分配

     */

    int changedata(int i){

   

       int j;

 

       for (j = 0; j < M; j++) {

           Avaliable[j] = Avaliable[j] - Request[j];

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

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

           Work[j] = Avaliable[j];

       }

 

       return 1;

    }

   

    /**

     * 恢复当前的资源

     */

 

 

    int getdata(int i){

   

       int j;

       for (j = 0; j < M; j++) {

           Avaliable[j] = Avaliable[j] + Request[j];

           Allocation[i][j] = Allocation[i][j] - Request[j];

           Need[i][j] = Need[i][j] + Request[j];

           Work[j] = Avaliable[j];

       }

 

       return 1;

    }

   

    /**

     * 寻找安全序列

     */

 

    int safe(){

 

       int i, k = 0, m, apply;

       boolean Finish[] = new boolean[100];

       int j;

       for (i = 0; i < M; i++) {

           apply = 0;

           for (j = 0; j < N; j++) {

              if (Finish[i] == false && Need[i][j] <= Work[j]) {

                  apply++;

                  if (apply == N) {//申请的资源全部满足时运行

                     for (m = 0; m < N; m++)

                         Work[m] = Work[m] + Allocation[i][m];// 变分配数

                     Finish[i] = true;

                     temp[k] = i;

                     i = -1;// 每次都要从0号进程进行安全性检查,并且每次++

                     k++;

                  }

              }

           }//控制资源的循环结束

 

       }//控制进程的循环结束

 

       for (i = 0; i < N; i++) {

           Work[i] = Avaliable[i];

       }

 

       for (i = 0; i < M; i++) {

           if (Finish[i] == false) {

              System.out.println("系统不安全");// 不成功系统不安全

              return -1;

           }else{

              System.out.println("系统是安全的!");// 如果安全,输出成功

              System.out.print("安全序列是:");

 

              for (i = 0; i < M; i++) {// 输出运行进程数组

                  System.out.print(temp[i]);

                  if (i < M - 1)

                     System.out.print("-->");

              }

 

           }

       }

      

       System.out.println();

       return 0;

    }

   

    /**

     * 分配资源,检查死锁

     */

 

    void share(){// 利用银行家算法对申请资源对进行判定

       char ch = 'y';

       int i = 0, j = 0;

       int count = 0;

       System.out.print("请输入你要求分配的资源进程号(0-" + (M - 1) + "):");

       Scanner sc = new Scanner(System.in);

       i = sc.nextInt();// 输入须申请的资源号

       System.out.println("请输入进程 " + i + " 申请的资源:");

 

       for (j = 0; j < N; j++) {

           System.out.print(name[j] + ":");

           Scanner sc1 = new Scanner(System.in);

           Request[j] = sc1.nextInt();// 输入需要申请的资源

 

       }

 

       for (j = 0; j < N; j++) {

           if (Request[j] > Need[i][j])// 判断申请是否大于需求,若大于则出错

           {

              System.out.print("进程 " + i + "申请的资源大于它需要的资源");

              System.out.println(" 分配不合理,不予分配!");

              ch = 'n';

              // showdata();

              break;

           }

 

           if (Request[j] > Avaliable[j]) {// 判断申请是否大于当前资源,若大于则出错

              System.out.print("进程" + i + "申请的资源大于系统现在可利用的资源");

              System.out.println(" 分配出错,不予分配!");

              ch = 'n';

              break;

           }

 

       }

 

       if (ch == 'y') {

           changedata(i);// 根据进程需求量变换资源

           if (safe() == -1) {

              getdata(i);

              System.out.println(" 分配出错,不予分配!");

              System.out.println("现有资源!");

              // for(i=0;i<N;i++){Avaliable[i]=Work[i];}

           }// 根据进程需求量进行银行家算法判断

           if (safe() == 0) {

              for (i = 0; i < M; i++) {

                  count = 0;

                  for (j = 0; j < N; j++) {

                     if (Max[i][j] == Allocation[i][j]) {

                         count++;

                     }

                     if (count == N) {

                         for (j = 0; j < N; j++) {

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

                            Allocation[i][j] = 0;

                            Avaliable[j] = Work[j];

                         }

                     }

                  }

              }

              showdata();// 根据进程需求量显示变换后的资源

           }

 

       }

    }

 

}

 

public class Bank {

    public static void main(String[] args) {// 主函数

       int i, j, number, choice = 1, m, n, flag;

       String ming;

       System.out.println("*****************资源管理系统的设计与实现*****************");

       System.out.print("请首先输入系统可供资源种类的数量:");

       Scanner sc = new Scanner(System.in);

       n = sc.nextInt();

       bank2 b = new bank2();

       b.N = n;

 

       for (i = 0; i < n; i++) {

           System.out.print("请输入第"+(i + 1) + "资源" + "的名称:");

           Scanner sc1 = new Scanner(System.in);

           ming = sc1.next();

           b.name[i] = ming;

           System.out.print("请输入第"+(i + 1) + "资源" + "的数量:");

           Scanner sc11 = new Scanner(System.in);

           number = sc11.nextInt();

           b.Avaliable[i] = number;

           b.Work[i] = number;

       }

       System.out.println("请输入进程数量:");

       Scanner sc11 = new Scanner(System.in);

       m = sc11.nextInt();

       b.M = m;

       //System.out.println("请输入各进程的最大需求量(" + m + "*" + n + "矩阵)[Max]:");

 

       for (i = 0; i < m; i++) {

           System.out.println("请输入各进程第"+(i + 1)+"资源的最大需求量:");

           for (j = 0; j < n; j++) {

              Scanner sc111 = new Scanner(System.in);

              b.Max[i][j] = sc111.nextInt();

 

           }

         do {

           flag = 0;

           System.out.println("请输入各进程已经申请的资源量(" + m + "*" + n+ "矩阵)[Allocation]:");

           for (i = 0; i < m; i++)

              for (j = 0; j < n; j++) {

                  Scanner sc111 = new Scanner(System.in);

                  b.Allocation[i][j] = sc111.nextInt();

                 

                  if (b.Allocation[i][j] > b.Max[i][j])

                     flag = 1;

                  b.Need[i][j] = b.Max[i][j] - b.Allocation[i][j];

                  b.Work[j] = b.Work[j] - b.Allocation[i][j];

                  b.Avaliable[j] = b.Work[j];

              }

           if (flag == 1)

              System.out.println("申请的资源大于最大需求量,请重新输入!");

       } while (flag == 1);

 

       b.showdata();// 显示各种资源

       b.safe();// 用银行家算法判定系统是否安全

       do {

           System.out.println("是否分配资源    ");

           System.out.println("1: ");

           System.out.println("2: ");

           Scanner sc111 = new Scanner(System.in);

           choice = sc111.nextInt();

 

           switch (choice) {

           case 1:

              b.share();

              break;

           case 2:

              choice = 0;System.out.println("你已经退出了该系统");

              break;

           default:

              System.out.println("你输入有错,欢迎下次使用!!!!");

              break;

           }

       } while (choice != 0);

 

       System.exit(0);

    }

}

原创粉丝点击