银行家算法之安全性算法

1. 安全性算法过程描述

(1) 设置两个向量:① 工作向量Work:它表示系统可提供给进程继续运行所需的各类资源数量的多少,它含有m个元素,在执行安全算法开始时,Work = Available;② Finish:它表示系统是否有足够的资源分配给进程,使之运行完成。开始时先做Finish[i]= false;当有足够资源分配给进程时, 再令Finish[i]= true。

(2) 从进程集合中找到一个能满足下述条件的进程:
① Finish[i]= false; ② Need[i,j]≤ Work[j];
如果找到,那么,执行步骤(3);否则,执行步骤(4)。

(3) 当进程Pi获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行:

 Work[j]= Work[i]+Allocation[i,j]; 
 Finish[i]= true;
 go to step 2; 

(4) 如果所有进程的Finish[i]= true都满足, 则表示系统处于安全状态;否则,系统处于不安全状态。

2. 流程图

Created with Raphaël 2.1.0开始STEP1:设置工作向量Work和FinishSTEP2:找到一个满足条件进程PiSTEP3:执行进程Pi,释放资源STEP4:all Finish[i]=trueOutput:securable...结束Output:not securableyesnoyesno

3. 例子

  如果当前资源分配如下表:

进程 最大需求Max 已分配Allocation 可用Available
P1 10 5 3
P2 4 2
P3 9 2

  安全序列:P2->P1->P3

4. 代码实现

/**
 * Copyright ? 2016 Authors. All rights reserved.
 *
 * FileName: bankSecurable.cpp
 * Author: Wu_Being <1040003585@qq.com>
 * Date/Time: 09-10-16 00:39
 * Description: 银行家算法之安全性检查子算法 
 */
#include <iostream>
#define N 3         //进程数目 
#define M 1         //资源类数(为了好理解,这里令资源种类设为1种) 

using namespace std;

int Available[M];       //空闲资源向量Available
int Max[N][M];          //最大需求矩阵Max
int Allocation[N][M];   //分配矩阵Allocation
int Need[N][M];         //需求矩阵Need

bool bankSecurable(int allocation[N][M],int available[M]){

STEP1:  
    int finish[N];
    int work[M];
    int i=0;            //第i个进程 
    int j=0;            //第j个资源 

    for( i=0;i<N;i++){
        finish[i]=false;
    }   
    for( j=0;j<M;j++){
        work[j]=available[j];
    }   

STEP2:
    //for( j=0;j<M;j++)//(资源类数>1)
    for( i=0;i<N;i++){
        if(finish[i]==false&&Need[i][0]<=work[0]){//[i][j](资源类数>1)
            goto STEP3;
        }else{
            if(i==N-1){
            //从进程集合中找不到一个进程能满足条件时
                goto STEP4;
            }
        }
    }

STEP3:
    work[0]=work[0]+allocation[i][0];//[i][j](资源类数>1)
    //count[i]++(资源类数>1)
    //if count[i]==M(资源类数>1)
    finish[i]=true;
    //securable series[k]=i;
    goto STEP2;

STEP4:
    bool alltrue=true;
    for( i=0;i<N;i++){
        if(finish[i]==false){
            alltrue=false;
            break;
        }
    }

    return alltrue;
}

int main(int argc,char* argv[])
{
    /* 1、初始化*/
    Available[0]=3;
    Max[0][0]=10;Max[0][1]=4;Max[0][2]=9;
    Allocation[0][0]=5;Allocation[0][1]=2;Allocation[0][2]=2;
    for(int i=0;i<N;i++){
        for(int j=0;j<M;j++){
            Need[i][j]=Max[i][j]-Allocation[i][j];
        }
    }       

    /* 2、安全性检查*/
    bool secure=bankSecurable(Allocation,Available);

    /* 3、结果输出*/
    if(secure)cout<<"is securable..."<<endl;
    else cout<<"is not securable!!!"<<endl;

    return 0;
}

5. 运行截图

银行家算法之安全性算法

Wu_Being博客声明:本人博客欢迎转载,请标明博客原文和原链接!谢谢!
《银行家算法——安全性检查子算法》:
http://blog.csdn.net/u014134180/article/details/52762186

银行家算法之安全性算法

如果你看完这篇博文,觉得对你有帮助,并且愿意付赞助费,那么我会更有动力写下去。

上一篇:Enterprise Library Step By Step系列(一):配置应用程序块——入门篇


下一篇:layim的websocket消息撤回功能实现