操作系统银行家算法课程设计.docx
《操作系统银行家算法课程设计.docx》由会员分享,可在线阅读,更多相关《操作系统银行家算法课程设计.docx(20页珍藏版)》请在冰点文库上搜索。
操作系统银行家算法课程设计
成绩
课程设计报告
题目银行家算法
课程名称操作系统课程设计
院部名称信息技术学院
专业计算机科学与技术
班级M11计算机科学与技术II
学生姓名
学号
课程设计地点A205
课程设计学时20
指导教师李莉
金陵科技学院教务处制
目录
一、课程设计的目的和要求2
1、目的2
2、要求2
二、系统需求分析…………………………………………………………………………………2
三、概要设计2
3.1程序主要流程2
3.2程序函数调用关系4
四、详细设计4
4.1数据结构描述4
五、调试与测试5
5.1程序初始界面5
5.2测试创建进程功能5
六、结论与体会…………………………………………………………………………………….7
七、参考文献8
八、附件:
源程序清单8
一、课程设计的目的和要求
1.1目的
加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。
1.2要求
用高级语言编写和调试一个简单的银行家算法程序。
二、系统需求分析
银行家算法是为了使系统保持安全状态。
把操作系统看作是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。
操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。
当进程在执行中继续申请资源时,先测试该进程已占用的资源数与本次申请的资源数之和是否超过了该进程对资源的最大需求量。
若超过则拒绝分配资源,若没有超过则再测试系统现存的资源能否满足该进程尚需的最大资源量,若能满足则按当前的申请量分配资源,否则也要推迟分配。
所以银行家算法确实能保证系统时时刻刻都处于安全状态。
三、概要设计
3.1程序主要流程
系统中的所有进程进入进程集合,在安全状态下系统收到一个进程的资源请求后,先把资源试探性分给它。
现在,系统用剩下的可用资源和每个进程集合中其它进程还要的资源数作比较,在进程集合中找到剩余资源能满足最大需求量的进程,从而,保证这个进程运行完毕并归还全部资源。
这时,把这个进程从集合中取掉,系统的剩余资源更多了,再反复执行上述操作步骤。
最后,检查进程集合,若为空表明本次申请可行,系统处于安全状态,可真正实施本次分配;否则,只要有进程执行不完,系统便处于不安全状态,本次资源分配暂不实施,让申请进程等待。
3.2程序函数调用关系
下图为银行家算法的函数之间的调用关系,主函数调用子函数,子函数也可以调用子函数,进行进程的初始化,排序等等。
函数调用关系图
四、详细设计
4.1数据结构描述
1.数据结构
假设有n个进程m类资源,则有如下数据结构:
MAX[n*m]n个进程对m类资源的最大需求量
AVAILABLE[m]系统可用资源数
ALLOCATION[n*m]n个进程已经得到m类资源的资源量
NEED[n*m]n个进程还需要m类资源的资源量
2.银行家算法
设进程I提出请求Request[m],则银行家算法按如下规则进行判断。
(1)如果Request[m]<=NEED[I,m],则转
(2);否则,出错。
(2)如果Request[m]<=AVAILABLE,则转(3);否则,出错。
(3)系统试探分配资源,修改相关数据:
AVAILABLE=AVAILABLE-REQUEST
ALLOCATION=ALLOCATION+REQUEST
NEED=NEED-REQUEST
(4)系统执行安全性检查,如安全,则分配成立;否则试探险性分配作废,系统恢复原状,进程等待。
3.安全性检查
(1)设置两个工作向量WORK=AVAILABLE;FINISH[n]=FALSE
(2)从进程集合中找到一个满足下述条件的进程,
FINISH[i]=FALSE
NEED<=WORK
如找到,执行(3);否则,执行(4)
(3)设进程获得资源,可顺利执行,直至完成,从而释放资源。
WORK=WORK+ALLOCATION
FINISH=TRUE
GOTO2
(4)如所有的进程Finish[n]=true,则表示安全;否则系统不安全。
五、调试过程
5.1运行程序初始界面
运行程序,显示初始界面如图5-1所示。
输入进程的个数。
图5-1
5.2测试创建进程功能
输入进程数2:
图5-2
输入资源种类、资源总数、各进程所需最大资源量和已占有量:
图5-3
资源的分配情况:
图5-4
申请资源的进程及申请数目:
图5-5
分配完成是佛继续操作:
图5-6
可继续执行分配:
图5-7
六、结论与体会
操作系统是计算机系统中必不可少的系统软件。
它是计算机系统中各种资源的管理者和各种活动的组织者、指挥者。
银行家算法是为了使系统保持安全状态。
我们可以把操作系统看作是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。
操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。
当进程在执行中继续申请资源时,先测试该进程已占用的资源数与本次申请的资源数之和是否超过了该进程对资源的最大需求量。
若超过则拒绝分配资源,若没有超过则再测试系统现存的资源能否满足该进程尚需的最大资源量,若能满足则按当前的申请量分配资源,否则也要推迟分配。
通过本次课设,对进程的调度有了更多的理解,对调度算法也多了些理解。
在实验中,我写程序时也出现了很多错误,我也明白了进程的高度远远不是那么简单,我现在写的只是个模拟算法,而不是真正的创建进程,就已经有如此大的难度,操作系统的知识我还只掌握了皮毛,我会继续认真学习相关知识充实自己。
七、参考文献:
[1]汤子瀛等.《计算机操作系统》.西安:
西安电子科技大学出版社,2006.10.
[2]刘璟等.《高级语言c++程序设计》.北京:
高等教育出版社,2006.03.
相关工具:
MicrosoftVisualC++6.0
BloodshedDev-C++
八、附录
源程序
#include
#include
#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;
cout<<"\n\n各种资源的总数量(all):
\n";
for(j=0;jcout<<"资源"<"<cout<cout<<"系统目前各种资源可用的数为(available):
"<for(j=0;jcout<<"资源"<"<cout<cout<<"各进程还需要的资源量(need):
"<cout<<"进程";
for(i=0;icout<<"资源"<
for(i=0;i{
cout<<"进程p"<
";
for(j=0;jcout<cout<}
cout<cout<<"各进程已经得到的资源量(allocation):
"<cout<<"进程";
for(i=0;icout<<"资源"<
for(i=0;i{
cout<<"进程p"<
";
for(j=0;jcout<cout<}
cout<}
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)
{
cout<cout<<"系统不安全!
!
!
本次资源申请不成功!
!
!
"<return1;
}
}
cout<cout<<"经安全性检查,系统安全,本次分配成功。
"<return0;
}
voidbank()//银行家算法
{
inti=0,j=0;
charflag='Y';
while(flag=='Y'||flag=='y')
{
i=-1;
while(i<0||i>=M)
{
cout<<"请输入需申请资源的进程号(从P1到P"<):
"<cout<<"p";
cin>>i;
if(i<1||i>M)
cout<<"输入的进程号不存在,重新输入!
"<}
cout<<"请输入进程P"<
"<for(j=0;j{
cout<<"资源"<";
cin>>Request[j];
if(Request[j]>NEED[i-1][j])//若请求的资源数大于进程还需要i类资源的资源量j
{
cout<<"进程P"<
"<cout<<"申请不合理,出错!
请重新选择!
"<flag='N';
break;
}
else
{
if(Request[j]>AVAILABLE[j])//若请求的资源数大于可用资源数
{
cout<<"进程P"<
"<cout<<"申请不合理,出错!
请重新选择!
"<flag='N';
break;
}
}
}
if(flag=='Y'||flag=='y')
{
changdata(i-1);//调用changdata(i)函数,改变资源数
if(chkerr(i-1))//若系统安全
{
rstordata(i-1);//调用rstordata(i)函数,恢复资源数
showdata();//输出资源分配情况
}
}//输出资源分配情况
cout<<"是否继续银行家算法演示,按'Y'或'y'键继续,按'N'或'n'键退出演示:
"<cin>>flag;
if(flag=='Y'||flag=='y')
showdata();
else
break;
}
}
voidmain()//主函数
{
inti=0,j=0,p;
cout<<""<cout<<"/**************银行家算法**************/"<cout<<"---------------------欢迎使用--------------------"<cout<<"注:
请按照算法提示操作"<cout<<"有问题请联系管理员"<cout<<"1234567890"<cout<<""<Sleep(2000);//简单的停顿两秒
system("cls");
cout<<"请输入总进程数:
";
cin>>M;
cout<<"请输入总资源种类:
";
cin>>N;
cout<<"请输入总资源数(all_resource):
";
for(i=0;icin>>ALL_RESOURCE[i];
cout<<"依次输入各进程所需要的最大资源数量(max):
"<for(i=0;i{
for(j=0;j{
do
{
cin>>MAX[i][j];
if(MAX[i][j]>ALL_RESOURCE[j])
cout<"<}while(MAX[i][j]>ALL_RESOURCE[j]);
}
}
cout<<"依次输入各进程已经占据的资源数量(allocation):
"<for(i=0;i{
for(j=0;j{
do
{
cin>>ALLOCATION[i][j];
if(ALLOCATION[i][j]>MAX[i][j])
cout<}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();
}