操作系统之银行家算法

简介

银行家算法是避免死锁的一种重要方法,本程序用java编程语言对其进行了实现。
源代码移步:http://download.csdn.net/download/chengshijian2015/10215467

银行家算法原理

当用户申请一组资源时,系统必须做出判断,如果把这些资源分出去,系统是否还处于安全状态。
若是,就可以分出这些资源;否则,该申请暂不予满足。
1.数据结构
假设有M个进程N类资源,则有如下数据结构:
MAX[M*N] M个进程对N类资源的最大需求量
AVAILABLE[N] 系统可用资源数
ALLOCATION[M*N] M个进程已经得到N类资源的资源量
NEED[M*N] M个进程还需要N类资源的资源量
2.银行家算法
设进程I提出请求Request[N],则银行家算法按如下规则进行判断。
(1)如果Request[N]<=NEED[I,N],则转(2);否则,出错。
(2)如果Request[N]<=AVAILABLE,则转(3);否则,出错。
(3)系统试探分配资源,修改相关数据:
AVAILABLE=AVAILABLE-REQUEST
ALLOCATION=ALLOCATION+REQUEST
NEED=NEED-REQUEST
(4)系统执行安全性检查,如安全,则分配成立;否则试探险性分配作废,系统恢复原状,进程等待。
3.安全性检查
(1)设置两个工作向量WORK=AVAILABLE;FINISH[M]=FALSE
(2)从进程集合中找到一个满足下述条件的进程,
FINISH[i]=FALSE
NEED<=WORK
如找到,执行(3);否则,执行(4)
(3)设进程获得资源,可顺利执行,直至完成,从而释放资源。
WORK=WORK+ALLOCATION
FINISH=TRUE
GO TO 2
(4)如所有的进程Finish[M]=true,则表示安全;否则系统不安全。

java源码

BankerAlgorithm.java:

package bankersalgorithm;

import java.util.Scanner;

public class BankerAlgorithm {

    // 银行家算法

    /**
     * 
     * 4个线程,3个资源
     * 
     * @param args
     */
    public static void main(String[] args) {

        // 1.设计进程对各类资源最大申请表示及初值确定。
        // 2.设定系统提供资源初始状况。
        // 3.设定每次某个进程对各类资源的申请表示。
        // 4.编制程序,依据银行家算法,决定其申请是否得到满足。

        new BankerAlgorithmPresenter().execute(new OnExcuteListener() {

            @Override
            public int onStartInputData() {
                Scanner scanner = new Scanner(System.in);
                System.out.print("请输入进程序号(0-3)>");
                return scanner.nextInt();
            }

            @Override
            public void onError() {
                // TODO Auto-generated method stub
                System.out.println("请求资源数大于需要的资源数,出错!");
            }

            @Override
            public void onSuccess(boolean isSafeState) {
                // TODO Auto-generated method stub
                if (isSafeState) {
                    System.out.println("系统处于安全状态!");
                } else {
                    System.out.println("系统处于不安全状态!");
                }
            }

            @Override
            public void onWait(int threadId) {
                // TODO Auto-generated method stub
                System.out.println("进程" + threadId + "等待...");
            }
        });
    }
}

BankerAlgorithmPresenter.java:

package bankersalgorithm;

public class BankerAlgorithmPresenter {
    private boolean isError = false;// 是否出错
    private boolean isWait = false;// 是否处于等待状态
    private boolean isSafeState = true;// 是否安全状态
    private int threadId;// 进程序号
    private boolean isNeedLargerThanWork = false;//资源需求量是否大于work数量
    private Data data;
    private int [][]REQUEST;
    private int []AVAILABLE;
    private int [][]NEED;
    private int [][]MAX;
    private int[][]ALLOCATION;

    boolean[] isFinished = { false, false, false, false };// 为4个进程初始化完成情况为false

    public BankerAlgorithmPresenter() {
        super();
        // TODO Auto-generated constructor stub
        data=new Data();
        REQUEST=data.getREQUEST();
        AVAILABLE=data.getAVAILABLE();
        NEED=data.getNEED();
        MAX=data.getMAX();
        ALLOCATION=data.getALLOCATION();
    }

    public void setThreadId(int threadId) {
        this.threadId=threadId;
    }

    //检查是否出错
    private void checkIsError() {
        for (int i = 0; i < 3; i++) {
            if (REQUEST[threadId][i] > NEED[threadId][i]) {
                isError = true;
                break;
            }
        }
    }

    //检查是否出错
    private void checkIsWait() {
        for (int i = 0; i < 3; i++) {
            if (REQUEST[threadId][i] > AVAILABLE[i]) {
                isWait = true;
                break;
            }
        }
    }

    //安全性算法中更新数据结构
    private void update(int i,int WORK[]) {
        if (!isNeedLargerThanWork) {
            isFinished[i] = true;
            for (int k = 0; k < 3; k++) {
                WORK[k] += ALLOCATION[i][k];
            }
        } else {
            isNeedLargerThanWork = false;
        }
    }

    //安全性算法中查找满足条件的值
    private void serach(int i,int []WORK) {
        if (!isFinished[i]) {
            for (int j = 0; j < 3; j++) {// 资源数
                if (NEED[i][j] > WORK[j]) {
                    isNeedLargerThanWork = true;
                    break;
                }
            }
        }
    }

    //查找是否有isFinished=falsed的情况发生
    private void checkIsFinished() {
        for (int i = 0; i < 4; i++) {
            if (!isFinished[i]) {
                isSafeState = false;
                break;
            }
        }
    }

    //安全性算法
    private void safe() {
        // 系统执行安全性算法
        int[] WORK = AVAILABLE;
        // 开始查找满足条件的进程资源分配情况
        // 并改变数据结构中的值
        for (int i = 0; i < 4; i++) {// 进程数
            serach(i, WORK);
            update(i, WORK);
        }
    }

    //执行安全性算法
    private void excuteSafeAlgorithm() {
        safe();
        checkIsFinished();
    }

    //更改数据结构
    private void allocate() {
        for (int i = 0; i < 3; i++) {
            AVAILABLE[i] -= REQUEST[threadId][i];
            ALLOCATION[threadId][i] += REQUEST[threadId][i];
            NEED[threadId][i] -= REQUEST[threadId][i];
        }
    }

    //执行
    public void execute(OnExcuteListener listener) {
        threadId=listener.onStartInputData();
        checkIsError();
        if (!isError) {
            checkIsWait();
            if (!isWait) {
                allocate();
                excuteSafeAlgorithm();
                listener.onSuccess(isSafeState);
            } else {
                listener.onWait(threadId);
            }
        } else {
            listener.onError();
        }
    }
}

Data.java:

package bankersalgorithm;

public class Data {

    int[][] MAX = { 
            { 3, 2, 2 },
            { 6, 1, 3 }, 
            { 3, 1, 4 }, 
            { 4, 2, 2 }
        };// M个进程对N类资源的最大需求量

    int[] AVAILABLE = { 2, 1, 2 };// 系统可用资源数

    int[][] ALLOCATION = { 
            { 1, 0, 0 }, 
            { 2, 1, 1 }, 
            { 2, 1, 1 }, 
            { 0, 0, 2 } 
        };// M个进程已经得到N类资源的资源量

    int[][] NEED = { 
            { 2, 1, 1 },
            { 3, 1, 2 },
            { 1, 0, 3 }, 
            { 4, 2, 0 } 
        };// M个进程还需要N类资源的资源量

    int[][] REQUEST = {
            { 1, 0, 1 }, 
            { 3, 0, 1 },
            { 3, 1, 1 }, 
            { 1, 0, 0 } 
        };// M个进程还需要N类资源的资源量

    public int[][] getMAX() {
        return MAX;
    }

    public void setMAX(int[][] mAX) {
        MAX = mAX;
    }

    public int[] getAVAILABLE() {
        return AVAILABLE;
    }

    public void setAVAILABLE(int[] aVAILABLE) {
        AVAILABLE = aVAILABLE;
    }

    public int[][] getALLOCATION() {
        return ALLOCATION;
    }

    public void setALLOCATION(int[][] aLLOCATION) {
        ALLOCATION = aLLOCATION;
    }

    public int[][] getNEED() {
        return NEED;
    }

    public void setNEED(int[][] nEED) {
        NEED = nEED;
    }

    public int[][] getREQUEST() {
        return REQUEST;
    }

    public void setREQUEST(int[][] rEQUEST) {
        REQUEST = rEQUEST;
    }
}

OnExcuteListener.java:

package bankersalgorithm;

public interface OnExcuteListener {
    int onStartInputData();
    void onError();
    void onSuccess(boolean isSafeState);
    void onWait(int threadId);
}  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
设计一个n个并发进程共享m个系统资源的程序以实现银行家算法。要求: 1) 简单的选择界面; 2) 能显示当前系统资源的占用和剩余情况。 3) 为进程分配资源,如果进程要求的资源大于系统剩余的资源,不与分配并且提示分配不成功; 4) 撤销作业,释放资源。 编写和调试一个系统动态分配资源的简单模拟程序,观察死锁产生的条件,并采用适当的算法,有效地防止和避免死锁的发生。 银行家算法分配资源的原则是:系统掌握每个进程对资源的最大需求量,当进程要求申请资源时,系统就测试该进程尚需资源的最大量,如果系统中现存的资源数大于或等于该进程尚需求资源最大量时,就满足进程的当前申请。这样就可以保证至少有一个进程可能得到全部资源而执行到结束,然后归还它所占有的全部资源供其它进程使用。 银行家算法中的数据结构 (1)可利用资源向量Available(一维数组) 是一个含有m个元素,其中的每一个元素代表一类可利用的资源数目,其初值是系统中所配置的该类全部可用资源数目。如果Available[j]=k, 表示系统中现有Rj类资源k个。 (2)最大需求矩阵Max(二维数组) m的矩阵,它定义了系统中n个进程中的每一个进程对m类资源的最大需求。如果Max(i,j)=k, 表示进程i需要Rj类资源的最大数目为k。 (3)分配矩阵Allocation(二维数组) m的矩阵,它定义了系统中每一类资源当前已分配给每一进程的资源数。如果Allocation(i,j)=k, 表示进程i当前已分得Rj类资源k个。 (4)需求矩阵Need (二维数组) 是一个含有n*m的矩阵,用以表示每一个进程尚需的各类资源数。如果Need(i,j)=k, 表示进程i还需要Rj类资源k个,方能完成其任务。 Need(i,j)= Max(i,j)-Allocation(i,j)

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值