操作系统 银行家算法(java)

简介: 操作系统 银行家算法(java)

操作系统 银行家算法(java)

Bank.java

import java.util.Scanner;
public class Banker {
  int[] Available = new int [3]; //限制该数组范围为大小为3
    int[][] Max;
    int[][] Alloction;
    int[][] Need;
    int[][] Request;
    int[] Work;
    int flag;
    int num = 0;//进程编号
    Scanner in = new Scanner(System.in);
    public Banker() {
        // Max={{6,3,2},{5,6,1},{2,3,2}};
    }
    public void count(int num){
      flag=num;
      Max = new int[flag][3];
      Alloction = new int[flag][3];
      Need = new int[flag][3];
      Request = new int[flag][3];
      Work = new int[3];
    }
    public void setSystemVariable(){//设置各初始系统变量,并判断是否处于安全状态。
        setMax();
        setAlloction();
        printSystemVariable();
        SecurityAlgorithm();
    }
    public void setMax() {//设置Max矩阵
        System.out.println("请设置各进程的最大需求矩阵Max:");
        for (int i = 0; i < flag; i++) {
            System.out.println("请输入进程P" + i + "的最大资源需求量:");
            for (int j = 0; j < 3; j++) {
                Max[i][j] = in.nextInt();
            }
        }
    }
    public void setAlloction() {//设置已分配矩阵Alloction
        System.out.println("请设置请各进程分配矩阵Alloction:");
        for (int i = 0; i < flag; i++) {
            System.out.println("请输入进程P" + i + "的分配资源量:");
            for (int j = 0; j < 3; j++) {
                Alloction[i][j] = in.nextInt();
            }
        }
        System.out.println("Available=Available-Alloction.");
        System.out.println("Need=Max-Alloction.");
        for (int i = 0; i < 3; i++) {//设置Alloction矩阵
          System.out.println("请输入request:");
            //for (int j = 0; j < 3; j++) {
                Available[i] = in.nextInt();
            //}
        }
        for (int i = 0; i < flag; i++) {//设置Need矩阵
            for (int j = 0; j < 3; j++) {
                Need[i][j] = Max[i][j] - Alloction[i][j];
            }
        }
    }
    public void printSystemVariable(){
        System.out.println("此时资源分配量如下:");
        System.out.println("进程  "+"   Max   "+"   Alloction "+"    Need  "+"     Available ");
        for(int i=0;i<flag;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(Alloction[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();
    }
    public void BankerAlgorithm() {//银行家算法
        boolean T=true;
        int num1=0;
        boolean []panduanNeed = new boolean [flag];
        boolean []panduanAvailable = new boolean [flag];
        for (int k = 0; k < 3; k++) {
          if(Request[num][k] <= Need[num][k]) panduanNeed[k]=true;
          else panduanNeed[k] = false;
          if (Request[num][k] <= Available[k]) panduanAvailable[k]=true;
          else panduanAvailable[k] = false; 
        }
        for (int q = 0; q < 3; q++) {
          //if (Request[num][0] <= Need[num][0] && Request[num][1] <= Need[num][1] && Request[num][2] <= Need[num][2]) {//判断Request是否小于Need
                //if (Request[num][0] <= Available[0] && Request[num][1] <= Available[1] && Request[num][2] <= Available[2]) {//判断Request是否小于Alloction
              if(panduanNeed[q]==true){
                if (panduanAvailable[q]==true) {
              for (int i = 0; i < 3; i++) {
                        Available[i] -= Request[num][i];
                        Alloction[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();
       }
    }
    public void SecurityAlgorithm() {//安全算法
      boolean []panduanNeedWork = new boolean [flag];
        boolean[] Finish = new boolean [flag];//初始化Finish
        for (int i = 0; i < flag; i++) {
          Finish[i] =false;
    }
        int count = 0;//完成进程数
        int circle=0;//循环圈数
        int[] S=new int[flag];//安全序列
        for (int i = 0; i < 3; i++) {//设置工作向量
            Work[i] = Available[i];
        }
        boolean flag1 = true;
        while (count < flag) {
            if(flag1){
                System.out.println("进程  "+"   Work  "+"   Alloction "+"    Need  "+"     Work+Alloction ");
                flag1 = false;
            }
            for (int i = 0; i < flag; i++) {
//              for (int q = 0; q < 3; q++) {
//          if(Need[i][q]<=Work[q]) panduanNeedWork[q]=true;
//              else panduanNeedWork[q] = false;
//          }
//              int flagNeedWork=0;
//              for (int j = 0; j < 3; j++) {
//          if (panduanNeedWork[j]==false) flagNeedWork=0;
//          else flagNeedWork=1;
//        }
              //  if (Finish[i]==false&&flagNeedWork==1) {//判断条件
                  if (Finish[i]==false&&Need[i][0]<=Work[0]&&Need[i][1]<=Work[1]&&Need[i][2]<=Work[2]){
                    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]+=Alloction[i][j];
                    }
                    Finish[i]=true;//当当前进程能满足时
                    S[count]=i;//设置当前序列排号
                    count++;//满足进程数加1
                    for(int j=0;j<3;j++){
                       System.out.print(Alloction[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==flag){//判断是否满足所有进程需要
                System.out.print("此时存在一个安全序列:");
                for (int i = 0; i<flag;i++){//输出安全序列
                    System.out.print("P"+S[i]+" ");
                }
                System.out.println("故当前可分配!");
                break;//跳出循环
            }
            if(count<circle){//判断完成进程数是否小于循环圈数
                count=5;
                System.out.println("当前系统处于不安全状态,故不存在安全序列。");
                break;//跳出循环
            }
        }
    }
}

BankTest.java 测试类

import java.util.Scanner;
public class BankTest {
  public static void main(String[] args) {
    boolean Choose = true;
        String C;
        Scanner in = new Scanner(System.in);
        Banker T = new Banker();
//        System.out.println("这是一个三个进程,初始系统可用三类资源为{10,8,7}的银行家算法:");
        System.out.println("请输入进程的个数");
        int count =in.nextInt();
        T.count(count);
        T.setSystemVariable();
        while (Choose == true) {
            T.setRequest();
            System.out.println("您是否还要进行请求:y/n?");
            C = in.nextLine();
            if (C.endsWith("n")) {
                Choose = false;
            }
        }
  }
}

测试结果:

image.png

image.png


目录
相关文章
|
14天前
|
算法 安全 Java
性能工具之 JMeter 自定义 Java Sampler 支持国密 SM2 算法
【4月更文挑战第28天】性能工具之 JMeter 自定义 Java Sampler 支持国密 SM2 算法
31 1
性能工具之 JMeter 自定义 Java Sampler 支持国密 SM2 算法
|
6天前
|
Java 开发工具
2023全网最详细的银河麒麟操作系统,Java运行环境【jdk】安装
2023全网最详细的银河麒麟操作系统,Java运行环境【jdk】安装
|
20天前
|
设计模式 算法 Java
[设计模式Java实现附plantuml源码~行为型]定义算法的框架——模板方法模式
[设计模式Java实现附plantuml源码~行为型]定义算法的框架——模板方法模式
|
21天前
|
搜索推荐 算法 Java
Java实现的常用八种排序算法
提到数据结构与算法,无法避免的一点就包含排序,熟练的掌握各种排序算法则是一个程序员必备的素质之一,除此之外,排序算法也是当下各大技术公司比较喜欢问的技术点,所以,就这一点JavaBuild整理了常见的8种排序算法
12 0
|
25天前
|
机器学习/深度学习 数据采集 算法
使用 Java 实现机器学习算法
【4月更文挑战第19天】Java在数据驱动时代为机器学习提供支持,具备丰富的数学和数据结构库,适用于实现线性回归、决策树、SVM和随机森林等算法。实现时注意数据预处理、模型选择、评估指标和可视化。利用Java的库和编程能力可构建高效模型,但需按问题需求选择合适技术和优化方法。
|
1月前
|
算法 安全 Java
java代码 实现AES_CMAC 算法测试
该代码实现了一个AES-CMAC算法的简单测试,使用Bouncy Castle作为安全提供者。静态变量K定义了固定密钥。`Aes_Cmac`函数接受密钥和消息,返回AES-CMAC生成的MAC值。在`main`方法中,程序对给定的消息进行AES-CMAC加密,然后模拟接收ECU的加密结果并进行比较。如果两者匹配,输出&quot;验证成功&quot;,否则输出&quot;验证失败&quot;。辅助方法包括将字节转为16进制字符串和将16进制字符串转为字节。
|
1月前
|
搜索推荐 Java
Java排序算法
Java排序算法
20 0
|
1月前
|
搜索推荐 Java
Java基础(快速排序算法)
Java基础(快速排序算法)
25 4
|
1月前
|
搜索推荐 算法 Java
Java基础(冒泡排序算法)
Java基础(冒泡排序算法)
19 3
|
2月前
|
存储 缓存 监控
深入理解Java线程池ThreadPoolExcutor实现原理、数据结构和算法(源码解析)
Java线程池的核心组件包括核心线程数、最大线程数、队列容量、拒绝策略等。核心线程数是线程池长期维持的线程数量,即使这些线程处于空闲状态也不会被销毁;最大线程数则是线程池允许的最大线程数量,当任务队列已满且当前线程数未达到最大线程数时,线程池会创建新线程执行任务;队列容量决定了任务队列的最大长度,当新任务到来时,如果当前线程数已达到核心线程数且队列未满,任务将被放入队列等待执行;拒绝策略则定义了当线程池无法处理新任务时的行为,如抛出异常、丢弃任务等。
55 1