操作系统--银行家算法

import java.util.Scanner;

public class test {
    Scanner in=new Scanner(System.in);

    int[][] Max;    //最大
    int[][] Allocation;    //已分配
    int[][] Need;        //需要
    int[] Availables;   //每个进程完成后存在的可分配的
    int[] Available;         //现有
    int[] Allocations;

    int p;  //定义进程数
    int z;  //定义资源数
    int[] safe;   //定义安全序列数组
    int[] Max1;

    int[] request;   //请求资源数
    int p2=0;       //请求进程的下标
    int request1=0;    //请求数字
    int[] Need1;    //获取need数组中的每行的值
    int ava=0;    //获取available数值
    int available=0;


    public static void main(String[] args) {
        test tests=new test();
        tests.definition();

    }

    public void definition(){
        /*定义数组和相关变量*/
        System.out.println("请输入进程数:");
        p=in.nextInt();    //输入进程
        System.out.println("请输入资源数:");
        z=in.nextInt();    //输入资源
        Max=new int[p][z];
        Allocation=new int[p][z];
        Need=new int[p][z];
        Availables=new int[p];
        Available=new int[z];
        safe=new int[p];
        Need1=new int[p];
        request=new int[z];
        Max1=new int[p];
        Allocations=new int[p];


        for (int i=0;i<p;i++) {    //存储输入数据
            System.out.println("请输入p"+i+"的Max:");
            for (int j=0;j<z;j++){
                Max[i][j]=in.nextInt();   //输入max,并存入数组
            }
            System.out.println("请输入p"+i+"的Allocation:");
            for (int j=0;j<z;j++){
                Allocation[i][j]=in.nextInt();   //输入Allocation,并存入数组
            }
            System.out.println("请输入p"+i+"的Need:");
            for (int j=0;j<z;j++){
                Need[i][j]=in.nextInt();   //输入Need,并存入数组
            }
            if (i==0){
                System.out.println("请输入Available:");
                for (int j=0;j<z;j++){
                    Available[j]=in.nextInt();   //输入Available,并存入数组
                }
            }
        }

        if (compare()==0){
            System.out.println("不存在安全序列");
        }
        else{
            System.out.println("存在安全序列,安全序列为:");
            for (int i=0;i<p;i++){
                System.out.print("p"+safe[i]+"      ");
            }
        }
        /*判断是否安全*/
        if (check()==0){
            System.out.println("无法进行分配");
        }
        else{
            if(safe()==0){
                System.out.println("申请自愿不安全");
            }
            else{
                for(int i=0;i<p;i++){
                    System.out.print("p"+safe[i]+"        ");
                }
            }
        }

    }

    public int compare(){
        System.out.println("aaa");
        for (int i=0;i<p;i++){
            Need1[i]=0;
        }
        for (int i=0;i<p;i++){   //获取Need数值
            for (int j=0;j<z;j++){
                Need1[i]=Need1[i]+Need[i][j]*(int)Math.pow(10,(z-1-j));
            }
        }
        int[] Need2=new int[p];   //获取值,进行排序,然后和原序列比较
        for (int i=0;i<p;i++){
            Need2[i]=Need1[i];
        }
        int need;   //中间值
        for (int i=0;i<p-1;i++){    //获取到need的升序排列
            for (int j=i+1;j<p;j++){
                if (Need2[i]>Need2[j]){
                    need=Need2[i];
                    Need2[i]=Need2[j];
                    Need2[j]=need;
                }
            }
        }
        for (int i=0;i<p;i++){
            Max1[i]=0;
        }
        for (int i=0;i<p;i++){
            {
                for (int j=0;j<z;j++){
                    Max1[i]=Max1[i]+Max[i][j]*(int)Math.pow(10,z-1-j);
                }
            }
        }

        for (int i=0;i<z;i++){
            available=available+Available[i]*(int)Math.pow(10,(z-1-i));
        }
        if (Need2[0]>available){
            return 0;
        }
        else{

            for (int i=0;i<p;i++){
                for (int j=0;j<p;j++){
                    if (Need2[i]==Need1[j]){
                        safe[i]=j;
                    }
                }
            }
            for (int i=0;i<p;i++){
                if (i==0){
                    Availables[i]=Max1[safe[i]]+available;
                }
                else{
                    Availables[i]=Max1[safe[i]]+Availables[i-1];
                }
            }
            for (int i=0;i<p-1;i++){
                if (Availables[i]<Need1[safe[i+1]]){
                    return 0;
                }
            }
            return 1;
        }
    }

    public int check(){

        System.out.println();
        System.out.println("请输入进程进程以及请求资源:");
        System.out.println("进程(如p0):");
        String p1=in.next();
        System.out.println("request:");
        for (int i=0;i<z;i++){
            request[i]=in.nextInt();   //请求资源数
        }
        p1=p1.trim();    //对输入的信息过滤前后空格
        p2=(int)p1.charAt(1)-48;
        System.out.println(p2);
        for (int i=0;i<z;i++){
            request1=request1+request[i]*(int)Math.pow(10,z-1-i);
        }
        if (request1<=Need1[p2]){
            if (safe[0]==p2){
                for (int i=0;i<z;i++){
                    ava=ava+Available[i]*(int)Math.pow(10,z-1-i);
                }
                if (request1<=ava){
                    return 1;
                }
                else{
                    return 0;
                }
            }
            else{
                for (int i=1;i<p;i++){
                    if (safe[i]==p2){
                        if (request1<=Availables[i-1]){
                            return 1;
                        }
                        else {
                            return 0;
                        }
                    }
                }
            }
        }
        return 0;
    }
    public int safe(){
        available=available-request1;
        Need1[p2]=Need1[p2]-request1;
        Allocations[p2]=Allocations[p2]+request1;

    /*比            较*/
        int[] Need2=new int[p];   //获取值,进行排序,然后和原序列比较
        for (int i=0;i<p;i++){
            Need2[i]=Need1[i];
        }
        int need;   //中间值
        for (int i=0;i<p-1;i++){    //获取到need的升序排列
            for (int j=i+1;j<p;j++){
                if (Need2[i]>Need2[j]){
                    need=Need2[i];
                    Need2[i]=Need2[j];
                    Need2[j]=need;
                }
            }
        }
        if (Need2[0]>available){
            return 0;
        }
        else{

            for (int i=0;i<p;i++){
                for (int j=0;j<p;j++){
                    if (Need2[i]==Need1[j]){
                        safe[i]=j;
                    }
                }
            }
            for (int i=0;i<p;i++){
                if (i==0){
                    Availables[i]=Max1[safe[i]]+available;
                }
                else{
                    Availables[i]=Max1[safe[i]]+Availables[i-1];
                }
            }
            for (int i=0;i<p-1;i++){
                if (Availables[i]<Need1[safe[i+1]]){
                    return 0;
                }
            }
            return 1;
        }

 

    }

}

 

可能存在某些bug,望指正

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

锋年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值