银行家安全算法 2.docx
《银行家安全算法 2.docx》由会员分享,可在线阅读,更多相关《银行家安全算法 2.docx(11页珍藏版)》请在冰豆网上搜索。
银行家安全算法2
江西科技学院实验项目卡
实验中心:
计算机中心实验室:
S2-303机房制卡时间:
2013年3月
实验项目名称
编程实现银行家安全算法
实验项目编号
课程名称
操作系统
课程代码
81211679
适用专业
计算机科学与技术
实验学时数
6
实验类型
综合
实验要求
必修
实验类别
专业
实验
实验者类别
统招本科
每批组数
45
每组人数
1
实验方式
课内
实验
首开时间
2005年9月
变动情况说明
无
实验教材或指导书名称
《操作系统》
实验目的、实验内容、实验原理与实验要求:
一、实验目的
通过实验加强对银行家安全算法的理解和掌握。
二、实验内容
熟悉避免死锁发生的方法,死锁与安全序列的关系,编程实现银行家算法,要求输出进程的安全序列。
三、实验要求
1、需写出设计说明;
2、设计实现代码及说明
3、运行结果;
1输入Max和All进程的值
得到Need
正确
错误
2代码:
#include
main()
{inti,j,Max[5][3],All[5][3],Need[5][4],Ava[3],a[5][12],q,w,s[3];
intk=0,c[5];
intm=5;
printf("请输入Max的值;\n");
for(i=0;i<5;i++)
for(j=0;j<3;j++)
scanf("%d",&Max[i][j]);
printf("请输入All的值;\n");
for(i=0;i<5;i++)
for(j=0;j<3;j++)
scanf("%d",&All[i][j]);
for(i=0;i<5;i++)
for(j=0;j<3;j++)
Need[i][j]=Max[i][j]-All[i][j];
for(i=0;i<5;i++)
Need[i][3]=1;/*多定义need一列将这一列作为标示位记录是否已经进程结束并初始化为1*/
printf("请输入Ava的值;\n");
for(i=0;i<3;i++)
scanf("%d",&Ava[i]);
for(i=0;i<5;i++)/*输出need看是否将标示位赋值成功*/
{for(j=0;j<4;j++)
printf("%2d",Need[i][j]);
printf("\n");}
for(i=0;i<5;i++)/*将3个数组的值移到一个数组里*/
for(j=0;j<3;j++)
a[i][j]=Max[i][j];
for(i=0;i<5;i++)
for(j=0;j<3;j++)
a[i][j+3]=All[i][j];
for(i=0;i<5;i++)
for(j=0;j<3;j++)
a[i][j+6]=Need[i][j];
for(j=0;j<3;j++)
a[0][j+9]=Ava[j];
printf("MaxAllNeedAva\n");/*打印该数
组*/
printf("ABCABCABCABC\n");
for(j=0;j<1;j++)
printf("p[%d]",j);
for(j=0;j<12;j++)
printf("%5d",a[0][j]);
printf("\n");
for(i=1;i<5;i++)
{printf("p[%d]",i);
for(j=0;j<9;j++)
printf("%5d",a[i][j]);
printf("\n");}
/*该程序可以判断之前的进程是否有安全序列*/
/*
lop1:
for(i=0;i<5;i++)
if(Ava[0]>=Need[i][0]&&Ava[1]>=Need[i][1]&&Ava[2]>=Need[i][2]&&Need[i][3]==1)
{Ava[0]=Ava[0]-Need[i][0]+Max[i][0];
Ava[1]=Ava[1]-Need[i][1]+Max[i][1];
Ava[2]=Ava[2]-Need[i][2]+Max[i][2];
Need[i][3]=0;
c[k]=i;
k++;}
if(Need[0][3]==0&&Need[1][3]==0&&Need[2][3]==0&&Need[3][3]==0&&Need[4][3]==0)
{gotolop2;}
/*for(i=0;i<5;i++)
{for(j=0;j<4;j++)
printf("%2d",Need[i][j]);
printf("\n");}*/
/*
if(m>0)
{m--;
gotolop1;
}
elsegotolop3;
lop2:
printf("安全序列为:
\n");
for(j=0;j<5;j++)
printf("P[%d]\n",c[j]);
if(!
(Need[0][3]==0&&Need[1][3]==0&&Need[2][3]==0&&Need[3][3]==0&&Need[4][3]==0))
lop3:
printf("不是安全序列\n");*/
printf("是否需要请求资源如果要请输入1并输入要在几进程中加入比如在第一进程请求,请输入1,0
不要请输入2\n");
scanf("%d,%d",&q,&w);/*输入是否请求的值1或者2,并输入在那个进程请求该资源*/
printf("%d",q);
if(q==1)/*判断是否请求*/
{
printf("请输入%d的3个资源请求值",w);
for(i=0;i<3;i++)
scanf("%d",&s[i]);
for(i=0;i<3;i++)
{if(s[i]>Ava[i])/*如果剩余的资源部满足则直接跳出*/
{printf("剩余资源数不足以满足\n");
gotolop3;}
All[w][i]=All[w][i]+s[i];/*将之前所要求的进程请求的进程修改*/
Ava[i]=Ava[i]-s[i];/*将剩余的资源数修改*/
}
for(i=0;i<5;i++)/*将修改后的进程重新导入need中*/
for(j=0;j<3;j++)
Need[i][j]=Max[i][j]-All[i][j];
for(i=0;i<5;i++)/*将3个数组的值移到一个数组里*/
for(j=0;j<3;j++)
a[i][j]=Max[i][j];
for(i=0;i<5;i++)
for(j=0;j<3;j++)
a[i][j+3]=All[i][j];
for(i=0;i<5;i++)
for(j=0;j<3;j++)
a[i][j+6]=Need[i][j];
for(j=0;j<3;j++)
a[0][j+9]=Ava[j];
printf("MaxAllNeedAva\n");/*打印修改
后的该数组*/
printf("ABCABCABCABC\n");
for(j=0;j<1;j++)
printf("p[%d]",j);
for(j=0;j<12;j++)
printf("%5d",a[0][j]);
printf("\n");
for(i=1;i<5;i++)
{printf("p[%d]",i);
for(j=0;j<9;j++)
printf("%5d",a[i][j]);
printf("\n");}
}
lop1:
/*控制跳转的次数*/
for(i=0;i<5;i++)
if(Ava[0]>=Need[i][0]&&Ava[1]>=Need[i][1]&&Ava[2]>=Need[i][2]&&Need[i][3]==1)/*判断剩余资
源是否满足当前资源需要*/
{Ava[0]=Ava[0]-Need[i][0]+Max[i][0];/*修改剩余资源*/
Ava[1]=Ava[1]-Need[i][1]+Max[i][1];/*修改剩余资源*/
Ava[2]=Ava[2]-Need[i][2]+Max[i][2];/*修改剩余资源*/
Need[i][3]=0;/*将标示位修改为0*/
c[k]=i;/*记下当前满足的位置*/
k++;}
if(Need[0][3]==0&&Need[1][3]==0&&Need[2][3]==0&&Need[3][3]==0&&Need[4][3]==0)/*判断标示位
是否已修改*/
{gotolop2;}/*跳转到lop2*/
for(i=0;i<5;i++)/*打印标示位是否已修改*/
{for(j=0;j<4;j++)
printf("%2d",Need[i][j]);
printf("\n");}
if(m>0)/*控制跳转的次数*/
{m--;/*m初值为5控制次数*/
gotolop1;
}
elsegotolop3;
lop2:
printf("安全序列为:
\n");
for(j=0;j<5;j++)/*打印输出安全序列*/
printf("P[%d]\n",c[j]);
if(!
(Need[0][3]==0&&Need[1][3]==0&&Need[2][3]==0&&Need[3][3]==0&&Need[4][3]==0))
{lop3:
printf("不是安全序列\n");}
}
输入书中的例子可得
输入请求的资源过大时所得