1、通过运行程序分配如下: 总需求:a 8 5 5; b 5 3 4; 已分配:a 4 2 3; b 4 2 2; 现在a 提出分配 1 1 1 完成实验截图;
2、简述自己对银行家算法的理解? 银行家算法是关于资源分配和死锁管理的算法,通过对每次资源分配进行检测,分析资源分配是否会造成死锁,不会的话可以进行分配,否则撤销本次分配
3、针对实验要求5,改进完善源代码.对改进之处说明或截图,并重新进行前面的分配过程,并截图。
4、将最后的完整源代码复制。 #include "stdafx.h"
const int MAX_P=20; const int MAXA=10; //定义A类资源的数量 const int MAXB=7; const int MAXC=7;
typedef struct node{ int a; int b; int c; int remain_a; int remain_b; int remain_c; }bank;
typedef struct node1{ char name[20]; int a; int b; int c; int need_a; int need_b; int need_c; }process;
bank banker; process processes[MAX_P]; int quantity;
//初始化函数 void initial() { int i;
banker.a=MAXA; banker.b=MAXB; banker.c=MAXC; banker.remain_a=MAXA; banker.remain_b=MAXB; banker.remain_c=MAXC;
for(i=0;i<MAX_P;i++){ strcpy(processes[i].name,""); processes[i].a=0; processes[i].b=0; processes[i].c=0; processes[i].need_a=0; processes[i].need_b=0; processes[i].need_c=0; } }
//新加作业 void add() { char name[20]; int flag=0; int t; int need_a,need_b,need_c; int i;
cout<<endl; cout<<"新加作业"<<endl; cout<<"━━━━━━━━━━━━━━━━━━━━━━━━━━━━"<<endl; cout<<"请输入新加作业名:"; cin>>name;
for(i=0;i<quantity;i++){ if(!strcmp(processes[i].name,name)){ flag=1; break; } }
if(flag){ cout<<"错误,作业已存在"<<endl; } else{ cout<<"本作业所需A类资源:"; cin>>need_a; cout<<"本作业所需B类资源:"; cin>>need_b; cout<<"本作业所需C类资源:"; cin>>need_c;
t=1; cout<<need_a<<banker.remain_a; if(need_a>banker.remain_a){ cout<<"错误,所需A类资源大于银行家所剩A类资源"<<endl; t=0; } if(need_b>banker.remain_b){ cout<<"错误,所需B类资源大于银行家所剩B类资源"<<endl; t=0; } if(need_c>banker.remain_c){ cout<<"错误,所需C类资源大于银行家所剩C类资源"<<endl; t=0; } if(t){ strcpy(processes[quantity].name,name); processes[quantity].need_a=need_a; processes[quantity].need_b=need_b; processes[quantity].need_c=need_c;
quantity++; cout<<"新加作业成功"<<endl; } else{ cout<<"新加作业失败"<<endl; } } }
//为作业申请资源 void bid() { char name[20]; int i,p; int a,b,c; int flag;
cout<<endl<<"为作业申请资源"<<endl; cout<<"━━━━━━━━━━━━━━━━━━━━━━━━━━━━"<<endl; cout<<"要申请资源的作业名:"; cin>>name;
p=-1; for(i=0;i<quantity;i++){ if(!strcmp(processes[i].name,name)){ p=i; break; } } if(p!=-1){ cout<<"该作业要申请A类资源数量:"; cin>>a; cout<<"该作业要申请B类资源数量:"; cin>>b; cout<<"该作业要申请C类资源数量:"; cin>>c;
flag=1; if((a>banker.remain_a)||(a>processes[p].need_a-processes[p].a)){ cout<<"错误,所申请A类资源大于银行家所剩A类资源或该进程还需数量"<<endl; flag=0; } if((b>banker.remain_b)||(b>processes[p].need_b-processes[p].b)){ cout<<"错误,所申请B类资源大于银行家所剩B类资源或该进程还需数量"<<endl; flag=0; } if((c>banker.remain_c)||(c>processes[p].need_c-processes[p].c)){ cout<<"错误,所申请C类资源大于银行家所剩C类资源或该进程还需数量"<<endl; flag=0; } if(flag){ banker.remain_a-=a; banker.remain_b-=b; banker.remain_c-=c;
processes[p].a+=a; processes[p].b+=b; processes[p].c+=c;
cout<<"为作业申请资源成功"<<endl; } else{ cout<<"为作业申请资源失败"<<endl; } } else{ cout<<"该作业不存在"<<endl; } }
//撤消作业 void finished() { char name[20]; int i,p;
cout<<endl<<"撤消作业"<<endl; cout<<"━━━━━━━━━━━━━━━━━━━━━━━━━━━━"<<endl; cout<<"要撤消作业名:"; cin>>name;
p=-1; for(i=0;i<quantity;i++){ if(!strcmp(processes[i].name,name)){ p=i; break; } } if(p!=-1){ banker.remain_a+=processes[p].a; banker.remain_b+=processes[p].b; banker.remain_c+=processes[p].c; for(i=p;i<quantity-1;i++){ processes[i]=processes[i+1]; } strcpy(processes[quantity-1].name,""); processes[quantity-1].a=0; processes[quantity-1].b=0; processes[quantity-1].c=0; processes[quantity-1].need_a=0; processes[quantity-1].need_b=0; processes[quantity-1].need_c=0;
quantity--;
cout<<"撤消作业成功"<<endl; } else{ cout<<"撤消作业失败"<<endl; } }
//查看资源情况 void view() { int i;
cout<<endl<<"查看资源情况"<<endl; cout<<"━━━━━━━━━━━━━━━━━━━━━━━━━━━━"<<endl; cout<<"银行家所剩资源(剩余资源/总共资源)"<<endl; cout<<"A类:"<<banker.remain_a<<"/"<<banker.a; cout<<" B类:"<<banker.remain_b<<"/"<<banker.b; cout<<" C类:"<<banker.remain_c<<"/"<<banker.c;
cout<<endl<<endl<<"作业占用情况(已占用资源/所需资源)"<<endl<<endl; if(quantity>0){ for(i=0;i<quantity;i++){ cout<<"作业名:"<<processes[i].name<<endl; cout<<"A类:"<<processes[i].a<<"/"<<processes[i].need_a; cout<<" B类:"<<processes[i].b<<"/"<<processes[i].need_b; cout<<" C类:"<<processes[i].c<<"/"<<processes[i].need_c; cout<<endl; } } else{ cout<<"当前没有作业"<<endl; } }
//显示版权信息函数 void version() { cout<<endl<<endl;
cout<<" 银 行 家 算 法 "<<endl;
}
void main() { int chioce; int flag=1;
initial();
version();
while(flag){ cout<<"━━━━━━━━━━━━━━━━━━━━━━━━━━━━"<<endl; cout<<"1.新加作业 2.为作业申请资源 3.撤消作业"<<endl; cout<<"4.查看资源情况 0.退出系统"<<endl; cout<<"请选择:"; cin>>chioce;
switch(chioce){ case 1: add(); break; case 2: bid(); break; case 3: finished(); break; case 4: view(); break; case 0: flag=0; break; default: cout<<"选择错误"<<endl<<endl; } } }
5、增加资源申请时对安全性的判断,即判断尝试此次分配后仍存在安全序列可以让所有进程运行完毕。 如存在安全序列,则进行分配,否则,拒绝,并显示相应信息。
学习时间 95分钟
操作时间 51分钟
按键次数 41554次
实验次数 8次
报告字数 5099字
是否完成 完成