📄 222.c
字号:
#include<iostream>
using namespace std;
#define False 0
#define True 1
int Allocation[5][3]={{0,1,0},{2,0,0},{3,0,2},{2,1,1},{0,0,2}};
int Max[5][3]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}};
int Need[5][3]={{7,4,3},{1,2,2},{6,0,0},{0,1,1},{4,3,1}};
int Available[3]={3,3,2};
bool safe=true;//全局safe变量来观察整个变化过程中系统的安全性
int request[3]={0,0,0};
int Rp=0;//某时刻发出请求的进程号
int safeArray[5]={0};
int work[3]={0};
void getRequest(){
cout<<"请输入进程号和请求资源的数目"<<endl;
cout<<"如:进程号 资源数A B C"<<endl;
cout<<" 0 2 0 2"<<endl;
cin>>Rp;
cin>>request[0];
cin>>request[1];
cin>>request[2];
cout<<"进程号"<<Rp<<endl;
cout<<"请求资源为"
<<request[0]
<<" "
<<request[1]
<<" "
<<request[2]
<<endl;
}
//back函数用来进行回滚,当检查到请求会造成系统不安全时对改变的所有资源的值进行回滚
void back(){
int i=0;
do{
Need[Rp][i]+=request[i];
Available[i]+=request[i];
Allocation[Rp][i]-=request[i];
i++;
}while(i<3);
}
void Getneed(){
for(int i=0;i<2;i++){
Need[Rp][i]-=request[i];
Available[i]-=request[i];
Allocation[Rp][i]+=request[i];
}
cout<<"各进程还需要的资源为:"<<endl;
for(int t=0;t<5;t++){
cout<<t<<":"
<<Need[t][0]<<" "
<<Need[t][1]<<" "
<<Need[t][2]<<endl;
}
cout<<"Available:"
<<Available[0]
<<" "
<<Available[1]
<<" "
<<Available[2]
<<endl;
}
//安全算法
void IsSafe(int a1,int a2,int a3){
int work[3]={0};
work[0]=a1;
work[1]=a2;
work[2]=a3;
int finish[5]={False};
int sa=0,m=0;
do{
for(int z=0;z<5;z++){
if((finish[z]==False)
&&(Need[z][0]<=work[0])
&&(Need[z][1]<=work[1])
&&(Need[z][2]<=work[2])){
safeArray[sa]=z;
for(int o=0;o<3;o++){
work[o]+=Allocation[z][o];
}
finish[z]=1;
z=5;
}
}
sa++;
}while(sa<5);
if((finish[0]==1)
&&(finish[1]==1)
&&(finish[2]==1)
&&(finish[3]==1)
&&(finish[4]==1)){
safe=true;
}
else{
safe=false;
}
}
void RequestIsSafe(){
if((request[0]<=Need[Rp][0])
&&(request[1]<=Need[Rp][1])
&&(request[2]<=Need[Rp][2])
&&(request[0]<=Available[0])
&&(request[1]<=Available[1])
&&(request[2]<=Available[2])){
safe=true;
}else
safe=false;
}
//判断资源被请求后整个系统是不是能够到达安全状态
void isAllSafe(){
RequestIsSafe();
Getneed();
if(safe==true){
IsSafe(Available[0],Available[1],Available[2]);
}
if(safe==true){
cout<<"这样配置资源是安全的!"<<endl;
cout<<"安全序列是:";
for(int i=0;i<5;i++){
cout<<"--->"
<<safeArray[i];
}
cout<<endl;
}
else
{
back();
cout<<"不安全!!"<<endl;
}
}
void main(){
do{
char yes='y';
getRequest();
isAllSafe();
if(safe==false)
break;
cout<<"有进程发出Request请求吗?<ENTER y or n>";
cin>>yes;
if(yes=='n')
break;
}while(true);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -