汪玮 操作系统银行家算法讲诉.docx
《汪玮 操作系统银行家算法讲诉.docx》由会员分享,可在线阅读,更多相关《汪玮 操作系统银行家算法讲诉.docx(20页珍藏版)》请在冰豆网上搜索。
汪玮操作系统银行家算法讲诉
操作系统课程设计任务书
学院
计算机与信息工程学院
专业
网络工程
课程名称
操作系统
题目
银行家算法的实现
完成期限
自2013年6月3日至2013年6月30日共4周
内
容
及
任
务
一、项目的目的
1.定义相关数据结构;
2.编程实现银行家算法;
3.分析和验证银行家算法程序。
二、项目任务的主要内容和要求
根据银行家算法的基本思想,设计相关数据结构,编写程序实现银行家算法中各个功能模块,并通过数据验证该算法;按照要求撰写课程设计报告。
三、项目设计(研究)思路
银行家算法是一个用来预防系统进入死锁状态的算法,用它可以判断系统的安全性,如果系统当前处于安全状态,则可以为申请资源的进程分配资源,如果不是安全状态,则不能为申请资源的进程分配资源。
银行家算法执行过程中,首先判断申请资源的进程所申请的资源数目是否合法,若是合法的,则可以为其进行试分配,再利用安全性算法求出安全序列,如果存在安全序列,则说明可以给申请资源的进程分配资源,分配成功,继续为其它进程服务。
如果找不到安全序列,则说明为该进程分配资源后系统会进入不安全状态,所以不能为该进程分配资源,使该进程进入阻塞状态。
若申请资源的进程申请的资源数目不合法,则不需要进行试分配,直接使其进入阻塞状态,处理其他申请资源的进程。
首先对算法的设计从总体上进行了分析,然后分析各个细节,再对算法分模块设计,并对各个模块的算法思想通过流程图表示,分块编写代码,并进行调试和测试,最后进行组装测试及系统测试,使其成为一个可以用来判断系统安全状态的程序。
四、具体成果形式和要求
1.深入理解银行家算法。
2.用C语言编程实现银行家算法。
3.建立相对友好的界面。
4.撰写课程设计文档。
进
度
安
排
起止日期
工作内容
2013.6.3—2013.6.8
分析题目,分配任务,查找资料
2013.6.9—2013.6.24
编写源代码,测试并修改
2013.6.25—2013.6.30
书写课程设计报告
主
要
参
考
资
料
1.汤子瀛.计算机操作系统(第三版)[M].西安电子科技大学出版社.2009;
2.方敏.操作系统教程[M].西安电子科技大学出版社.2006;
3.周湘贞.操作系统原理与实践教程[M].清华出版社.2005;
4严蔚敏.数据结构(C语言版)[M].清华大学出版社.2009;
指导教师
意见
(签字):
年月日
系(教研室)主任意见
(签字):
年月日
操作系统设计说明书
学院名称:
计算机与信息工程学院
班级名称:
网工111班
学生姓名:
汪玮,金良民,李亮,何玉琴,李宁
学号:
2011211301、2011211272、2011211277
2011211265、2011211278
题目:
银行家算法的实现
指导教师
姓名:
赵国柱
起止日期:
自2013年6月3日至2013年6月30日
第一部分:
正文部分1
一、选题背景1
二、设计思路1
三、过程论述1
3.1全性算法的算法思想1
3.1.1银行家算法中的数据结构1
3.1.2.设置向量2
3.1.3.安全性检测流程图2
3.2.银行家算法的算法思想4
3.2.1.银行家算法4
3.2.2.银行家算法流程图4
四、结果分析5
五、结论8
第二部分:
参考文献8
第三部分:
指导教师评语9
第四部分:
成绩评定9
附录10
第一部分:
正文部分
一、选题背景
在具有多道程序并发执行能力的系统中,系统资源的利用率、进程执行的效率都大幅增加,但可能发生“死锁”的危险。
所谓死锁,是指多个进程因竞争资源而造成的一种僵局,若无外力作用,这些进程都将永远不能再向前推进。
而死锁产生的原因有两点:
竞争资源和进程推进的顺序不合法。
为了避免死锁,使得进程的执行能够顺利完成,引入银行家算法进行解决。
银行家算法是具有代表性的避免死锁的算法,由于该算法能用于银行系统现金贷款的发放而得名。
二、设计思路
当系统在进行资源管理时,如果对进程申请的资源分配不当,可能会使系统进入死锁状态,因而后面到来的进程也无法顺利执行。
银行家算法中,要对当前申请资源的进程申请资源的数目进行判断,如果可以试分配,则试求出一个安全序列,如果可以求出,则说明给这个进程分配资源后系统不会进入不安全状态,将该进程申请的资源分配给它,若求不出安全序列,则说明将资源分配给该进程后系统会进入不安全状态,所以就使该进程进入阻塞状态,等待以后可以分配资源时再执行该进程,然后系统继续服务其它进程。
通过这样一个过程,可以有效避免系统进入死锁状态。
三、过程论述
3.1全性算法的算法思想
系统在进行资源分配之前,应先计算此次资源分配后状态的安全性。
若此次分配后的状态是安全状态,则将资源分配给进程;否则,令进程等待。
3.1.1银行家算法中的数据结构
1)可利用资源向量Available。
这是一个含有m个元素的数组,其中的每一个元素代表一类可利用的资源数目,其初始值是系统中所配置的该类全部可用资源的数目,其数值随该类资源的分配和回收而动态地改变。
如果Available[j]=K,则表示系统中现有Rj类资源K个。
2)最大需求矩阵Max。
这是一个n*m的矩阵,它定义了系统中n个进程中的每一个进程对m类资源的最大需求。
如果Max[i,j]=K,则表示进程i需要Rj类资源的最大数目为K。
3)分配矩阵Allocation。
这也是一个n*m的矩阵,它定义了系统中每一类资源当前已分配给每一个进程的资源数。
如果Allocation[i,j]=K,则表示进程i当前已分得Rj类资源的数目为K。
4)需求矩阵Need。
这也是一个n*m的矩阵,用以表示每一个进程尚需的各类资源数。
如果Need[i,j]=K,则表示进程i还需要Rj类资源K个,方能完成其任务。
上述三个矩阵间存在下述关系:
Need[i,j]=Max[i,j]-Allocation[i,j]
3.1.2.设置向量
(1)设置向量:
工作向量Work:
它表示系统可提供给进程继续运行所需的各类资源数目,在执行安全性算法开始时,Work[]=Available[]。
Finish[]:
它表示系统是否有足够的资源分配给每个进程,使之运行完成。
开始时先做Finish[i]=false;当有足够的资源分配给进程时,再令Finish[i]=true。
(2)在进程中查找符合以下条件的进程:
条件1:
Finish[i]=ture;
条件2:
need[i][j]<=work[j]
若找到,则执行步骤(3);否则,执行步骤(4)
(3)当进程获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行:
work[j]=work[j]+allocation[i][j];
Finish[i]=ture;
gotostep2;
(4)最后循环检查是否所有的Finish[i]=ture都满足,如果是定义一个r,则r返回1表示系统处于安全状态,否则,r返回0表示系统处于不安全状态。
3.1.3.安全性检测流程图
调用check()函数对银行家算法进行安全性检测。
安全行算法如以下流程图所示:
work[]是空闲资源矩阵,finish表示系统是否有足够的资源分配给进程,
(1)work[]=Available[],finish[]=false;当有足够资源分配给进程时,令Finish[i]=true。
(2)从进程集合中找一个能满足①Finish[i]=false②Need<=Work的进程,若找到,则执行步骤(3);否则,执行步骤(4)。
(3)当进程P获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行:
safeprocess[k++]=i;Work=Work+Allocation;Finish[i]=true;转向步骤
(2)。
(4)如果所有进程的Finish[i]=true,则表示系统处于安全状态;否则,系统处于不安全状态。
图3-1安全性检测流程图
3.2.银行家算法的算法思想
3.2.1.银行家算法
先对用户提出的请求进行合法性检查,即检查请求数是否不大于需求数,是否不大于可利用的。
若请求合法,则进行试分配。
最后对分配后的状态调用安全性检查算法进行安全性检查。
若安全,则分配,否则,不分配,恢复原来状态,拒绝申请。
进程i发出申请资源请求:
(1)通过request[m]和available[m]的关系检查申请量是否不大于需求量再检查申请量是否不大于系统中的可利用资源数量,若条件不符重新输入,不允许申请大于需求量。
(2)若以上条件都满足,则系统试探着将资源分配给申请的进程,并修改下面数据结构中的数值:
Available[i,j]=Available[i,j]-Request[i][j];
Allocation[i][j]=Allocation[i][j]+Request[i][j];
need[i][j]=need[i][j]-Request[i][j];
(3)进行试分配,执行安全性检查,调用check()函数检查此次资源试分配后系统是否处于安全状态。
若安全,才正式将资源分配给进程;否则本次试探分配作废,恢复原来的资源分配状态,让该进程等待。
(4)用while循环语句实现输入字符Y/N判断是否继续进行资源申请。
3.2.2.银行家算法流程图
银行家算法流程图图形化描述了此算法基本功能,如图3-2所示。
系统初始化,输入进程no1,输入资源类数no2,输入进程最大需求矩阵Max,已分配矩阵Allocation和可利用资源矩阵Available。
need[][]=max[][]-allocation[][]。
打印输出此时资源分配情况表。
输入欲申请资源进程号,查看输入是否合法。
是的话输入该进程的资源量,否的话重新申请资源进程号。
判断request[]>need[][],是则进行继续分配或者退出,否则判断request[]>available[]。
是则进行继续分配或者退出,否则进行预分配。
调用check()函数进行安全性检查。
然后进行继续分配或者退出是则,输入欲申请资源进程号,否则退出。
图3-2银行家算法流程图
四、结果分析
(1)运行banker.cpp文件,要求输入进程总数和资源种类数,将进程总数设为5,资源总类数设为3,出现如图4-1所示的界面。
图4-1系统界面图
(2)输入max[][],allocation[][],available[],max矩阵表示最大需求矩阵,allocation表示分配矩阵,available表示可利用资源向量。
输入各个矩阵的值。
如图4-2所示。
图4-2系统输入数据图
(3)输入完成并确认后,得到分配的情况,各类资源可利用的资源数为{332},可以输出一个安全序列{p1,p3,p4,p0,p2},表示该系统当前为安全状态,如图5-3所示。
图4-3系统输出结果图
从图中可知道当前资源的分配情况,各类资源可利用的资源数以及系统当前的安全性序列。
(4)上一步的输入提示可以输入请求资源的进程号、该进程所请求的资源数,确认后可得到请求以后资源的分配情况、各类资源可利用的资源数以及系统当前的安全性序列{p1,p3,p4,p0,p2},如图5-4所示。
图4-4输入请求资源图
(5)通过上一步的提示可以选择是否继续分配。
输入Y表示继续分配,输入N表示不再分配。
五、结论
银行家算法是通过检查试分配,求安全序列,从而判断是否可以为申请资源的进程分配资源,从而有效地避免系统进入死锁状态。
虽然并非所有的不安全状态都会产生死锁状态,但系统进入不安全状态时,便可能进而进入死锁状态后,当系统在进行资源管理时,如果对进城申请的资源分配不当,可能会使系统进入死锁状态,因而后面到来的进程也无法顺利执行。
银行家算法中,要对当前申请资源的进程申请资源的数目进行判断,如果可以试分配,则试求出一个安全序列,如果可以求出,则说明给这个进程分配资源后系统不会进入不安全状态,将该进程申请的资源分配给他,若求不出安全序列,则说明将资源分配给该进程后系统会进入不安全状态,所以就使该进程进入阻塞状态,等待以后可以分配资源时再执行该进程,然后系统继续服务其它进程。
通过这样一个过程,可以有效避免系统进入死锁状态。
反之,只要系统处于安全状态,系统便可避免进入死锁状态。
因此,避免死锁的实质在于:
如何使系统不进入不安全状态。
第二部分:
参考文献
1.汤子瀛.计算机操作系统(第三版)[M].西安电子科技大学出版社.2009
2.方敏.操作系统教程[M].西安电子科技大学出版社.2006
3.周湘贞.操作系统原理与实践教程[M].清华出版社.2005
4.严蔚敏.数据结构(C语言版)[M].清华大学出版社.2009
学生签名:
填表日期:
2013年6月30日
第三部分:
指导教师评语
第四部分:
成绩评定
指导教师签名:
填表日期:
年月日
附录
#include
#include
#include
#definem50
intno1;//进程数
intno2;//资源数
intr;
intallocation[m][m],need[m][m],available[m],max[m][m];
voidmain()
{
voidcheck();
voidprint();
inti,j,p=0,q=0;
charc;
intrequest[m],allocation1[m][m],need1[m][m],available1[m];
printf("*******************************************************\n");
printf("*银行家算法的设计与实现*\n");
printf("*******************************************************\n");
printf("1.请输入进程总数:
");
scanf("%d",&no1);
printf("2.请输入资源种类数:
");
scanf("%d",&no2);
printf("3.请输入Max矩阵:
\n");
for(i=0;ifor(j=0;jscanf("%d",&max[i][j]);//输入已知进程最大资源需求量
printf("4.请输入Allocation矩阵:
\n");
for(i=0;ifor(j=0;jscanf("%d",&allocation[i][j]);//输入已知的进程已分配的资源数
for(i=0;ifor(j=0;jneed[i][j]=max[i][j]-allocation[i][j];
printf("5.请输入Available矩阵\n");
for(i=0;iscanf("%d",&available[i]);//输入已知的可用资源数
print();//输出已知条件
check();//检测T0时刻已知条件的安全状态
if(r==1)//如果安全则执行以下代码
{
do{
q=0;
p=0;
printf("\n请输入请求资源的进程号(0~4):
\n");
for(j=0;j<=10;j++)
{
scanf("%d",&i);
if(i>=no1)
{
printf("输入错误,请重新输入:
\n");
continue;
}
elsebreak;
}
printf("\n请输入该进程所请求的资源数request[j]:
\n");
for(j=0;jscanf("%d",&request[j]);
for(j=0;jif(request[j]>need[i][j])
p=1;//判断请求是否超过该进程所需要的资源数
if(p)
printf("请求资源超过该进程资源需求量,请求失败!
\n");
else
{
for(j=0;jif(request[j]>available[j])
q=1;//判断请求是否超过可用资//源数
if(q)
printf("没有足够的资源分配,请求失败!
\n");
else//请求满足条件
{
for(j=0;j{
available1[j]=available[j];
allocation1[i][j]=allocation[i][j];
need1[i][j]=need[i][j];
/*保存原已分配的资源数,仍需要的资源数和可用的资源数*/
available[j]=available[j]-request[j];
allocation[i][j]+=request[j];
need[i][j]=need[i][j]-request[j];
/*系统尝试把资源分配给请求的进程*/
}
print();
check();//检测分配后的安全性
if(r==0)//如果分配后系统不安全
{
for(j=0;j{
available[j]=available1[j];
allocation[i][j]=allocation1[i][j];
need[i][j]=need1[i][j];
}
printf("返回分配前资源数\n");
print();
}
}
}printf("\n你还要继续分配吗?
YorN?
\n");
//判断是否继续进行资源分配
c=getche();
}while(c=='y'||c=='Y');
}
}
voidcheck()//安全算法函数
{
intg,f,v=0,i,j;
intwork[m],a[m];
boolfinish[m];
r=1;
g=no1;
for(i=0;ifinish[i]=false;//初始化进程均没得到足够资源数并完成
for(i=0;iwork[i]=available[i];//work[i]表示可提供进程继续运行的各类资源数
do{
for(i=0;i{
if(finish[i]==false)
{
f=1;
for(j=0;jif(need[i][j]>work[j])
f=0;
if(f==1)
{
finish[i]=true;
a[v++]=i;//记录安全序列号
for(j=0;jwork[j]+=allocation[i][j];
}
}
}
g--;//每完成一个进程分配,未完成的进程数就减1
}while(g>0);
f=1;
for(i=0;i{
if(finish[i]==false)
{
f=0;
break;
}
}
if(f==0)//若有进程没完成,则为不安全状态
{
printf("系统处在不安全状态!
");
r=0;
}
else
{
printf("\n系统当前为安全状态,安全序列为:
\n");
for(i=0;iprintf("p%d",a[i]);//输出安全序列
}
}
voidprint()//输出函数
{
inti,j;
printf("\n");
printf("********************此时刻资源分配情况**********************\n");
printf("进程名/号|Max|Allocation|Need|\n");
for(i=0;i{
printf("p%d/%d",i,i);
for(j=0;j{printf("%d",max[i][j]);}
for(j=0;j{printf("%d",allocation[i][j]);}
for(j=0;j{printf("%d",need[i][j]);}
printf("\n");
}
printf("\n");
printf("各类资源可利用的资源数为:
");
for(j=0;j{printf("%d",available[j]);}
printf("\n");
}