如找到,执行步骤(3);否则,执行步骤(4)。
(3)当进程P获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行:
Work=Work+Allocation;
Finish[i]=true;
转向步骤
(2)。
(4)如果所有进程的Finish[i]=true,则表示系统处于安全状态;否则,系统处于不安全状态。
3.3程序流程图
3.4安全性检查算法
(1)设置两个工作向量Work=AVAILABLE;FINISH
(2)从进程集合中找到一个满足下述条件的进程,
FINISH==false;
NEED<=Work;
如找到,执行(3);否则,执行(4)
(3)设进程获得资源,可顺利执行,直至完成,从而释放资源。
Work+=ALLOCATION;
Finish=true;
GOTO2
(4)如所有的进程Finish=true,则表示安全;否则系统不安全。
3.5定义全局变量
intAvailable[x];//各种资源可利用的数量
intAllocation[y][y];//各进程当前已分配的资源数量
intMax[y][y];//各进程对各类资源的最大需求数
intNeed[y][y];//还需求矩阵
intRequest[x];//申请各类资源的数量
intWork[x];//工作向量,表系统可提供给进程运行所需各类资源数量
intFinish[y];//表系统是否有足够的资源分配给进程,0为否,1为是
4.程序测试截图
5.设计体会
经过几天的自己动手练习,对操作系统的掌握又进了一步,收获了很多课堂上和书上未出现过的或老师未讲到的一些知识。
在完成实验的过程中,进行了反复的修改和调试,这次实验,让我基本上明白了银行家算法的基本原理,加深了对课堂上知识的理解,也懂得了如何让银行家算法实现,但编程功底的原因使程序很是繁琐。
这次的设计数据是通过一道实际的题目来体现银行家算法避免死锁的问题,先用银行家算法给其中一个进程分配资源,看它所请求的资源是否大于它的需求量,才和系统所能给的资源相比较.让进程形成一个安全队列,看系统是否安全.再利用安全性算法检查此时系统是否安全。
要做一个课程设计,如果知识面只是停留在书本上,是不可能把课成设计完全地做好。
用VC++6.0编程,感觉自己有点力不从心,很多C语言的知识都忘了,只好翻出以前的C语言课本和数据结构来复习。
每次的课程设计中都能将以前的知识顺便再复习一遍,课程设计是给了我们一个机会去动手和主动复习,同时也是提醒我们应该注重平时的积累。
从课程设计以后还是要多多的动手,在实践中体会理论知识,这样才不会在要做实验和设计时,觉得无从下手。
感谢赵老师一周的幸苦指导。
参考文献
[1]庞丽萍.《操作系统原理》[M].武汉:
华中科技大学出版社,2008
[2]杨树青,王欢.《Linux环境下C编程指南》[M].北京:
清华大学出版社,2007
[3]陈维兴,林小茶.《C++面对对象程序设计教程》[M].北京:
清华大学出版社,2004
[4]杨路明.《C语言程序设计教程》[M].北京:
北京邮电大学出版社,2005
附录:
源程序清单
#include
#include
structtype
{
inta;
intb;
intc;
};
structallocation
{
structtypevalue;
structallocation*next;
};
structmax
{
structtypevalue;
structmax*next;
};
structavailable
{
structtypevalue;
structavailable*next;
};
structneed
{
structtypevalue;
structneed*next;
};
structpath
{
intvalue;
structpath*next;
};
structfinish
{
intvalue;
structfinish*next;
};
voidmain()
{
intp,status=0,i,j,temp,flag=0;
structallocation*allochead,*alloc1,*alloc2,*alloctemp;
structmax*maxhead,*max1,*max2,*maxtemp;
structavailable*availablehead,*workhead,*worktemp;
structneed*needhead,*need1,*need2,*needtemp;
structpath*pathhead,*path1,*path2,*pathtemp;
structfinish*finishhead,*finish1,*finish2,*finishtemp;
printf("请输入进程的数目\n");
scanf("%d",&p);
for(i=0;i
{
printf("\n输入进程p%d已经分配的资源\n",i+1);
if(flag==0)
{
allochead=alloc1=alloc2=(structallocation*)malloc(sizeof(structallocation));
printf("\t当前资源类型是%c\t",'a');
scanf("%d",&alloc1->value.a);
printf("\t当前资源类型是%c\t",'b');
scanf("%d",&alloc1->value.b);
printf("\t当前资源类型是%c\t",'c');
scanf("%d",&alloc1->value.c);
flag++;
allochead=alloc1;
}
else
{
alloc2=(structallocation*)malloc(sizeof(structallocation));
printf("\t当前资源类型是%c\t",'a');
scanf("%d",&alloc2->value.a);
printf("\t当前资源类型是%c\t",'b');
scanf("%d",&alloc2->value.b);
printf("\t当前资源类型是%c\t",'c');
scanf("%d",&alloc2->value.c);
alloc1->next=alloc2;
alloc1=alloc2;
flag++;
}
}
alloc2->next=NULL;
flag=0;
for(i=0;i
{
printf("\n输入进程p%d要求的最大数目\n",i+1);
if(flag==0)
{
maxhead=max1=max2=(structmax*)malloc(sizeof(structmax));
printf("\t当前资源类型是%c\t",'a');
scanf("%d",&max1->value.a);
printf("\t当前资源类型是%c\t",'b');
scanf("%d",&max1->value.b);
printf("\t当前资源类型是%c\t",'c');
scanf("%d",&max1->value.c);
maxhead=max1;
flag++;
}
else
{
max2=(structmax*)malloc(sizeof(structmax));
printf("\t当前资源类型是%c\t",'a');
scanf("%d",&max2->value.a);
printf("\t当前资源类型是%c\t",'b');
scanf("%d",&max2->value.b);
printf("\t当前资源类型是%c\t",'c');
scanf("%d",&max2->value.c);
max1->next=max2;
max1=max2;
flag++;
}
}
max2->next=NULL;
flag=0;
printf("\n请输入可以利用是资源数目\n");
availablehead=workhead=(structavailable*)malloc(sizeof(structavailable));
printf("\n");
printf("\t当前资源类型是%c\t",'a');
scanf("%d",&availablehead->value.a);
printf("\t当前资源类型是%c\t",'b');
scanf("%d",&availablehead->value.b);
printf("\t当前资源类型是%c\t",'c');
scanf("%d",&availablehead->value.c);
workhead=availablehead;
workhead->value=availablehead->value;
flag=0;
alloctemp=allochead;
maxtemp=maxhead;
for(i=0;i
{
if(flag==0)
{
needhead=need1=need2=(structneed*)malloc(sizeof(structneed));
need1->next=need2->next=NULL;
need1->value.a=(maxtemp->value.a)-(alloctemp->value.a);
need1->value.b=(maxtemp->value.b)-(alloctemp->value.b);
need1->value.c=(maxtemp->value.c)-(alloctemp->value.c);
needhead=need1;
flag++;
}
else
{
need2=(structneed*)malloc(sizeof(structneed));
need2->value.a=(maxtemp->value.a)-(alloctemp->value.a);
need2->value.b=(maxtemp->value.b)-(alloctemp->value.b);
need2->value.c=(maxtemp->value.c)-(alloctemp->value.c);
need1->next=need2;
need1=need2;
flag++;
}
maxtemp=maxtemp->next;
alloctemp=alloctemp->next;
}
need2->next=NULL;
flag=0;
for(i=0;i
{
if(flag==0)
{
finishhead=finish1=finish2=(structfinish*)malloc(sizeof(structfinish));
finish1->next=finish2->next=NULL;
finish1->value=0;
finishhead=finish1;
flag++;
}
else
{
finish2=(structfinish*)malloc(sizeof(structfinish));
finish2->value=0;
finish1->next=finish2;
finish1=finish2;
flag++;
}
}
finish2->next=NULL;
flag=0;
for(temp=0;temp
{
alloctemp=allochead;
needtemp=needhead;
finishtemp=finishhead;
worktemp=workhead;
for(j=0;j
{
if(finishtemp->value==0)
{
if((needtemp->value.a<=worktemp->value.a)&&(needtemp->value.b<=worktemp->value.b)&&(needtemp->value.c<=worktemp->value.c))
{
worktemp->value.a+=alloctemp->value.a;
worktemp->value.b+=alloctemp->value.b;
worktemp->value.c+=alloctemp->value.c;
finishtemp->value=1;
if(flag==0)
{
pathhead=path1=path2=(structpath*)malloc(sizeof(structpath));
path1->next=path2->next=NULL;
path1->value=j+1;
pathhead=path1;
flag++;
}
else
{
path2=(structpath*)malloc(sizeof(structpath));
path2->value=j+1;
path1->next=path2;
path1=path2;
flag++;
}
finishtemp=finishtemp->next;
alloctemp=alloctemp->next;
needtemp=needtemp->next;
}
else
{
finishtemp=finishtemp->next;
alloctemp=alloctemp->next;
needtemp=needtemp->next;
}
}
else
{
finishtemp=finishtemp->next;
alloctemp=alloctemp->next;
needtemp=needtemp->next;
}
}
}
path2->next=NULL;
finishtemp=finishhead;
pathtemp=pathhead;
for(temp=0;temp
{
if(finishtemp->value==0)
{
printf("\n警告!
当前系统是不安全的\n");
exit(0);
}
finishtemp=finishtemp->next;
}
printf("\n当前系统是安全的!
\n");
printf("\n安全序列为:
\n");
for(i=0;i
{
printf("p%d\t",pathhead->value);
pathhead=pathhead->next;
}
}
设计过程中质疑(或答辩)记载:
1.银行家算法的主要问题是什么?
答:
要求每个进程必须事先知道资源的最大需求量,而且,在系统运行过程中,考查每个进程对各类资源的申请需花费较多的时间。
2.银行家算法的主要思想是什么?
答:
一个进程进入系统时分配资源之前,判断系统是否是安全的,即看它所请求的资源是否大于它的最大需求量,若正常,则判断该进程所需剩余剩余量(包括本次申请)是否超出系统所掌握的剩余资源量,若不超出,则分配,否则等待。
指导教师评语:
签名:
年月日