Java版银行家算法

package com.feifei.banker;

import java.io.*;

public class Banker {
 // 剩余资源量,初始值是系统中所配置的该类全部可用资源的数目
 int available[];

 // 每个进程的最大需求量
 int max[][];

 // 各个进程尚需的资源量
 int need[][];

 // 已经为每个进程提供的数量
 int allocated[][];

 // 资源种类
 int resourceType;

 // 进程数量
 int processCount;

 boolean echo = true;

 // 从System.in读数据
 BufferedReader br;

 public static void main(String args[]) {
  Banker banker = newBanker();
  banker.init();
  banker.display();
  banker.allocateResource();
 }

 void init() {
  try {
   br = newBufferedReader(new InputStreamReader(System.in));
  } catch (Exception e) {
   e.printStackTrace();
   System.exit(0);
  }

  System.out.println("===银行家算法演示程序===");
  System.out.print("请输入资源种类数:");
  // 从屏幕获得输入的资源数量
  resourceType = readInt();
  // 资源种类数量array
  available = newint[resourceType];

  System.out.print("请输入资源个数向量,共"+ resourceType + "个整数,以空格分隔:/n");
  // 资源种类数量array初始化
  available = readIntArray();

  System.out.print("请输入进程个数:");
  // 从屏幕获得输入的进程数量
  processCount = readInt();
  // 各进程需要的各类资源的最大数矩阵
  max = newint[processCount][resourceType];
  // 各进程已分配的各类资源的数量矩阵
  allocated = newint[processCount][resourceType];
  // 各进程尚需要的各类资源的数量矩阵
  need = newint[processCount][resourceType];

  System.out.print("请输入进程的最大资源需求量矩阵(max矩阵,每行"+ resourceType
    +"个整数,以空格分隔,共" + processCount + "行):/n");
  for (int i = 0; i< processCount; i++)
   max[i] =readIntArray();

  System.out.print("请输入进程的已分配资源量矩阵(allocated矩阵,每行"+ resourceType
    +"个整数,以空格分隔,共" + processCount + "行):/n");
  for (int i = 0; i< processCount; i++)
   allocated[i]= readIntArray();
  for (int i = 0; i< resourceType; i++)
   for (int j =0; j < processCount; j++)
    //计算出need矩阵
    need[j][i]= max[j][i] - allocated[j][i];

  for (int i = 0; i< resourceType; i++)
   for (int j =0; j < processCount; j++) {
    //重新计算available矩阵
    available[i]-= allocated[j][i];
    if(available[i] < 0) {
     System.out.println("错误:第"+ (i + 1)
       +"个可用资源数不足以分配给进程,请检查资源总量和已分配资源矩阵!");
     System.exit(0);
    }
   }
 }

 
 void display() {
  System.out.print("===当前状态:");
  if (safeOrNot())
   System.out.println("安全");
  else
   System.out.println("不安全");
  System.out.println("Max矩阵:");
  printMatrix(max);
  System.out.println("Allocated矩阵:");
  printMatrix(allocated);
  System.out.println("Need矩阵:");
  printMatrix(need);
  System.out.println("available向量:");
  printMatrix(available);
  System.out.println("安全状态:" +safeOrNot());
 }

 void printMatrix(int matrix[]) {
  if (matrix == null)
   return;
  System.out.print("[");
  for (int i = 0; i< matrix.length; i++) {
   System.out.print(matrix[i]);
   if (i + 1< matrix.length)
    System.out.print("/t");
  }
  System.out.println("]");
 }

 void printMatrix(int matrix[][]) {
  if (matrix == null)
   return;
  for (int i = 0; i< matrix.length; i++) {
   System.out.print("[");
   for (int j =0; j < matrix[0].length; j++) {
    System.out.print(matrix[i][j]);
    if(j + 1 < matrix[i].length)
     System.out.print("/t");
   }
   System.out.println("]");
  }
 }

 void allocateResource() {
  while (true) {
   System.out.print("请输入资源请求进程编号:/n");
   int processID= readInt();
   System.out.print("请输入资源请求向量,共"+ resourceType + "个整数,以空格分隔:/n");
   int request[]= readIntArray();
   if(!smallerVector(request, need[processID])) {
    System.out.println("资源请求不符该进程的需求量.");
   } else if(!smallerVector(request, available)) {
    System.out.println("可用资源不足以满足请求,进程阻塞等待.");
   } else{
    subVector(available,request);
    addVector(allocated[processID],request);
    subVector(need[processID],request);
    if(safeOrNot()) {
     //判断所有进程是否是安全序列
     display();
    }else {
     System.out.println("不安全!");
     addVector(available,request);
     subVector(allocated[processID],request);
     addVector(need[processID],request);
    }
   }
   System.out.print("继续?(y/n)");
   if(readString().toLowerCase().equals("n"))
    break;
  }
 }

 void copyVector(int[] v1, int[] v2) {
  for (int i = 0; i< v1.length; i++)
   v1[i] =v2[i];
 }

 void addVector(int[] v1, int[] v2) {
  for (int i = 0; i< v1.length; i++)
   v1[i] +=v2[i];
 }

 void subVector(int[] v1, int[] v2) {
  for (int i = 0; i< v1.length; i++)
   v1[i] -=v2[i];
 }

 boolean smallerVector(int[] v1, int[] v2){
  boolean value = true;
  for (int i = 0; i< v1.length; i++)
   if (v1[i]> v2[i]) {
    value= false;
    break;
   }
  return value;
 }

 boolean allEquals(boolean[] v, boolean b){
  boolean value = true;
  for (int i = 0; i< v.length; i++)
   if (v[i] !=b) {
    value= false;
    break;
   }
  return value;
 }

 boolean safeOrNot() {
  // 系统提供给进程继续运行所需的各类资源数目向量
  int work[] = newint[resourceType];
  // 系统是否有足够的资源分配给进程,使之运行完成
  boolean finished[] = newboolean[processCount];
  // Work := Available
  copyVector(work,available);
  while (true) {
   int i;
   for (i = 0; i< processCount; i++) {
    //1.Finish[i]=false 2.Need[i,j]<=Work[i]
    if(!finished[i] &&smallerVector(need[i], work)) {
     //当进程P[i]获得资源,可顺利执行,直至完成,并释放资源
     addVector(work,allocated[i]);
     finished[i]= true;
     break;
    }
   }

   //判断是否为安全序列
   if (i ==processCount)
    if(allEquals(finished, true))
     returntrue;
    else
     returnfalse;
  }
 }

 public String readString() {
  try {
   String s =br.readLine();
   if(echo)
    System.out.println(s);
   returns;
  } catch (Exception e) {
   System.out.println(e);
   returnnull;
  }
 }

 public int readInt() {
  try {
   String s =br.readLine();
   if(echo)
    System.out.println(s);
   returnInteger.parseInt(s);
  } catch (Exception e) {
   System.out.println(e);
   return0;
  }
 }

 public int[] readIntArray() {
  try {
   String s =br.readLine();
   if(echo)
    System.out.println(s);
   String tmp[]= s.split(" ");
   int value[] =new int[tmp.length];
   for (int i =0; i < value.length; i++)
    value[i]= Integer.parseInt(tmp[i]);
   returnvalue;
  } catch (Exception e) {
   System.out.println(e);
   returnnull;
  }
 }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值