银行家算法之安全性算法

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.2.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
P11053
P242
P392

安全序列: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

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页