银行家算法实现

#include <iostream>
using namespace std; 
#define n 4 //进程数 
#define m 3//资源种类数 
typedef struct{
	int resource[m]; //不变 
	int avaliable[m];
	int claim[n][m];//不变 
	int alloc[n][m];
	int need[n][m];
	int flag[n];//=1完成 
}state;

void init(state *S){
	cout << "请输入resource向量:" << endl;
	for(int i = 0; i < m; i++){
		cin >> S->resource[i];
		S->avaliable[i] = S->resource[i];
	}
	cout << "请输入claim向量:" << endl; 
	for(int i = 0; i < n; i++)
		for(int j = 0; j < m; j++)
			cin >> S->claim[i][j];
		
	cout << "请输入alloc向量:" << endl; 
	for(int i = 0; i < n; i++)
		for(int j = 0; j < m; j++){
			cin >> S->alloc[i][j];
			S->avaliable[j] -= S->alloc[i][j];
		}		
	for(int i = 0; i < n; i++)
		for(int j = 0; j < m; j++)
			S->need[i][j] = S->claim[i][j] - S->alloc[i][j];
	for(int i = 0; i < n; i++)
		S->flag[i] = 0;
	
}

void print_state(state *S){
	cout << endl;
	cout << "************************当前状态*****************************" << endl;
	system("pause");
	int count = 0;
	for(int i = 0; i < n; i++){
		count = 0;
		if(S->flag[i] == 0){
			for(int j = 0; j < m; j++)
				count += S->need[i][j];
			if(count == 0){
				cout <<  i << " progress completed!!!" << endl;
				S->flag[i] = 1;
				for(int j = 0; j < m; j++){
					S->avaliable[j] += S->claim[i][j]; 
					S->claim[i][j] = 0;
					S->alloc[i][j] = 0;	
				}						
			}			
		}		
	}		
	cout << "claim vector:" << endl;
	for(int i = 0; i < n; i++){
		for(int j = 0; j < m; j++)
			cout << S->claim[i][j] << " ";	
		cout << endl;	
	}
	cout << "alloc vector:" << endl;
	for(int i = 0; i < n; i++){
		for(int j = 0; j < m; j++)
			cout << S->alloc[i][j] << " ";	
		cout << endl;	
	}
	cout << "need vector:" << endl;
	for(int i = 0; i < n; i++){
		for(int j = 0; j < m; j++)
			cout << S->need[i][j] << " ";	
		cout << endl;	
	}
	cout << "avaliable vector:" << endl;
	for(int i = 0; i < m; i++)
		cout << S->avaliable[i] << " ";	
	cout << endl;
	cout << "*************************************************************" << endl;	
}

bool safe(int p, int request[], state *S){
	int count = 0, finish[n] = {0}, complete = 0, no_find = 0, path[n], num = 0;
	state X;

	cout << "先给" << p << "进程分配要求的资源" << endl << endl;
	for(int i = 0; i < m; i++){//先分配 
		S->need[p][i] -= request[i];
		S->alloc[p][i] += request[i];
		S->avaliable[i] -= request[i];
	}

	cout << "开始执行safe算法...." << endl;
	X = *S;		
	//先判断p进程能否执行完 
	for(int j = 0; j < m; j++)
		count += S->need[p][j];//计算need向量
	if(count == 0){//可以结束
//		cout << "process" << p << "可以执行完毕" << endl; 
//		cout << "释放" << p << "进程资源..." << endl;
			for(int j = 0; j < m; j++){//release resource
				X.avaliable[j] += X.claim[p][j]; 
				X.claim[p][j] = 0;
				X.alloc[p][j] = 0;	
			}
	    finish[p] = 1; complete++;
//		cout << p << "process complete !!!!!!!!!" << endl;
		path[num++] = p;
		
	}								
	for(int k = 0; k < n; k++){//外层循环必须要 ,应该也能用while实现 
		for(int i = 0; i < n; i++){//从剩下没结束的进程里找可以执行的,只找1个,然后跳出内层循环 
			if(finish[i] == 0){//找到没有结束的 
				count = 0;
				for(int j = 0; j < m; j++)
					if(X.avaliable[j] >= X.need[i][j]) 
						count++;			
				if(count == 3){//这个没有结束的进程能利用现有资源执行完毕的  
//					cout << "找到" << i << "进程可以利用现有资源执行完毕" << endl; 
//					cout << "给" << i << "进程分配资源...."  << endl; 
					for(int j = 0; j < m; j++){
						X.avaliable[j] -= X.need[i][j];//分配资源 
						X.need[i][j] = 0;//更新need 
					}
//					cout << "分配资源后的avaliable向量:" << endl; 
					for(int x = 0; x < m; x++)
						cout << X.avaliable[x] << " ";	
					cout << endl;
//					cout << i << "process complete !!!!!!!!!" << endl;
					finish[i] = 1;complete++;path[num++] = i;
					
//					cout << "释放" << i << "进程资源..." << endl;
					for(int j = 0; j < m; j++){//release resource
						X.avaliable[j] += X.claim[i][j]; 
						X.claim[i][j] = 0;
						X.alloc[i][j] = 0;	
					}
//					cout << "释放资源后的avaliable向量:" << endl; 
//					for(int x = 0; x < m; x++)
//						cout << X.avaliable[x] << " ";
//					cout << endl;					
					break;//必须跳出 
				}
			}
		} 
	}
	if(complete == n){
		cout << endl << "完毕!" << endl << "yes! 安全状态,进程都能执行完毕" << endl;	
		cout << "安全序列为:" << endl;
		for(int i = 0; i < n; i++)
			cout << path[i] << " ";
		cout << endl;
		return true;
	} 
	else{
		cout << endl << "完毕!" << endl << "oh! no! 判断出不安全状态,进程不能都执行完毕" << endl;	
		return false;
	} 	
}

int resource_alloc(int p, int request[], state *S){
	for(int i = 0; i < m; i++){
		if(S->alloc[p][i] + request[i] > S->claim[p][i]){
			cout << "request + alloc > claim!!!  error!!!" << endl;
			return -1;//-1表示错误 
		}
		else if(request[i] > S->avaliable[i]){
			cout << "request > avaliable!!!  suspend process!!!" << endl;
			return -1;//
		}
	}
	if(safe(p, request, S)) return true;//表示状态安全,资源分配成功 
	else return false; //资源分配失败 
}

int main() {
	state S;
	int p = 0, temp;
	init(&S); 
	print_state(&S);	
	int request[m];
	while(1){
		cout << endl << "输入请求进程:" << endl;
		cin >> p;// 0 1 2 
		if(p == -1) return 0;
		cout << "输入请求资源向量:" << endl;
		for(int i = 0; i < m; i++)
			cin >> request[i];
		
		temp = resource_alloc(p, request, &S); 
		if(temp == true){
			cout << "resource alloc success!!!" << endl;
			print_state(&S);
		} 
		else if(temp == false){
			cout << "resource alloc denied!!!" << endl << "Initialize state...." << endl;
			for(int i = 0; i < m; i++){
				S.need[p][i] += request[i];
				S.alloc[p][i] -= request[i];
				S.avaliable[i] += request[i];
			}
			print_state(&S);//print updated state
		}		
	}
	return 0;
}

注:此程序在DEV C++下运行成功。

猜你喜欢

转载自blog.csdn.net/rakish_wind/article/details/84625448
今日推荐