银行家算法

算法思路:

  1. 当用户申请一个资源的时候, 判断把资源分配出去以后系统是否还处于安全的状态, 如果系统还处于安全的状态,那么就把这些资源分配出去, 否则就不分配出去。
  2. 检查系统是否处于安全状态的算法:

1】定义若干的数据结构,

typeNumber 资源种类数

numProcess 进程数

available 是一个长度为typeNumber的向量,表示每一类资源的可用数量

int ** allocation 是一个numProcess * typeNumber的二维矩阵,它表示当前分配给每个进程的资源数, 比如allocation[i][j] = k 表示当前进程 pi  分配到j类资源的数目是K

int  ** Max 是一个numProcess * typeNumber的二维矩阵,它表示进程对某个资源的最大需求。 比如 Max[i][j] = k 表示 进程 pi 对j类资源的最大需求是K

int ** need 是一个numProcess * typeNumber的二维矩阵, 它表示某个进程对某个资源的还需要多少。 比如 need[i][j] = k 表示进程 pi 对j类资源还需要 k 才可以执行完。

int * path  是一个长度为numProcess + 10 的一维向量, 它储存安全序列。

2】安全序列算法思路:

1)令 Work 和 finish分别表示长度为typeNumber , numProcess 的向量,并初始化 Work: = available  finish[i]: = false (i = 0,1, 2,......numProcess )

2)搜索满足 finish[i] = false 且 needi  <= work 的 i值 (实际就是查找可以分配资源的进程 pi),如果找到这样的i就转到以下步骤3),否则就转到步骤四

 

  1. 修改数值:finish[i]  = true Work: = Work + allocationi (进程pi所释放的各类资源) ,继续转向步骤2)
  2. 检查所有的 i ,判断 finish[i]是否都是 true ,如果是的话,那么系统处于安全的状态, 否则就不是处于安全的状态。

 

#include<iostream>
#include<cstdio>
using namespace std;


int typeNumber;//资源种类数
int numProcess;//进程个数

int **allocation;//分配矩阵
int **Max;//最大需求矩阵
int **need;//尚且需要分配的资源矩阵
int * available;//可利用资源一维数组
int *path;//储存安全路径
int len = 0;//记录安全路径长度
void initMatrix(const int & row, const int & n){//初始化二维矩阵的行数和列数
	
	//初始化二维矩阵的维数
	allocation = new int*[row];
	Max = new int*[row];
	need = new int*[row];

	//初始化二维矩阵的列数
	for(int i = 0; i < row; i++){
		allocation[i] = new int[n];
		Max[i] = new int[n];
		need[i] = new int[n];
	}

}

//检查进程pId对各类资源的需求量是否小于等于当前各类资源可使用量
bool checkNeed(int pId, int * Work){
	for(int i = 0; i < typeNumber; i++){
		if(need[pId][i] > Work[i])//进程<pId>对i类资源的需求量大于可使用量
			return  false;
	}
	return true;

}

bool isSafe(){//检查是否有安全序列
	int * Work = new int[typeNumber];//记录当前每类资源的可利用数量,长度等于资源个数
	bool * finish = new bool[numProcess];//长度等于进程数目

	for(int i = 0; i < typeNumber; i++)
		Work[i] = available[i];//初始为available 数组
	for(int i = 0; i < numProcess; i++)//初始为false,false表示进程i没有分配好资源
		finish[i] = false;

	int i;
	for(i = 0; i < numProcess; ){//扫描每个进程
		if(finish[i] == false && checkNeed(i, Work)){//如果这个进程没有分配资源且当前可分配资源
			for(int k = 0; k < typeNumber; k++)
				Work[k] += allocation[i][k];//释放进程pi的各类资源
			finish[i] = true;//标记进程pi可以执行,加入了安全序列
			path[len++] = i;//加入安全序列
			
			i = 0;//继续从头开始找
		}
		else 
			i++;//找下一个是否满足
	}


	for(int i = 0; i < numProcess; i++){
		if(finish[i] == false)
			return false;//有进程不能执行,不存在安全序列
	}

	return true;//所有进程可安全执行 


}

void output(){//输出安全路径
	for(int i = 0; i < len; i++){
		printf("p%d ", path[i]);
	}
	cout<<endl;

}


int main()
{

	printf("输入系统资源的种类数\n");
	scanf("%d", &typeNumber);

	available = new int[typeNumber];//记录每类资源的可用数

	printf("请输入每个资源的初始数\n");

	for(int i = 0; i < typeNumber; i++){
		printf("请输入资源 %c 的初始数量: ", 'A' + i);
		int temp;
		scanf("%d", &temp);
		available[i] = temp;
	}


	printf("输入内存中的进程数\n");
	scanf("%d", &numProcess);

	path = new int[numProcess + 10];//储存安全路径的数组

	initMatrix(numProcess, typeNumber);//初始化Max,allocation, need矩阵

	printf("请输入已分配资源矩阵 \n");

	for(int i = 0; i < numProcess; i++){
		int resource;//已分配的资源数目
		for(int j = 0; j < typeNumber; j++)
		{
			printf("请输入分配给进程 p%d 的 %c 种资源数目: ", i, 'A' + j);
			scanf("%d", &resource);
			allocation[i][j] = resource;//将resource个资源分配给进程i
			available[j] -= resource;//分配之后j类可用资源减少resource
			
		}

	}

	printf("请输入最大需求矩阵\n");

	for(int i = 0; i < numProcess; i++){
		int maxDemand;
		for(int j = 0; j < typeNumber; j++)
		{
			printf("请输入分配给进程 p%d 的 %c 种资源最大需求: ", i, 'A' + j);
			scanf("%d", &maxDemand);//输入最大需求
			Max[i][j] = maxDemand;//初始化进程pi对j类资源最大需求
			need[i][j] = Max[i][j] - allocation[i][j];//求进程pi对j类资源尚需多少
		}

	}

	
	if(isSafe()){//判序列断是否存在安全
		cout<<"存在安全的序列: ";
		output();//输出安全路径
	}
	else 
		cout<<"不存在安全序列"<<endl;


	system("pause");

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值