操作系统原理课程设计.docx
《操作系统原理课程设计.docx》由会员分享,可在线阅读,更多相关《操作系统原理课程设计.docx(18页珍藏版)》请在冰点文库上搜索。
操作系统原理课程设计
操作系统原理课程设计
——银行家算法模拟
指导老师:
周敏唐洪英杨宏雨
杨承玉傅由甲黄贤英
院系:
计算机学院计算机科学与技术
班级:
0237-6
学号:
**********
******
同组者:
杨志
时间:
2005/1/10---2005/1/14
银行家算法模拟
一、设计目的
本课程设计是学生学习完《计算机操作系统》课程后,进行的一次全面的综合训练,通过课程设计,让学生更好地掌握操作系统的原理及实现方法,加深对操作系统基础理论和重要算法的理解,加强学生的动手能力。
二、设计要求
银行家算法是避免死锁的一种重要方法,本实验要求用高级语言编写和调试一个简单的银行家算法程序。
加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。
从课程设计的目的出发,通过设计工作的各个环节,达到以下教学要求:
两人一组,每组从所给题目中任选一个(如自拟题目,需经教师同意),每个学生必须独立完成课程设计,不能相互抄袭,同组者文档不能相同;
设计完成后,将所完成的工作交由老师检查;
要求写出一份详细的设计报告。
三、设计内容
编制银行家算法通用程序,并检测所给状态的系统安全性。
1)银行家算法中的数据结构
假设有n个进程m类资源,则有如下数据结构:
可利用资源向量Available。
这是一个含有m个元素的数组,其中的每一个元素代表一类可利用的资源数目,其初始值是系统中所配置的该类全部可用资源的数目,其数值随该类资源的分配和回收而动态地改变。
Available[j]=K,则表示系统中现有Rj类资源K个。
最大需求矩阵Max。
这是一个n*m的矩阵,它定义了系统中n个进程中的每一个进程对m类资源的最大需求。
如果Max[i,j]=K,则表示进程i需要Rj类资源的最大数目为K。
分配矩阵Allocation。
这也是一个n*m的矩阵,它定义了系统中每一类资源当前已分配给没一进程的资源数。
如果Allocation[i,j]=K,则表示进程i当前已分得Rj类资源的数目为K。
需求矩阵Need。
这也是一个n*m的矩阵,用以表示每一个进程尚需的各类资源数。
如果Need[i,j]=K,则表示进程i还需要Rj类资源K个,方能完成其任务。
上述三个矩阵存在如下关系:
Need[i,j]=Max[i,j]-Allocation[i,j]
2)银行家算法
设进程I提出请求Request[N],则银行家算法按如下规则进行判断。
(1)如果Request[N]<=NEED[I,N],则转
(2);否则,出错。
(2)如果Request[N]<=AVAILABLE,则转(3);否则,出错。
(3)系统试探分配资源,修改相关数据:
AVAILABLE=AVAILABLE-REQUEST
ALLOCATION=ALLOCATION+REQUEST
NEED=NEED-REQUEST
(4)系统执行安全性检查,如安全,则分配成立;否则试探险性分配作废,系统恢复原状,进程等待。
3)安全性检查
(1)设置两个工作向量WORK=AVAILABLE;FINISH[M]=FALSE
(2)从进程集合中找到一个满足下述条件的进程,
FINISH[i]=FALSE
NEED<=WORK
如找到,执行(3);否则,执行(4)
(3)设进程获得资源,可顺利执行,直至完成,从而释放资源。
WORK=WORK+ALLOCATION
FINISH=TRUE
GOTO2
(4)如所有的进程Finish[M]=true,则表示安全;否则系统不安全。
四、算法实现
通过程序实现定义的进程,为各进程分配资源,具体过程是:
首先在程序中定义了3类资源,数量分别为10,5,7。
然后定义进程p0,p1,p2,p3,p4,接着为各进程申请各资源,然后在程序执行并比较申请的资源数量与各资源所剩数量,若前者大于后者则申请失败,反之则成功。
同时该程序可以撤消新建进程,也可以查看资源分配情况。
五、程序流程图
银行家算法程序流程图如下:
六、模块间调用关系
本程序的主要函数模块为:
voidchangdata(intk)//为进程申请资源并修改数据
intchkerr(ints)//检查分配是否成功
voidshowdata()//查看资源情况
voidmain()//主函数
其中主函数中调用了voidchangdata(intk)、intchkerr(ints)、voidshowdata()函数模块。
七、源程序清单
#include"string.h"
#include"iostream.h"
#defineM5//总进程数
#defineN3//总资源数
#defineFALSE0
#defineTRUE1
//M个进程对N类资源最大资源需求量
intMAX[M][N]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}};
//系统可用资源数
intAVAILABLE[N]={10,5,7};
//M个进程已经得到N类资源的资源量
intALLOCATION[M][N]={{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0}};
//M个进程还需要N类资源的资源量
intNEED[M][N]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}};
intRequest[N]={0,0,0};
voidmain()
{
inti=0,j=0;
charflag='Y';
voidshowdata();
voidchangdata(int);
voidrstordata(int);
intchkerr(int);
showdata();
while(flag=='Y'||flag=='y')
{
i=-1;
while(i<0||i>=M)
{
cout<<"请输入需申请资源的进程号(从0到"<):
";
cin>>i;
if(i<0||i>=M)cout<<"输入的进程号不存在,重新输入!
"<}
cout<<"请输入进程"<
for(j=0;j{
cout<<"资源"<";
cin>>Request[j];
if(Request[j]>NEED[i][j])
{
cout<<"进程"<
";
cout<<"申请不合理,出错!
请重新选择!
"<flag='N';
break;
}
else
{
if(Request[j]>AVAILABLE[j])
{
cout<<"进程"<
";
cout<<"申请不合理,出错!
请重新选择!
"<flag='N';
break;
}
}
}
if(flag=='Y'||flag=='y')
{
changdata(i);
if(chkerr(i))
{
rstordata(i);
showdata();
}
else
showdata();
}
else
showdata();
cout<cout<<"是否继续银行家算法演示,按'Y'或'y'键继续,按'N'或'n'键退出演示:
";
cin>>flag;
}
}
voidshowdata()
{
inti,j;
cout<<"系统可用的资源数为:
"<cout<<"";
for(j=0;j"<cout<//cout<//cout<<"各进程资源的最大需求量:
"<//for(i=0;i//{
//cout<<"进程"<
";
//for(j=0;j"<//cout<//}
cout<cout<<"各进程还需要的资源量:
"<for(i=0;i{
cout<<"进程"<
";
for(j=0;j"<cout<}
cout<cout<<"各进程已经得到的资源量:
"<for(i=0;i{
cout<<"进程"<
";
for(j=0;j"<cout<}
cout<};
voidchangdata(intk)
{
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)
{
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)
{
intWORK,FINISH[M],temp[M];
inti,j,k=0;
for(i=0;ifor(j=0;j{
WORK=AVAILABLE[j];
i=s;
while(i{
if(FINISH[i]==FALSE&&NEED[i][j]<=WORK)
{
WORK=WORK+ALLOCATION[i][j];
FINISH[i]=TRUE;
temp[k]=i;
k++;
i=0;
}
else
{
i++;
}
}
for(i=0;iif(FINISH[i]==FALSE)
{
cout<cout<<"系统不安全本次资源申请不成功"<cout<return1;
}
}
cout<cout<<"经安全性检查,系统安全,本次分配成功。
"<cout<cout<<"本次安全序列:
";
for(i=0;i";
cout<return0;
};
八、运行结果
操作说明:
开始运行界面,如图:
根据提示输入本次申请资源的进程号和申请资源数,如图:
如资源申请成功,显示本次的申请后的一个进程安全执行序列。
如图:
如对I类申请数大于进程还需要I类资源的资源量或大于系统可用I类资源数。
如图:
对I类申请数大于进程还需要I类资源的资源量或大于系统可用I类资源数。
如图:
如资源申请不成功,则恢复申请前的资源状况。
如图:
九、实验总结
本实验所使用的软件工具为:
MicrosoftVisualC++6.0。
操作系统是计算机系统中必不可少的系统软件。
它是计算机系统中各种资源的管理者和各种活动的组织者、指挥者。
银行家算法是为了使系统保持安全状态。
我们可以把操作系统看作是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。
操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。
当进程在执行中继续申请资源时,先测试该进程已占用的资源数与本次申请的资源数之和是否超过了该进程对资源的最大需求量。
若超过则拒绝分配资源,若没有超过则再测试系统现存的资源能否满足该进程尚需的最大资源量,若能满足则按当前的申请量分配资源,否则也要推迟分配。
通过上面这个例子,我们看到银行家算法确实能保证系统时时刻刻都处于安全状态,但它要不断检测每个进程对各类资源的占用和申请情况,需花费较多的时间。
本次实验为时五天多,总体上来说实验是比较成功的。
由于时间仓促,做的不是很完美,敬请老师谅解。
十、参考资料
《计算机操作系统》西安电子科技大学出版社汤小丹哲风屏
《计算机操作系统原理及应用上机指导》重庆工学院计算机学院
《C++语言程序设计》清华大学出版社郑莉董渊