操作系统课程设计银行家算法报告.docx
《操作系统课程设计银行家算法报告.docx》由会员分享,可在线阅读,更多相关《操作系统课程设计银行家算法报告.docx(18页珍藏版)》请在冰豆网上搜索。
![操作系统课程设计银行家算法报告.docx](https://file1.bdocx.com/fileroot1/2022-11/17/4e88d191-13af-42a4-96f2-e620b7d09e67/4e88d191-13af-42a4-96f2-e620b7d09e671.gif)
操作系统课程设计银行家算法报告
操作系统课程设计银行家算法报告
《操作系统--银行家算法》
课程设计报告
姓
名:
学
号:
班
级:
计科班
专
业:
计算机科学与技术
指导教师:
时
间:
20XX年
XX大学计算机科学与信息学院
目
录
1课程设计目的……………………………………………………12课程设计的要求…………………………………………………13课程设计题目描述………………………………………………24课程设计之银行家算法原理……………………………………25源程序结构分析及代码实现……………………………………46课程设计总结……………………………………………………25一、课程设计的目的操作系统是计算机系统的核心系统软件,它负责控制和管理整个系统的资源并组织用户协调使用这些资源,使计算机高效的工作。
《操作系统课程设计》是《操作系统》理论课的必要补充,是复习和检验所学课程的重要手段,本课程设计的目的是综合应用学生所学知识,通过实验环节,加深学生对操作系统基本原理和工作过程的理解,提高学生独立分析问题、解决问题的能力,增强学生的动手能力。
二、课程设计的要求1.分析设计内容,给出解决方案(要说明设计实现的原理,采用的数据结构)。
2.画出程序的基本结构框图和流程图。
3.对程序的每一部分要有详细的设计分析说明。
4.源代码格式要规范。
5.设计合适的测试用例,对得到的运行结果要有分析。
6.设计中遇到的问题,设计的心得体会。
7.按期提交完整的程序代码、可执行程序和课程设计报告。
三、课程设计题目描述
银行家算法是一种最有代表性的避免死锁的算法。
要解释银行家算法,必须先解释操作系统安全状态和不安全状态。
安全状态:
如果存在一个由系统中所有进程构成的安全序列P1,…,Pn,则系统处于安全状态。
安全状态一定是没有死锁发生。
不安全状态:
不存在一个安全序列。
不安全状态不一定导致死锁。
那么什么是安全序列呢?
安全序列:
一个进程序列{P1,…,Pn}是安全的,如果对于每一个进程Pi(1≤i≤n),它以后尚需要的资源量不超过系统当前剩余资源量与所有进程Pj(ji)当前占有资源量之和。
银行家算法:
我们可以把操作系统看作是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。
操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。
当进程在执行中继续申请资源时,先测试该进程已占用的资源数与本次申请的资源数之和是否超过了该进程对资源的最大需求量。
若超过则拒绝分配资源,若没有超过则再测试系统现存的资源能否满足该进程尚需的最大资源量,若能满足则按当前的申请量分配资源,否则也要推迟分配。
四、课程设计之银行家算法原理1.银行家算法的思路
先对用户提出的请求进行合法性检查,即检查请求的是不大于需要的,是否不大于可利用的。
若请求合法,则进行试分配。
最后对试分配后的状态调用安全性检查算法进行安全性检查。
若安全,则分配,否则,不分配,恢复原来状态,拒绝申请。
2.银行家算法中用到的主要数据结构可利用资源向量
int
Available[j]
j为资源的种类。
最大需求矩阵
int
Max[i][j]
i为进程的数量。
分配矩阵
int
Allocation[i][j]
需求矩阵
int
need[i][j]=Max[i][j]-Allocation[i][j]申请各类资源数量int
Requesti[j]
i进程申请j资源的数量工作向量
int
Work[x]
int
Finish[y]
3.银行家算法bank()进程i发出请求申请k个j资源,Requesti[j]=k
(1)检查申请量是否不大于需求量:
Requesti[j]=need[i,j],若条件不符重新输入,不允许申请大于需求量。
(2)检查申请量是否小于系统中的可利用资源数量:
Requesti[j]=available[i,j],若条件不符就申请失败,阻塞该进程,用goto语句跳转到重新申请资源。
(3)若以上两个条件都满足,则系统试探着将资源分配给申请的进程,并修改下面数据结构中的数值:
Available[i,j]=Available[i,j]-Requesti[j];Allocation[i][j]=Allocation[i][j]+Requesti[j];need[i][j]=need[i][j]-Requesti[j];(4)试分配后,执行安全性检查,调用safe()函数检查此次资源分配后系统是否处于安全状态。
若安全,才正式将资源分配给进程;否则本次试探分配作废,恢复原来的资源分配状态,让该进程等待。
(5)用do{…}while循环语句实现输入字符y/n判断是否继续进行资源申请。
4.安全性检查算法(safe()函数)
(1)设置两个向量:
工作向量Work,它表示系统可提供给进程继续运行所需的各类资源数目,在执行安全性算法开始时,Work=Available。
Finish,它表示系统是否有足够的资源分配给进程,使之运行完成。
开始时先做Finish[i]=0;当有足够的资源分配给进程时,再令Finish[i]=1。
(2)在进程中查找符合以下条件的进程:
条件1:
Finish[i]=0;条件2:
need[i][j]=Work[j]若找到,则执行步骤(3)否则,执行步骤(4)
(3)当进程获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行:
Work[j]=Work[j]+Allocation[i][j];Finish[i]=1;gotostep2;
(4)如果所有的Finish[i]=1都满足,则表示系统处于安全状态,否则,处于不安全状态。
五、源程序结构分析及代码实现
1.程序结构
程序共有以下五个部分:
(1).初始化chushihua():
用于程序开始进行初始化输入数据:
进程数量、资源种类、各种资源可利用数量、各进程的各种资源已分配数量、各进程对各类资源最大需求数等。
(2).当前安全性检查safe():
用于判断当前状态安全性,根据不同地方的调用提示处理不同。
(3).银行家算法bank():
进行银行家算法模拟实现的模块,调用其他各个模块进行银行家算法模拟过程。
(4).显示当前状态show():
显示当前资源分配详细情况,包括:
各种资源的总数量(all)、系统目前各种资源可用的数量、各进程已经得到的资源数量、各进程还需要的资源量。
(5).主程序main()逐个调用初始化、显示状态、安全性检查、银行家算法函数,使程序有序的进行。
2.数据结构程序使用的全局变量:
constintx=10,y=10;
//定义常量intAvailable[x];
//各种资源可利用的数量intAllocation[y][y];
//各进程当前已分配的资源数量intMax[y][y];
//各进程对各类资源的最大需求数intNeed[y][y];
//还需求矩阵intRequest[x];
//申请各类资源的数量intWork[x];
//工作向量,表系统可提供给进程运行所需各类资源数量intFinish[y];
//表系统是否有足够的资源分配给进程,0为否,1为是intp[y];
//存储安全序列inti,j;
//全局变量,主要用于循环语句中intn,m;
//n为进程的数量,m为资源种类数intl=0,counter=0;
3.函数声明voidchushihua(); //系统初始化函数voidsafe();
//安全性算法函数voidbank();
//银行家算法函数voidshow();
//输出当前资源分配情况
4.主函数main()intmain(){
cout……//显示程序开始提示信息
chushihua();
//初始化函数调用coutendlendl;
showdata();//输出初始化后的状态
//===判断当前状态的安全性===
safe();//安全性算法函数调用
if(ln){
cout“\n当前状态不安全,无法申请,程序退出!
!
!
!
!
“endl;
coutendl;
system(“pause“);
sign();//调用签名函数
return0;//
break;
}
else{
inti;//局部变量
l=0;cout“\n安全的状态!
!
!
“endl;
cout“安全序列为:
“;
coutendl“进程““(“p“)“;//输出安全序列,考虑显示格式,先输出第一个
for(i=1;ii++){
cout“==““进程““(“p[i]“)“;
}
for(i=0;ii++)Finish[i]=0;//所有进程置为未分配状态
coutendlendl;
}
bank();//银行家算法函数调用return0;
}
5.
操作系统银行家算法流程图:
初始化函数chushihua()开始
*****LE[[i]-=*****[i];*****ION[i]+=*****[i];NEED[i]-=*****[i];
输入进程的数量
输入资源种类数
输入个资源当前可用资源数
输入各进程当前已分配的资源数
输入各进程对各类资源的最大需求
输出提示:
输入有误,请重新输入
初始化函数chushihua()结束,银行家函数Bank()
提出请求*****[i]
Error;*****[i]=NEED[i]
*****[i]=*****LE[[i]
Error;
Safe();输出提示:
你的请求被拒!
*****LE[i]-=*****[i];*****ION[i]-=*****[i];NEED[i]+=*****[i];输出提示:
同意分配请求
是否进行再次分配
退出程序,银行家算法Bank()结束;
安全性算法Safe()开始
Work=*****LE;FINISH=false;
NEED[i]=WorkFINISH[i]=false;
Work+=*****ION[i];FINISH[i]=ture;
所有进程的FINISH=ture;输出提示:
系统是不安全的
安全,输出安全序列Returnture;
安全算法safe()结束
2.源程序代码:
#includeiostream.h#includestdio.h#includestdlib.h#includestring.h
//定义全局变量constintx=10,y=10;
//常量,便于修改intAvailable[x];
//各资源可利用的数量intAllocation[y][y];
//各进程当前已分配的资源数量intMax[y][y];
//各进程对各类资源的最大需求数intNeed[y][y];//尚需多少资源intRequest[x];//申请多少资源intWor