银行家算法课程设计报告.docx
《银行家算法课程设计报告.docx》由会员分享,可在线阅读,更多相关《银行家算法课程设计报告.docx(15页珍藏版)》请在冰豆网上搜索。
银行家算法课程设计报告
课程设计报告
课程设计名称:
银行家算法模拟实现
系别:
二系
姓名:
曹睿
班级:
信科1班
学号:
20120202127
成绩:
指导教师:
李洁
开课时间:
2014—2015学年2学期
目录
第一章需求目的1
第二章课题内容1
第三章详细设计1
3.1初始化1
3.2安全性检查算法2
3.3银行家算法3
第四章调试分析4
第五章总结6
第六章附录7
第一章需求目的
1.1了解多道程序系统中,多个进程并发执行的资源分配。
1.2掌握死锁的产生的原因、产生死锁的必要条件和处理死锁的基本方法。
1.3掌握预防死锁的方法,系统安全状态的基本概念。
1.4掌握银行家算法,了解资源在进程并发执行中的资源分配策略。
1.5理解死锁避免在当前计算机系统不常使用的原因。
第二章课题内容
2.1复习银行家算法,设计一个具有若干(不少于3种)资源和若干(不少于5个)进程的系统。
2.2定义系统的初始状态,即进程获得的资源数,还需要的资源数以及系统可用的资源数。
2.3以用户输入的方式提出资源请求,并用银行家算法避免可能发生的死锁,若系统安全,允许用户继续申请资源。
2.4设计的系统要求结构清晰,与用户的交互界面友好,能动态地实现资源的申请和分配。
第三章详细设计
银行家算法可分为几个主要的功能模块,其描述如下:
3.1初始化
由用户输入数据,分别对运行的进程数、总的资源种类数、总资源数、各进程所需要的最大资源数量(Max),已分配的资源数量赋值。
初始化算法流程图:
3.2安全性检查算法
(1)设置两个工作向量Work=AVAILABLE;FINISH=false;
(2)从进程集合中找到一个满足下述条件的进程,
FINISH==false;
NEED<=Work;
如找到,执行(3);否则,执行(4)
(3)设进程获得资源,可顺利执行,直至完成,从而释放资源。
Work+=ALLOCATION;
Finish=true;
(4).如所有的进程Finish=true,则表示安全;否则系统不安全。
安全性算法流程图:
3.3银行家算法
在避免死锁的方法中,所施加的限制条件较弱,有可能获得令人满意的系统性能。
在该方法中把系统的状态分为安全状态和不安全状态,只要能使系统始终都处于安全状态,便可以避免发生死锁。
银行家算法的基本思想是分配资源之前,判断系统是否是安全的;若是,才分配。
它是最具有代表性的避免死锁的算法。
设进程j提出请求REQUEST[i],则银行家算法按如下规则进行判断。
(1).如果REQUEST[j][i]<=NEED[j][i],则转
(2);否则,出错。
(2).如果REQUEST[j][i]<=AVAILABLE[j][i],则转(3);否则,出错。
(3).系统试探分配资源,修改相关数据:
AVAILABLE[i]-=REQUEST[j][i];
ALLOCATION[j][i]+=REQUEST[j][i];
NEED[j][i]-=REQUEST[j][i];
银行家算法流程图:
第四章调试分析
系统中的进程和资源数:
系统目前可用资源和各进程所需资源:
资源申请:
安全性检测:
第五章总结
一周的操作系统课程设计,我学到了很多课本上没有的知识。
想要完成模拟银行家算法的C语言程序,首先就是要彻底熟悉算法,了解算法的基本原理,才能开始着手程序设计在程序设计设计过程中,遇到了一些困难,通过向同学询问,翻阅资料等,问题被一一解决了。
首先就是在知识层面上了解了银行家算法这种进程调度和避免死锁的算法,并用C语言程序真正模拟出安全性检查和银行家算法过程,复习了之前所学C语言和数据结构的知识;在编程过程中虽然遇到很多困难,解决问题的过程中,同时也锻炼了我不怕困难,勇于迎接挑战的精神,为以后的工作打下了坚实的基础。
第六章附录
#include
#include
#include
#defineFALSE0
#defineTRUE1
#defineW10
#defineR20
intM;//总进程数
intN;//资源种类
intALL_RESOURCE[W];//各种资源的数目总和
intMAX[W][R];//M个进程对N类资源最大资源需求量
intAVAILABLE[R];//系统可用资源数
intALLOCATION[W][R];//M个进程已经得到N类资源的资源量
intNEED[W][R];//M个进程还需要N类资源的资源量
intRequest[R];//请求资源个数
voidshowdata()//函数showdata,输出资源分配情况
{
inti,j;
printf("\n\n各种资源的总数量(all):
\n");
for(j=0;jprintf("资源%d:
%d\n",j+1,ALL_RESOURCE[j]);
printf("\n\n");
printf("系统目前各种资源可用的数为(available):
\n");
for(j=0;jprintf("资源%d:
%d\n",j+1,AVAILABLE[j]);
printf("\n\n");
printf("各进程还需要的资源量(need):
\n\n");
printf("进程");
for(i=0;iprintf("资源%d",i+1);
printf("\n");
for(i=0;i{
printf("进程p%d:
",i+1);
for(j=0;jprintf("%d",NEED[i][j]);
printf("\n");
}
printf("\n\n");
printf("各进程已经得到的资源量(allocation):
\n\n");
printf("进程");
for(i=0;iprintf("资源%d",i+1);
printf("\n");
for(i=0;i{
printf("进程p%d:
",i+1);
for(j=0;jprintf("%d",ALLOCATION[i][j]);
printf("\n");
}
printf("\n");
}
voidchangdata(intk)//函数changdata,改变可用资源和已经拿到资源和还需要的资源的值
{
intj;
for(j=0;j{
AVAILABLE[j]=AVAILABLE[j]-Request[j];
ALLOCATION[k][j]=ALLOCATION[k][j]+Request[j];
NEED[k][j]=NEED[k][j]-Request[j];}}
voidrstordata(intk)//函数rstordata,恢复可用资源和已经拿到资源和还需要的资源的值
{intj;
for(j=0;j{AVAILABLE[j]=AVAILABLE[j]+Request[j];
ALLOCATION[k][j]=ALLOCATION[k][j]-Request[j];
NEED[k][j]=NEED[k][j]+Request[j];}}
intchkerr(ints)//函数chkerr,检查是否安全
{intWORK,FINISH[W];
inti,j,k=0;
for(i=0;iFINISH[i]=FALSE;
for(j=0;j{
WORK=AVAILABLE[j];
i=s;
do
{
if(FINISH[i]==FALSE&&NEED[i][j]<=WORK)
{
WORK=WORK+ALLOCATION[i][j];
FINISH[i]=TRUE;
i=0;
}
else
{i++;
}
}while(ifor(i=0;iif(FINISH[i]==FALSE)
{
printf("\n");
printf("系统不安全!
!
!
本次资源申请不成功!
!
!
\n");
printf("\n");
return1;
}
}
printf("\n");
printf("经安全性检查,系统安全,本次分配成功。
\n");
printf("\n");
return0;
}
voidbank()//银行家算法
{
inti=0,j=0;
charflag='Y';
while(flag=='Y'||flag=='y')
{
i=-1;
while(i<0||i>=M)
{
printf("请输入需申请资源的进程号(从P1到P%d,否则重输入!
):
",M);
printf("p");
scanf("%d",&i);
if(i<1||i>M)
printf("输入的进程号不存在,重新输入!
\n");
}
printf("请输入进程P%d申请的资源数:
\n",i);
for(j=0;j{
printf("资源%d:
",j+1);
scanf("%d",&Request[j]);
if(Request[j]>NEED[i-1][j])//若请求的资源数大于进程还需要i类资源的资源量j
{
printf("进程P%d申请的资源数大于进程P%d还需要%d类资源的资源量!
",i,i,j);
printf("申请不合理,出错!
请重新选择!
\n\n");
flag='N';
break;
}
else
{
if(Request[j]>AVAILABLE[j])//若请求的资源数大于可用资源数
{
printf("进程P%d申请的资源数大于系统可用%d类资源的资源量!
",i,j);
printf("申请不合理,出错!
请重新选择!
\n\n");
flag='N';
break;
}
}
}
if(flag=='Y'||flag=='y')
{
changdata(i-1);//调用changdata(i)函数,改变资源数
if(chkerr(i-1))//若系统安全
{
rstordata(i-1);//调用rstordata(i)函数,恢复资源数
showdata();//输出资源分配情况
}
else//若系统不安全
showdata();
}//输出资源分配情况
else//若flag=N||flag=n
showdata();
printf("\n");
printf("是否继续银行家算法演示,按'Y'或'y'键继续,按'N'或'n'键退出演示:
");
scanf("%c",&flag);
}
}
voidmain()//主函数
{
inti=0,j=0,p;
printf("***************************************\n");
printf("银行家算法的模拟实现\n");
printf("***************************************\n\n");
printf("请输入总进程数:
");
scanf("%d",&M);
printf("请输入总资源种类:
");
scanf("%d",&N);
printf("请输入总资源数(all_resource):
");
for(i=0;iscanf("%d",&ALL_RESOURCE[i]);
printf("依次输入各进程所需要的最大资源数量(max):
\n");
for(i=0;i{
for(j=0;j{
do
{
scanf("%d",&MAX[i][j]);
if(MAX[i][j]>ALL_RESOURCE[j])
printf("\n占有资源超过了声明的该资源总数,请重新输入!
\n");
}while(MAX[i][j]>ALL_RESOURCE[j]);
}
}
printf("依次输入各进程已经占据的资源数量(allocation):
\n");
for(i=0;i{
for(j=0;j{
do
{
scanf("%d",&ALLOCATION[i][j]);
if(ALLOCATION[i][j]>MAX[i][j])
printf("\n占有资源超过了声明的最大资源,请重新输入\n");
}while(ALLOCATION[i][j]>MAX[i][j]);
}
}//初始化资源数量
for(j=0;j{
p=ALL_RESOURCE[j];
for(i=0;i{
p=p-ALLOCATION[i][j];//减去已经被占据的资源
AVAILABLE[j]=p;
if(AVAILABLE[j]<0)
AVAILABLE[j]=0;
}
}
for(i=0;ifor(j=0;jNEED[i][j]=MAX[i][j]-ALLOCATION[i][j];
showdata();
bank();
}