银行家算法之安全性算法

时间:2022-10-22 10:14:51

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和Finish STEP2:找到一个满足条件进程Pi STEP3:执行进程Pi,释放资源 STEP4:all Finish[i]=true Output:securable... 结束 Output:not securable yes no yes no

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

银行家算法之安全性算法

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