📄 yhjsf.cpp
字号:
#include "iostream"
using namespace std;
int M; //资源种类
int P; //进程数目
int flag;
struct process{ //虚拟PCB
char name[10]; //进程名
int *H; //已分配资源
int *N; //尚需资源
int *R; //申请资源
int finish;
};
void PRIN(process *PROCE,int *source,int M,int P){//y为第几次输出
cout<<"*******************************************************"<<endl;
cout<<"进程名 以分配设备 尚需设备 当前可用设备 "<<endl;
cout<<"设备编号 ";
for(int q=0;q<3;q++){
for(int I=0;I<M;I++)cout<<I<<" ";
cout<<" ";
}
cout<<endl;
int i;
int pp=0;
flag=0;
for(int e=0;e<P;e++){
if(PROCE[e].finish==0){
pp=1;//有进程得到满足,有输出
cout<<" ";
cout<<PROCE[e].name; cout<<" ";
for(i=0;i<M;i++)cout<<PROCE[e].H[i]<<" "; cout<<" ";
for(i=0;i<M;i++)cout<<PROCE[e].N[i]<<" "; cout<<" ";
if(flag==1)cout<<endl;
if(flag==0){for(i=0;i<M;i++)cout<<source[i]<<" ";flag=1;cout<<endl; }
}
}
if(pp==0){cout<<" ";
for(i=0;i<M;i++)cout<<source[i]<<" ";
cout<<endl;
}
cout<<"*******************************************************"<<endl;
}
int ISSAFE(process *PROCE,int *source,int M,int P,int *no){
int i=0,j=0,k=0;
for(int h=0;h<P;h++){
for(j=0;j<P;j++){
if(PROCE[j].finish==0){ //进程PROCE[i]尚未完成
for(k=0;k<M;k++){
if(PROCE[j].N[k]>source[k]){break;}
}
if(k==M){
for(int h=0;h<M;h++)
{
source[h]+=PROCE[j].H[h];
}
PROCE[j].finish=1;
no[i]=j;//进程完成序列
PRIN(PROCE,source, M, P);
i++;
getchar();
}
}
}
if(i==P){return 1;}//安全
}
return 0;//不安全
}
int TEST(process *PRO,int *SOURCE,int M,int P){
int number=0;
int *no;
no=new int[P];//安全序列
for(int k=0;k<P;k++)
no[k]=0;
int i=0,j=0;
process *PROCE=new process[P];
int *source;
source=new int[M];
for(i=0;i<M;i++)
source[i]=SOURCE[i];
for(i=0;i<P;i++){
PROCE[i].H=new int[M];
PROCE[i].N=new int[M];
PROCE[i].R=new int[M];
PROCE[i].finish=0;
for(j=0;j<M;j++){
PROCE[i].H[j]=PRO[i].H[j];
PROCE[i].N[j]=PRO[i].N[j];
PROCE[i].R[j]=PRO[i].R[j];
}
}
for(i=0;i<P;i++){
for(j=0;j<10;j++){
PROCE[i].name[j]=PRO[i].name[j];
}
}
PRIN(PROCE,source, M, P);
getchar();
do{
cout<<"请输入请求资源的进程编号:";
cin>>number;
if(number>=P||number<0)
cout<<"输入进程编号非法!"<<endl;
}while(number>=M||number<0);
cout<<"请输入进程"<<number<<"请求的各资源数目:"<<endl;//输入请求序列
cout<<"资源号为:";
for(j=0;j<M;j++)
cout<<j<<" ";
cout<<endl;
cout<<" ";
for(j=0;j<M;j++)
cin>>PROCE[number].R[j];
//************************银行家算法**************************
for(i=0;i<M;i++){
if(PROCE[number].R[i]>PROCE[number].N[i]){
cout<<"出错!R"<<i<<"大于"<<"P"<<i<<"尚需资源"<<endl;
return 0;
}
}
for(i=0;i<M;i++){
if(PROCE[number].R[i]>source[i]){
cout<<"出错!R"<<i<<"大于"<<"系统可用资源"<<endl;
}
}
for(i=0;i<M;i++){
source[i]=source[i]-PROCE[number].R[i];
PROCE[number].H[i]=PROCE[number].H[i]+PROCE[number].R[i];
PROCE[number].N[i]=PROCE[number].N[i]-PROCE[number].R[i];
}
int FLAG=0;
FLAG=ISSAFE(PROCE,source, M, P,no); //判断是否安全
if(FLAG==1){cout<<"安全序列:"<<endl;
for(i=0;i<P;i++)cout<<no[i]<<" ";
cout<<endl;
}
if(FLAG=0){cout<<"警告:当前状态不安全!不存在安全序列!"<<endl;}
free(source);
free(PROCE);
}
void main(){
//系统初始化
//*******************************************************
cout<<"请输入进程数:";
cin>>P;
cout<<"请输入系统总的资源种类数:";
cin>>M;
process *PRO=new process[P];
int i=0,j=0;
for(i=0;i<P;i++){
PRO[i].H=new int[M];
PRO[i].N=new int[M];
PRO[i].R=new int[M];
PRO[i].finish=0;
for(j=0;j<M;j++){
PRO[i].H[j]=0;
PRO[i].N[j]=0;
PRO[i].R[j]=0;
}
}
//*******************************************************
//输入系统初态
//*******************************************************
cout<<"输入系统初态"<<endl;
for(i=0;i<P;i++){
cout<<"请输入进程"<<i<<"名称:";
cin>>PRO[i].name;
cout<<"请输入进程"<<i<<"已获得的各资源数目"<<endl;
cout<<"资源号:";
for(j=0;j<M;j++)
cout<<j<<" ";
cout<<endl;
cout<<" ";
for(j=0;j<M;j++)
cin>>PRO[i].H[j];
cout<<"请输入进程"<<i<<"尚需分配的各资源数目"<<endl;
cout<<"资源号:";
for(j=0;j<M;j++)
cout<<j<<" ";
cout<<endl;
cout<<" ";
for(j=0;j<M;j++)
cin>>PRO[i].N[j];
}
int *SOURCE=new int[M];//当前系统可用资源
cout<<"请输入系统当前可用的各资源数目:"<<endl;
cout<<"资源号:";
for(j=0;j<M;j++)
cout<<j<<" ";
cout<<endl;
cout<<" ";
for(j=0;j<M;j++)
cin>>SOURCE[j];
//*******************************************************
while(1){
TEST(PRO,SOURCE,M,P);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -