#include <iostream>
using namespace std;
#define N 4 //定义进程数
#define M 3 //定义资源数
#define False 0
#define True 1
//———————————— 初始化资源分配表 ——————————————
int Max[N][M]={{5,2,5},{6,5,3},{3,1,6},{4,7,2}}; //各进程所需最大资源数
int Allocation[N][M]={{1,0,0},{5,1,1},{2,1,1},{0,0,2}}; //系统已分配资源
int Need[N][M]={{2,2,2},{1,0,2},{1,0,3},{4,2,0}}; //还需资源
int Available[M]={1,1,2}; //系统可用资源
int Request[M]; //请求分配的资源序列
//————————————— 所 用 函 数 ———————————————
void showdata();//显示资源状况
int request(int i);//资源分配算法
int safe();//安全性算法
int free(int i);//资源释放
//+++++++++++++++ 输出资源状况 +++++++++++++++
void showdata()
{ int i,j;
cout<<"+++++++++++++++++++++++++++++++"<<endl;
cout<<"+++++ 资源分配情况 +++++"<<endl;
cout<<"+++++++++++++++++++++++++++++++"<<endl;
//输出可用资源
cout<<"系统可用资源(Available):\n";//按 <R1,R2,R3>罗列各类资源
cout<<" <";
for(j=0;j<M;j++)
{cout<<"R"<<j+1;
if(j<M-1)cout<<",";
}
cout<<">:";
for (j=0;j<M;j++)
{cout<<Available[j]<<" ";
}
cout<<endl<<endl;
//输出所需资源
cout<<"各进程资源最大需求(Max):\n";
cout<<" <R1 R2 R3>\n";
for (i=0;i<N;i++) //扫描各进程
{cout<<" pr"<<i<<":";
for (j=0;j<M;j++) //各类资源最大需求
{cout<<Max[i][j]<<" ";
}
cout<<endl;
}
cout<<endl;
//输出所获得的资源情况
cout<<"各进程当前获得资源(Allocation):\n";
cout<<" <R1 R2 R3>\n";
for (i=0;i<N;i++)
{cout<<" pr"<<i<<":";
for(j=0;j<M;j++)//输出当前已分配资源数
{cout<<Allocation[i][j]<<" ";
}
cout<<endl;
}
cout<<endl;
//输出仍需资源情况
cout<<"各进程仍需资源(Need):\n";
cout<<" <R1 R2 R3>\n";
for (i=0;i<N;i++)
{cout<<" pr"<<i<<":";
for(j=0;j<M;j++)//输出还需要资源数
{cout<<Need[i][j]<<" ";
}
cout<<endl;
}
cout<<"================================="<<endl;
cout<<"================================="<<endl;
}
//+++++++++++++++++++ 资 源 分 配 算 法 +++++++++++++++++++++++
int request(int i)//为进程pr[i]进行资源分配
{
int j,flag;
for (j=0;j<M;j++)
{
if(Request[j]>Need[i][j])
{
cout<<"对不起,申请的资源大于它需要的资源数,请重试!";
return -1; break;
}
if(Request[j]>Available[j])
{
cout<<"对不起,当前系统可用资源不够,请等待!";
return -1; break;
}
}
for (j=0;j<M;j++)
{
Available[j]=Available[j]-Request[j]; //可用资源减少
Allocation[i][j]=Allocation[i][j]+Request[j];//所得资源增加
Need[i][j]=Need[i][j]-Request[j]; //仍需资源减少
}
flag=safe();
if(flag<0)
{
cout<<"分配不成功,请等待!";
for (j=0;j<M;j++)//把资源恢复成分配之前的状态
{
Available[j]=Available[j]+Request[j];
Allocation[i][j]=Allocation[i][j]-Request[j];
Need[i][j]=Need[i][j]+Request[j];
}
}
return 0;
}
//+++++++++++++++++++++++ 安 全 性 算 法 +++++++++++++++++++++++++
int safe()
{
int Finish[N]={False};
int Work[M],temp[N];
int i,j,k,z=0,flag;
for(j=0;j<M;j++)
Work[j]=Available[j]; //工作分配初始化为系统可用资源
for(i=0;i<N;i++) //扫描所有进程
{
flag=0; //标记
for(j=0;j<M;j++)//扫描各类资源
{
if(Finish[i]==False && Need[i][j]<=Work[j])//R[j]类资源满足
{
flag++; //统计得到满足的资源类总数
if(flag==M) //进程Pr[i]各类全部得到满足
{
for(k=0;k<M;k++)
Work[k]+=Allocation[i][k];//工作分配加上可用资源
Finish[i]=True; //将进程pr[i]写入安全序列中
temp[z]=i; z++; //序列生成
i=-1; //为下一次进程全扫描作准备
}
}
else break;
}
if(Finish[i]==False && i==N-1)//全扫描至最后一个进程仍未分配
{
cout<<"系统不安全!!!\n";//如果不成功,输出系统不安全
return -1;
break;
}
else if(Finish[i]==True && i==N-1) break;//进程全部分配成功
}
cout<<"系统资源分配成功!"<<endl; //如果安全,输出成功
cout<<"安全序列:";
for(z=0;z<N;z++) //输出安全序列
cout<<"pr"<<temp[z]<<" ";
cout<<endl;
return 0;
}
//+++++++++++++++++++ 资 源 释 放 +++++++++++++++++++++
int free(int i)
{
int j;
for(j=0;j<M;j++)
{
Available[j]+=Allocation[i][j]; //系统可用资源增加
Allocation[i][j]=0; //进程所获资源置0
}
return 1;
}
//++++++++++++++++++++ 主函数+++++++++++++++++++++++
int main()
{
int choice; //用户选择
showdata(); //显示资源状况
safe(); //进行安全性检查
while(1)
{
cout<<endl;
cout<<"************************************"<<endl;
cout<<"** 1:分配资源 2:释放资源 **"<<endl;
cout<<"** 3:显示资源 4:离 开 **"<<endl;
cout<<"************************************"<<endl;
cout<<"输入要进行的操作:";
cin>>choice;
if(choice==1)//分配资源
{
int i;
cout<<"请输入您要分配的进程号(0,1,2,3):";
cin>>i;
cout<<"请输入您要为该进程分配的资源<R1,R2,R3>:";
for(int j=0;j<M;j++) cin>>Request[j];
request(i);
}
else if(choice==2)//释放资源
{
int i;
cout<<"请输入您要释放资源的进程号(0,1,2,3):";
cin>>i;
free(i);
}
else if(choice==3)//显示资源
{
showdata();
}
else if(choice==4) break; //离 开
else cout<<"请输入合法数字!";
}
}