银行家算法

2014-06-15 veryyoung 更多博文 » 博客 » GitHub »

原文链接 http://veryyoung.me/blog/2014/06/15/bankers-algorithm.html
注:以下为加速网络访问所做的原文缓存,经过重新格式化,可能存在格式方面的问题,或偶有遗漏信息,请以原文为准。


一.实验名称:银行家算法

二.实验目的: 银行家算法是避免死锁的一种重要方法,通过编写 一个简单的银行家算法程序,加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。

三.实验原理说明:

银行家算法是一种最有代表性的避免死锁的算法。在避免死锁方法中允许进程动态地申请资源,但系统在进行资源分配之前,应先计算此次分配资源的安全性,若分配不会导致系统进入不安全状态,则分配,否则等待。

   银行家算法是由操作系统执行,每当一个进程请求资源。算法由拒绝或延期的请求,如果它确定接受该请求可以把系统处于不安全状态(即一个可能发生死锁)来避免死锁。当一个新进程进入一个系统,它必须声明它可能曾经声称每个资源类型的实例的最大数目;显然,该数不得超过资源的系统中的总数。此外,当一个进程都有要求所有资源必须在有限时间内归还。

   对于银行家算法的工作,需要知道以下三件事情: 1. 每个线程有可能请求多少资源?    2. 每个线程目前持有多少资源?    3. 对于每种资源,系统持有多少?        仅当满足以下条件时,资源可用被分配给一个线程:    要求≤最大,因为过程已经越过了它提出的最大要求设定其他错误条件。    要求≤可用,否则进程等待,直到资源可用。     四:算法流程图:

五:算法实现 实验环境:Ubuntu14.04 Java8 IntelliJ IDEA13

代码如下:

package me.veryyoung.banker;

/**
 * Created by veryyoung on 14-6-15.
 */

import javax.swing.JOptionPane;

public class Main {
    /**五:算法实现

     * @param args the command line arguments
     */
    public static void main(String[] args) {
        int n = Integer.parseInt(JOptionPane.showInputDialog("Number Of Process:"));
        int m = Integer.parseInt(JOptionPane.showInputDialog("Resource Type Number:"));

        int available[] = new int[m];
        int max[][] = new int[n][m];
        int allocation[][] = new int[n][m];
        int need[][] = new int[n][m];
        String sequence = "";

        for (int i = 0; i < m; i++) {
            available[i] = Integer.parseInt(JOptionPane.showInputDialog("Number Of Available Resource " + (i) + ":"));
        }

        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                allocation[i][j] = Integer.parseInt(JOptionPane.showInputDialog("Allocation P " + (i) + " for R " + (j) + ":"));

            }
        }
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {

                max[i][j] = Integer.parseInt(JOptionPane.showInputDialog("MAX P " + (i) + " for R " + (j) + ":"));
                need[i][j] = max[i][j] - allocation[i][j];
            }
        }
        int work[] = available;
        boolean finish[] = new boolean[n];

        for (int i = 0; i < n; i++) {
            finish[i] = false;
        }

        boolean check = true;
        while (check) {
            check = false;
            for (int i = 0; i < n; i++) {
                if (!finish[i]) {
                    int j;
                    for (j = 0; j < m; j++) {
                        if (need[i][j] > work[j]) {
                            break;
                        }
                    }

                    if (j == m) {
                        for (j = 0; j < m; j++) {
                            work[j] = work[j] + allocation[i][j];
                        }
                        finish[i] = true;
                        check = true;
                        sequence += i + ", ";
                    }
                }
            }
        }

        int i;
        for (i = 0; i < n; i++) {
            if (!finish[i])
                break;
        }

        if (i == n) {
            JOptionPane.showMessageDialog(null, "SAFE And Sequence is:" + sequence);
        } else {
            JOptionPane.showMessageDialog(null, "DEAD LOCK");
        }
    }
}

六:实验总结

经过几天的操作系统课程设计,我学习到了很多东西。这次课程设计的内容是银行家算法,我用的编程工具是Linux系统下的IntelliJ IDEA13,语言使用的是JAVA8语言,目的是模拟实现处理机避免死锁;通过模拟实现算法,我更进一步地学习了JAVA语言,这使我的编程能力得到了提高。当然最重要的是我更深地理解了对于死锁的避免,死锁是会影响并发执行的,是操作系统最需要解决得问题。解决死锁,我们要检测一个安全状态,虽然并非所有的不安全状态都会产生死锁状态,但系统进入不安全状态时,便可能进而进入死锁状态后,当系统在进行资源管理时,如果对进城申请的资源分配不当,可能会使系统进入死锁状态,因而后面到来的进程也无法顺利执行。银行家算法中,要对当前申请资源的进程申请资源的数目进行判断,如果可以试分配,则试求出一个安全序列,如果可以求出,则说明给这个进程分配资源后系统不会进入不安全状态,将该进程申请的资源分配给他,若求不出安全序列,则说明将资源分配给该进程后系统会进入不安全状态,所以就使该进程进入阻塞状态,等待以后可以分配资源时再执行该进程,然后系统继续服务其它进程。通过这样一个过程,可以有效避免系统进入死锁状态。反之,只要系统处于安全状态,系统便可避免进入死锁状态。因此,避免死锁的实质在于——如何使系统不进入不安全状态。。