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