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