#include<iostream>
using namespace std;
int need[10][10]; //需求矩阵
int available[10]; //可使用资源向量
int Max[10][10]; //最大需求矩阵
int allocation[10][10]; //分配矩阵
int all[10]; //各类资源总数
int work[10]; //工作向量
int finish[10]; //是否有足够的资源分配,状态标志
int request[10][10]; //进程申请资源向量
int rnum[10]; //记录安全序列
int n; //系统资源种类数
int m; //总的进程数
int w; //进程号
int t; //菜单选择
int i,l,j; //循环
bool safe();
void initialize(){ //初始化
cout<<"请输入资源种类数";
cin>>n;
cout<<"请输入资源总数:";
for(i=0;i<n;i++) cin>>all[i];
cout<<"请输入进程数:";
cin>>m;
for(i=0;i<m;i++){
cout<<"请输入第"<<i+1<<"个进程的最大需求量:";
for(l=0;l<n;l++) cin>>Max[i][l];
cout<<"请输入第"<<i+1<<"个进程的已分配数量:";
for(l=0;l<n;l++){
cin>>allocation[i][l];
all[l]-=allocation[i][l];
need[i][l]=Max[i][l]-allocation[i][l]; //进程需求数量
}
}
for(i=0;i<n;i++){
available[i]=all[i]; //此时系统可用资源数量
if(available[i]<0)
{
cout<<"错误,请重新输入"<<endl;
initialize();
}
}
}
void application(){ //申请资源
while(true){
cout<<"请输入需要申请资源的进程号:";
cin>>w;
for(i=0;i<n;i++)
{
cout<<"请输入第"<<i+1<<"进程申请资源数量:";
cin>>request[w][i];
}
for(i=0;i<n;i++)
{
if(request[w][i]<=need[w][i]&&request[w][i]<=available[i])
{
continue;
}
else {
cout<<"错误";
return;
}
}
cout<<"满足条件,可以进行资源分配";
for(i=0;i<n;i++)
{
allocation[w][i]+=request[w][i];
available[i]-=request[w][i];
need[w][i]-=request[w][i];
}
if (safe())
{
cout<<"同意分配"<<endl;
}
else
for(i=0;i<n;i++)
{
allocation[w][i]-=request[w][i];
available[i]+=request[w][i];
need[w][i]+=request[w][i];
}
break;
}
}
bool safe() { //安全检测
int a =0, b=0,c=0; //计数器
for(i=0;i<n;i++)
{
work[i]=available[i];
}
for (i = 0; i < m; i++)
{
finish[i] = 0;
}
while(c<m)
{
for (i = 0; i < m; i++)
{
if (finish[i] == 1) //如果这个进程安全则继续下一个循环
continue;
for (j = 0; j < n; j++)
if (need[i][j] > work[j])
break;
if (j == n)
{
finish[i] = 1;
for (l = 0; l < n; l++)
work[l] += allocation[i][l];
rnum[a++]=i;
b+=1;
}
else
continue;
}
if (b == 0)
{
cout << "系统是不安全的" << endl;
return false;
}
if(b == m) break;
c+=1;
}
cout << "系统是安全的" << endl;
cout<<"安全序列为";
for(i=0;i<m;i++)
cout<<rnum[i]<<" ";
return true;
}
void show(){
cout<<" 已分配资源 尚需要的资源 系统可用资源"<<endl;
for (i = 0; i < m; i++)
{
cout<<"进程"<<i+1<<" ";
for (l = 0; l < n; l++)
{
cout<<allocation[i][l]<<" ";
}
cout<<" ";
for (l = 0; l < n; l++)
{
cout<<" "<<need[i][l];
}
cout<<" ";
for (l = 0; l < n; l++)
{
cout<<" "<<available[l];
}
cout<<endl;
}
}
int menu(){
cout<<"1:初始化"<<endl;
cout<<"2:申请资源"<<endl;
cout<<"3:查看当前资源分配状态"<<endl;
cout<<"4:退出"<<endl;
cout<<"请输入:";
cin>>t;
return t;
}
int main(){
while(true){
switch(menu())
{
case 1 :
initialize();
break;
case 2 :
application();
break;
case 3:
show();
break;
case 4 :
return 0;
default:break;
}
}
}
测试