前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >操作系统的银行家算法

操作系统的银行家算法

作者头像
用户6055494
发布2019-10-28 17:40:37
6330
发布2019-10-28 17:40:37
举报
文章被收录于专栏:AVAJ
啥是银行家算法,在现实中的例子就是 如果说现在有个银行有1200万,现有三个身无分文的项目经理(a、b、c),去银行贷款,已知a要贷款400万,b要贷款600万,c要贷款800万,现有个规定,如果项目经理没有贷到足够项目的经费,项目就会破产,银行也没有办法把钱收回来,比如说b向银行贷款500万,然后c向银行贷款700万,这也银行的钱已经被贷空,而b和c的项目也因为没有足够经费而破产,这种情况就是不安全的情况,为了避免这种情况发生,这就需要制定一套安全的运作体系。

映射到计算机的话则是操作系统的银行家算法,进程要运行的话,必须要有资源才行,如果资源分配不当,整个操作系统就会发生死锁。同样为了避免这种情况的发生,下面引入银行家算法。

这里的话会涉及到一些变量,先进行简单的介绍:

available[]:系统可用的资源,是个数组,里面放不同的资源。类比与银行有多少钱(1200W)。

max[][]:每个进程需要各种资源的最大值,二维数组,类比每个项目经理需要贷的款(这里项目经理只需要贷到钱就行,而进程需要各种资源)

allocation [][]:系统已经给每个进程分配的资源,类比银行已经贷出去的款

need [][]:每个进程还需要的各类资源的数目。

finish[]:安全检查时用来标识每个进程是否安全。

work[]:安全检查时用来存系统各类可用的资源数。

代码语言:javascript
复制
public class Banker {
   /*
    * Avaliable[] Avaliable[i] = k 表示系统中i类资源可分配(现有)的数目为k ,
    * Max[][] Max[i][j] = k 表示进程i需要j类资源的最大数目为k
    * Allocation [][] Allocation[i][j] = k 代表当前系统已经分配给i进程j类资源为k
    * Need[][] Need[i][j] = k 表示i进程还需要j类资源为k
    * 关系 need[i][j] = max[i][j] - Allocation[i][j]
    **/
   // 安全性问题 工作向量Work 表示系统可提供给进程继续运行的各类资源数目 含有m个元素,在执行安全算法开始时
   // Work = Avaliable;
   // Finish 表示系统是否有足够的资源分配给进程 使之运行完成 先令Finish[i] = false;当有足够的资源分配给进程时,
   // 令Finish = true;
   // 从进程集合中找到一个能满足下述条件的进程
   // 1.Finish = false;
   // 2.Need[i][j] <= Work[j]

    // 系统可用的资源 这里有三类资源
    int[] available = {10,8,7};
    // 各进程需要各资源的最大值 三个进程每个资源的占用
    // [4][2][3]  第一个进程需要三类资源分布为4、2、3
    // [4][5][6]  依次类推
    // [3][2][1]
    int[][] max = {{4,2,3},{4,5,6},{3,2,1}};
    // 各进程的各资源已分配情况 三个进程每个资源的分配
    // [2][1][2]
    // [2][3][3]
    // [1][2][1]
    int[][] alloction = {{2,1,2},{2,3,3},{1,2,1}};
    // 各进程对各进程的需求
    // [2][1][1]
    // [2][2][3]
    // [2][0][0]
    int[][] need = {{2,1,1},{2,2,3},{2,0,0}};
    // 各进程对各资源的请求
    // [2][1][1]
    // [2][2][3]
    // [2][0][0]
    int[][] request = {{2,1,1},{2,2,3},{2,0,0}};
    // 用于安全算法内的系统剩余资源
    int[] work = new int[3];

    int num = 0; // 进程编号

    Scanner in = new Scanner(System.in);
    
    private void BankerAlgorithm() { //银行家算法
        boolean t = true;
        if (request[num][0] <= need[num][0] && request[num][1] <= need[num][1] && request[num][2] <= need[num][3]) {
            //请求的 要比需要的少才行
            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];
                    alloction[num][i] += request[num][i];
                    need[num][i] -= request[num][i];
                }
            } else {
                System.out.println("当前没有足够的资源可以进行分配");
                t = false;
            }
        } else {
            System.out.println("进程P" + num + "请求已经超出最大需求量Need.");
            t=false;
        }

        if (t == true) {
            securityAlgorithm(); // 安全监测 
        }
    }

    private void securityAlgorithm() {
        boolean[] finish = {false,false,false};// 初始化 finish
        int count = 0; // 完成的进程数
        int circle = 0; // 循环圈数
        int[] s = new int[3];// 安全序列
        for (int i = 0; i < 3; i++) { // 设置工作向量
            work[i] = available[i];
        }
        boolean flag = true;

        while(count < 3) {

            if (flag) {
                System.out.println("进程" + "work" + "alloction" + "need" + "work + alloction");
                flag = false;
            }
            for (int i = 0; i < 3; i++) {

                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 == 3){//判断是否满足所有进程需要
                System.out.print("此时存在一个安全序列:");
                for (int i = 0; i < 3;i++){//输出安全序列
                    System.out.print("P"+s[i]+" ");
                }
                System.out.println("故当前可分配!");
                break;//跳出循环
            }
            if(count < circle){//判断完成进程数是否小于循环圈数
                count = 5;
                System.out.println("系统处于不安全状态");
                break;//跳出循环
            }
          }
       }
    }

每当系统进行资源分配之后,就会进行安全算法,安全算法会遍历所有进程,然后将资源分配给该进程让这个进程获取所需的全部资源,同时运存完把资源回收,设置finish[i]=true这里的i表示第i个进程,然后排除这个进程,继续遍历其他进程,直到所有的进程finish[i]都为true,这样就算是安全,否则只有有一个不为true,则系统处于不安全状态。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-10-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员面试鸭 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档