1. 程式人生 > >銀行家演算法實現

銀行家演算法實現

#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++下執行成功。