用户注册



邮箱:

密码:

用户登录


邮箱:

密码:
记住登录一个月忘记密码?

发表随想


还能输入:200字
云代码 - java代码库

操作系统课程实验二 死锁的避免—银行家算法

2012-09-03 作者: 神马举报

[java]代码库

import java.util.ArrayList;
import java.util.Scanner;
 
/**
 * @className Banker
 * @Description 实验二 死锁的避免――银行家算法
 * @date 2012-4-12
 */
public class Banker {
    int available[] = new int[] { 3, 3, 2 };// 可得到的资源
    int max[][] = new int[][] { { 7, 5, 3 }, { 3, 2, 2 }, { 9, 0, 2 },
            { 2, 2, 2 }, { 4, 3, 3 } };// 每个进程最大资源数
    int allocation[][] = new int[][] { { 0, 1, 0 }, { 2, 0, 0 }, { 3, 0, 2 },
            { 2, 1, 1 }, { 0, 0, 2 } };// 每个进程目前拥有的资源数
    int need[][] = new int[][] { { 7, 4, 3 }, { 1, 2, 2 }, { 6, 0, 0 },
            { 0, 1, 1 }, { 4, 3, 1 } };// 每个进程需要的资源数
    ArrayList<Integer> arrayList = new ArrayList<Integer>();
 
    private void showData()// 展示数据输出每个进程的相关数据
    {
        System.out.println("进程个数:5   资源个数:3");
 
        System.out.println("可用资源向量:");
        for (int i = 0; i < available.length; i++) {
            System.out.print(available[i] + "\t");
        }
 
        System.out.print("\n最大需求矩阵Max:\n");
        for (int i = 0; i < 5; i++) {
            for (int j = 0; j < 3; j++) {
                System.out.print(" " + max[i][j] + "\t");
            }
            System.out.println();
        }
        System.out.print("\n已分配矩阵Allocation:\n");
        for (int i = 0; i < 5; i++) {
            for (int j = 0; j < 3; j++) {
                System.out.print(" " + allocation[i][j] + "\t");
            }
            System.out.println();
        }
        System.out.print("\n需求矩阵Need:\n");
        for (int i = 0; i < 5; i++) {
            for (int j = 0; j < 3; j++) {
                System.out.print(" " + need[i][j] + "\t");
            }
            System.out.println();
 
        }
    }
 
    private boolean change(int inRequestNum, int inRequest[])// 分配数据
    {
        int requestNum = inRequestNum;
        int request[] = inRequest;
        // for(int i=0;i<3;i++)System.out.println("修改前available"+available[i]);
        if (!(request[0] <= need[requestNum][0]
                && request[1] <= need[requestNum][1] && request[2] <= need[requestNum][2])) {
            System.out.println("出错:申请的资源大于需求值");
            return false;
        }
        if ((request[0] <= available[0] && request[1] <= available[1] && request[2] <= available[2]) == false) {
            System.out.println("出错:无足够资源分配");
            return false;
        }
 
        System.out.println("开始执行银行家算法...");
        for (int i = 0; i < 3; i++)// 试分配数据给请求的线程
        {
            available[i] = available[i] - request[i];
            allocation[requestNum][i] = allocation[requestNum][i] + request[i];
            need[requestNum][i] = need[requestNum][i] - request[i];
        }
        System.out.println("试分配完成...\n");
        // for(int i=0;i<3;i++)System.out.println("修改后available"+available[i]);
        boolean flag = checkSafe(available[0], available[1], available[2]);// 进行安全性检查并返回是否安全
        // System.out.println("安全性检查后"+flag);
        if (flag == true) {
            System.out.print("找到一个安全序列:");
            System.out.print(arrayList);
            System.out.println("\n已通过安全性测试!\n");
            System.out.println("资源分配完成。");
 
            return true;
        } else// 不能通过安全性检查 恢复到未分配前的数据
        {
            System.out.println("不能够安全分配,正在恢复...");
            for (int i = 0; i < 3; i++) {
                available[i] = available[i] + request[i];
                allocation[requestNum][i] = allocation[requestNum][i]
                        - request[i];
                need[requestNum][i] = need[requestNum][i] + request[i];
            }
            System.out.println("恢复完成。");
            return false;
        }
    }
 
    private boolean checkSafe(int a, int b, int c)// 安全性检查
    {
        System.out.println("进入安全性测试!");
        arrayList.clear();// 先清空安全序列
        int work[] = new int[3];
        work[0] = a;
        work[1] = b;
        work[2] = c;
        int i = 0;
        boolean finish[] = new boolean[5];
        while (i < 5)// 寻找一个能够满足的认为完成后才去执行下一进程
        {
            if (finish[i] == false && need[i][0] <= work[0]
                    && need[i][1] <= work[1] && need[i][2] <= work[2]) {// 找到满足的修改work值,然后i=0,重新从开始的为分配的中寻找
                arrayList.add(i);
                for (int m = 0; m < 3; m++)
                    work[m] = work[m] + allocation[i][m];
                finish[i] = true;
                i = 0;
            } else
                // 如果没有找到直接i++
                i++;
        }
        for (i = 0; i < 5; i++)// 通过finish数组判断是否都可以分配
        {
            if (finish[i] == false)
                return false;
        }
        return true;
    }
 
    public static void main(String[] args) {
        Banker bank = new Banker();
        bank.showData();
        int request[] = new int[3];
        int requestNum;
        Scanner s;
        String choice = new String();
        while (true)// 循环进行分配
        {
            s = new Scanner(System.in);
            System.out.println("请输入要请求的进程号(0--4):");
            requestNum = s.nextInt();
            System.out.println("输入请求资源的数目:按照这样的格式输入x x x:");
            for (int i = 0; i < 3; i++) {
                request[i] = s.nextInt();
            }
 
            bank.change(requestNum, request);
 
            System.out.println("\n需要继续吗? (y-继续/n-终止)");
            choice = s.next();
            while (true) {
                if (choice.equalsIgnoreCase("n")) {
                    System.exit(1);
                } else if (choice.equalsIgnoreCase("y")) {
                    break;
                } else {
                    System.out.println("输入错误,请重试...");
                    System.out.println("\n需要继续吗? (y-继续/n-终止)");
                    choice = s.next();
                }
            }
        }
    }
}

[代码运行效果截图]


操作系统课程实验二 死锁的避免—银行家算法


网友评论    (发表评论)


发表评论:

评论须知:

  • 1、评论每次加2分,每天上限为30;
  • 2、请文明用语,共同创建干净的技术交流环境;
  • 3、若被发现提交非法信息,评论将会被删除,并且给予扣分处理,严重者给予封号处理;
  • 4、请勿发布广告信息或其他无关评论,否则将会删除评论并扣分,严重者给予封号处理。


扫码下载

加载中,请稍后...

输入口令后可复制整站源码

加载中,请稍后...