实验六 银行家算法(下)
一、实验说明
实验说明:本次实验主要是对银行家算法进行进一步的实践学习,掌握银行家算法的整体流程,理解程序测试时每一步的当前状态,能对当前的资源分配进行预判断。
二、实验要求
1、获取源代码
2、看懂大致框架
3、尝试运行并知道运行中输入的信息的意义
4、通过运行程序分配如下: 总需求:a 8 5 5; b 5 3 4; 已分配:a 4 2 3; b 4 2 2; 现在a 提出分配 1 1 1。 可以分配吗?
5、请从银行家算法的理论进行分析上述分配是否会造成死锁,如果会造成死锁,说明源代码并不完整,请同学改进完善源代码,使其能有效判断是否存在安全序列,进而拒绝不安全的分配要求。
三、实验步骤
1、在文档右边的虚拟化操作系统中,打开桌面的 Xfce 终端,输入cd Desktop
2、输入touch 6-1.c
3、输入gedit 6-1.c
4、在 gedit 里面输入源代码,点击 save 保存
5、关掉 gedit 编辑器
6、输入g++ -o 6-1 6-1.c
7、在桌面的 Xfce 终端继续输入命令./6-1
8、按要求输入并运行,观察结果
9、针对实验要求5,改进完善源代码.
四、实验报告要求 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
#include
#include
#include
#include
//#include
const int MAX_P=20;
const int MAXA=10; //定义A类资源的数量
const int MAXB=5;
const int MAXC=7;
using namespace std;
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
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<
cout<
cout<
cout<
cin>>name;
for(i=0;i
if(!strcmp(processes[i].name,name)){
flag=1;
break;
}
}
if(flag){
cout<
}
else{
cout<
cin>>need_a;
cout<
cin>>need_b;
cout<
cin>>need_c;
t=1;
cout<
if(need_a>banker.remain_a){
cout<
t=0;
}
if(need_b>banker.remain_b){
cout<
t=0;
}
if(need_c>banker.remain_c){
cout<
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<
}
else{
cout<
}
}
}
//为作业申请资源
void bid()
{
char name[20];
int i,p;
int a,b,c;
int flag;
cout<
cout<
cout<
cin>>name;
p=-1;
for(i=0;i
if(!strcmp(processes[i].name,name)){
p=i;
break;
}
}
if(p!=-1){
cout<
cin>>a;
cout<
cin>>b;
cout<
cin>>c;
flag=1;
if((a>banker.remain_a)||(a>processes[p].need_a-processes[p].a)){
cout<
flag=0;
}
if((b>banker.remain_b)||(b>processes[p].need_b-processes[p].b)){
cout<
flag=0;
}
if((c>banker.remain_c)||(c>processes[p].need_c-processes[p].c)){
cout<
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<
}
else{
cout<
}
}
else{
cout<
}
}
//撤消作业
void finished()
{
char name[20];
int i,p;
cout<
cout<
cout<
cin>>name;
p=-1;
for(i=0;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
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<
}
else{
cout<
}
}
//查看资源情况
void view()
{
int i;
cout<
cout<
cout<
cout<
cout<
cout<
cout<
if(quantity>0){
for(i=0;i
cout<
cout<
cout<
cout<
cout<
}
}
else{
cout<
}
}
//显示版权信息函数
void version()
{
cout<
cout<
}
int main()
{
int chioce;
int flag=1;
initial();
version();
while(flag){
cout<
cout<
cout<
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<
}
}
return 0;
}