银行家算法

来源:互联网 发布:正交矩阵和实对称矩阵 编辑:程序博客网 时间:2024/06/10 07:36

1、实验目的

利用java语言编码实现银行家算法,理解死锁概念及系统安全性检测算法的作用,加深对资源申请、避免死锁等概念的理解,最后实现避免死锁的具体实施方法

2、实验内容

实现银行家算法,满足以下要求:

  • 设定系统中进程的数量、各类资源的总量、进程对各类资源的初始占有情况、对各类资源最大申请量
  • 对当前系统进程进行安全性检测
  • 当某个进程对各类资源进行申请时,判断其申请是否能得到满足

3、算法设计

核心代码如下所示。banker(int k)函数在银行家算法中用于判断进程对资源的申请是否能够得到满足,safe( )函数用于检测当前进程对资源的占有情况是否处于安全状态,判断结果以boolean类型值返回。Recover( )函数用于当safe( )算法返回为false时将系统恢复到试分配前的状态

public void banker(int k) {        // k表示申请资源的第k个进程        k = k - 1;        int i;        System.out.println("\n进程 P" + (k + 1) + "尝试申请资源……");        System.out.println("\n进程 P" + (k + 1) + "申请的各类资源量:");        for (int j = 0; j < resourceCount; j++) {            System.out.println("申请资源" + (j + 1) + "的数量:" + Request[j]);        }        for (i = 0; i < resourceCount; i++) {            if (Request[i] > Need[k][i]) {                System.out.println("\n进程 P" + (k + 1) + "对资源的申请量大于声明的最大值,申请予以否决");                return;            }            if (Request[i] > Available[i]) {                System.out.println("\n进程 P" + (k + 1) + "对资源" + (i + 1) + "的申请量大于可用的数量,申请予以否决");                return;            }        }        for (int j = 0; j < resourceCount; j++) {            Available[j] = Available[j] - Request[j];            Allocation[k][j] = Allocation[k][j] + Request[j];            Need[k][j] = Need[k][j] - Request[j];        }        if (!safe()) {            System.out.println("\n试分配后系统处于不安全状态,不予分配资源!");            recover(k);        } else {            System.out.println("\n资源申请成功!");            System.out.println("安全序列为:");            for (int j = 0; j < threadCount; j++) {                if (j == threadCount - 1)                    System.out.print("进程 P" + thread[j]);                else                    System.out.print("进程 P" + thread[j] + "——>");            }            System.out.println();        }    }    // 状态安全性判断    public boolean safe() {        for (int i = 0; i < resourceCount; i++) {            Work[i] = Available[i];        }        for (int i = 0; i < threadCount; i++) {            Finish[i] = false;        }        int n = 0;        for (int i = 0; i < threadCount; i++) {            if (!Finish[i]) {                int count = 0;                for (int j = 0; j < resourceCount; j++) {                    if (Need[i][j] <= Work[j]) {                        count++;                    }                }                if (count == resourceCount) {                    for (int j = 0; j < resourceCount; j++) {                        Work[j] = Work[j] + Allocation[i][j];                    }                    thread[n++] = i + 1;                    Finish[i] = true;                    i = -1;                }            }        }        for (int i = 0; i < threadCount; i++) {            if (!Finish[i]) {                return false;            }        }        return true;    }    // 恢复各种信息    public void recover(int k) {        for (int i = 0; i < Request.length; i++) {            Available[i] = Available[i] + Request[i];            Allocation[k][i] = Allocation[k][i] - Request[i];            Need[k][i] = Need[k][i] + Request[i];        }    }

4、运行与测试

测试结果如下图所示。
程序开始运行时,首先对当前状态进行安全性检测,由图可以看出系统在初始状态时处于安全状态。当进程P2尝试申请资源,对资源进行试分配,运用safe算法检测出分配后系统仍处于安全状态,资源申请成功,输出安全序列。

将尝试申请资源的进程改为进程P1,申请的资源量不变,由下图可以看出,试分配后系统处于不安全状态,不予分配资源

这里写图片描述

因此,通过银行家算法实现了对当前系统下的安全性检测,并避免了死锁状况的发生,维护了系统安全。

代码下载地址:银行家算法

0 0
原创粉丝点击