操作系统课程设计.docx
- 文档编号:29447874
- 上传时间:2023-07-23
- 格式:DOCX
- 页数:19
- 大小:242.69KB
操作系统课程设计.docx
《操作系统课程设计.docx》由会员分享,可在线阅读,更多相关《操作系统课程设计.docx(19页珍藏版)》请在冰豆网上搜索。
操作系统课程设计
操作系统课程设计
————————————————————————————————作者:
————————————————————————————————日期:
银行家算法
1.课程设计的目的
了解多道程序系统中,多个进程并发执行的资源分配,及死锁的产生原因、必要条件和处理死锁的基本方法,掌握预防死锁的方法,系统安全状态的基本概念,了解银行家算法,及资源在进程并发执行中的资源分配策略,并且理解死锁避免在当前计算机系统不常使用的原因。
根据设计题目的要求,充分地分析和理解题目,叙述系统的要求,明确程序要求实现的功能以及限制条件。
明白自己需要用代码实现的功能,清楚编写每部分代码的目的,做到有的放矢,有条理不遗漏的用代码实现银行家算法。
2。
设计方案论证
2。
1题目描述
银行家算法是一种最有代表性的避免死锁的算法。
在多道程序系统中,多个进程的并发执行来改善系统的资源利用率,提高系统的吞吐量,但可能发生一种危险—-死锁。
所谓死锁(Deadlock),是指多个进程在运行过程中因争夺资源而造成的一种僵局(DeadlyEmbrace),当进程处于这种状态时,若无外力作用,他们都无法在向前推进。
要预防死锁,有摒弃“请求和保持”条件,摒弃“不剥夺”条件,摒弃“环路等待”条件等方法.但是,在预防死锁的几种方法之中,都施加了较强的限制条件;而在避免死锁的方法中,所施加的限制条件较弱,有可能获得令人满意的系统性能。
在该方法中把系统状态分为安全状态和不安全状态,便可避免死锁的发生。
要解释银行家算法,必须先解释操作系统安全状态和不安全状态.安全状态是指系统能按照某种进程顺序{P1,P2,…,Pn}(称{P1,P2,…,Pn}序列为安全序列),来为每个进程Pi分配其所需资源,直至满足每个进程对资源的最大需求,使每个进程都可以顺利完成。
安全状态一定没有死锁发生。
如果系统无法找到这样一个安全序列,则称系统处于不安全状态。
安全序列:
一个进程序列{P1,…,Pn}是安全的,如果对于每一个进程Pi(1≤i≤n),它以后尚需要的资源量不超过系统当前剩余资源量与所有进程Pj(j〈i)当前占有资源量之和,则称此进程序列{P1,P2,…,Pn}是安全的,称作安全序列.
银行家算法:
我们可以把操作系统看作是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款.操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配.当进程在执行中继续申请资源时,先测试该进程已占用的资源数与本次申请的资源数之和是否超过了该进程对资源的最大需求量.若超过则拒绝分配资源,若没有超过则再测试系统现存的资源能否满足该进程尚需的最大资源量,若能满足则按当前的申请量分配资源,否则也要推迟分配。
2.2设计思路
2.2。
1算法思路
先对用户提出的请求进行合法性检查,即检查请求是否大于需要的,是否大于可利用的。
若请求合法,则进行预分配,对分配后的状态调用安全性算法进行检查。
若安全,则分配;若不安全,则拒绝申请,恢复到原来的状态,拒绝申请。
2。
2。
2银行家算法中的数据结构
(1)可利用资源向量Available。
这是一个含有m个元素的数组,其中的每一个元素代表一类可利用的资源数目,其初始值是系统中所配置的该类全部可用资源的数目,其数值随该类资源的分配和回收而动态地改变。
如果Available[j]=K,则表示系统中现有R类资源K个
(2)最大需求矩阵Max。
这是一个n*m的矩阵,它定义了系统中n个进程对m类资源的最大需求。
如果Max[i,j]=K,则表示进程i需要R类资源的数目为K.
(3)分配矩阵Allocation。
这也是一个n*m的矩阵,它定义了系统中每一类资源当前已分配给每一进程的资源数。
如果Allocation[i,j]=K,则表示进程i当前已分得R类资源的数目为K.
(4)需求矩阵Need[][].这也是一个n*m的矩阵,用以表示每一个进程尚需的各类资源数。
如果Need[i,j]=K,则表示进程i还需要R类资源K个,才能完成其任务.
上述矩阵存在关系:
Need[i,j]=Max[i,j]﹣Allocation[i,j]
2.2。
3银行家算法
设Requesti是进程Pi的请求向量,Requesti=K表示进程Pi需要K个j类资源。
Pi发出资源请求后,按下列步骤进行检查:
(1)如果requesti[j]≤need[i,j],转向步骤
(2);否则认为错误,所需要的资源数已超过它所宣布的最大值.
(2)如果requesti[j]≤available[j],转向步骤(3);否则,表示尚无足够资源,Pi需等待。
(3)系统尝试将资源分配给进程Pi,并修改下面数据结构中的数值:
Available[j]:
=Available[j]—Requesti[j];
Allocation[i,j]:
=Allocation[i,j]+Requesti[j];
Need[i,j]:
=Need[i,j]—Requesti[j];
(4)执行安全性算法,检查此次资源分配后,系统是否出于安全状态。
若安全,才正式将资源分配给进程Pi,已完成本次分配;否则,将本次试探分配作废,恢复原来的资源分配状态,让Pi等待。
2.1。
4安全性检查算法
(1)设置两个向量:
①工作向量work:
表示系统可提供给进程继续运行所需的各类资源数目,执行安全性算法开始时work:
=available。
②finish标志:
表示系统是否有足够的资源分配给进程,使之运行完成。
初始化finish[i]:
=false;有足够资源分配给进程时,令finish[i]:
=true。
(2)从进程集合中找到一个能满足下述条件的进程
①finish[i]=false;
②Need[i,j]≤work[j];找到执行步骤(3),否则执行步骤(4)。
(3)当进程Pi获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行:
Work[j]:
=work[i]+allocation[i,j];
Finish[i]:
=true;
Gotostep②;
(4)如果所有进程的finish[i]=true都满足,则表示系统处于安全状态;否则,
系统处于不安全状态.
2。
3设计方法
2。
3.1基本要求
(1)可以输入某系统的资源以及T0时刻进程对资源的占用及需求情况的表项,以及T0时刻系统的可利用资源数。
(2)对T0时刻的进行安全性检测,即检测在T0时刻该状态是否安全。
(3)进程申请资源,用银行家算法对其进行检测,分为以下三种情况:
A。
所申请的资源大于其所需资源,提示分配不合理不予分配并返回。
B.所申请的资源未大于其所需资源,但大于系统此时的可利用资源,提示分配不合理不予分配并返回。
C.所申请的资源未大于其所需资源,亦未大于系统此时的可利用资源,预分配并进行安全性检查:
a.预分配后系统是安全的,将该进程所申请的资源予以实际分配并打印后返回。
b。
与分配后系统进入不安全状态,提示系统不安全并返回.
(4)对输入进行检查,即若输入不符合条件,应当报错并返回重新输入。
2。
3.2流程图:
(1)银行家算法,如图1所示。
Y
N
N
Y
图1银行家算法流程图
(2)安全性算法,如图2所示.
Y
N
Y
N
Y
Y
Y
N
图2安全性算法流程图
2。
3.3调试结果
(1)资源分配情况,如图3所示。
图3资源分配情况
(2)安全判断,如图4所示.
图4安全判断
(3)为1分配资源,如图5所示。
图5为1分配资源
(4)为4分配资源,如图6所示。
图6为4分配资源
(5)为0分配资源,如图7所示。
图7为0分配资源
3.设计体会
通过本次课程设计,我收获很多,首先我对十大算法之一的银行家算法有了清楚的认识,认真分析了进程产生死锁的原因,了解为什么要进行死锁的避免,掌握银行家算法的数据结构,了解了算法的执行过程,加深了对银行家算法的理解。
其次,我对编程有了个清楚的认识,编程就是将先现实中的规律模拟成电脑能运行的程序,方便我们的工作和学习生活。
最后,我也清楚认识到理论联系实际重要性,动手操作能力和编程逻辑思维能力的提高的重要性,对自己所编写的程序要学会调试,不断改进,向更加全面的方向考虑,同时也要考虑程序的可行性和健壮性。
总而言之,我在编写程序方面有了更加深入的认识。
不同的算法可以实现相同的功能,这是我从本次实验中深深体会到的,因而在今后的学习中遇到问题我会尝试着用的不同的方法来解决,有时候换个角度可以很方便的解决问题
课程设计是我们对专业课程知识综合应用的实践训练,只有认真的进行课程设计,学会脚踏实地认真思考学习,课程设计是培养我们综合运用所学知识,发现、提出、分析和解决实际问题、锻炼实践能力的重要环节,是对我们实际能力的考察过程.
4。
参考文献
[1]汤小丹,梁红兵,哲凤屏,汤子瀛。
计算机操作系统。
[M]西安:
西安电子科技大学出版社,2007.150-220
[2]严蔚敏,吴伟民.数据结构。
[M]北京:
清华大学出版社,2006.14—99
[3]赵莉,杨国梁,孙喁喁,徐飞。
Java程序设计教程。
[M]西安:
西安科技大学出版社,2009。
25-99
[4]刘璟等.高级语言C++程序设计。
[M]西安电子科技大学出版社,2009.66-102
附录
#include〈iostream。
h>
#include
#defineFalse0
#defineTrue1
charname[50]={0};//资源名称
intMax[50][50]={0};//进程所需各类资源的最大需求
intAllocation[50][50]={0};//系统已分配资源
intNeed[50][50]={0};//进程需求资源
intAvailable[50]={0};//系统可用资源向量
intRequest[50]={0};//进程请求资源向量
intWork[50]={0};//存放系统可提供进程继续运行所需各类资源数目
inttemp[50]={0};//存放安全序列
intb[50]={0};//系统各类资源总数
intM=50;//进程的最大数目为50
intN=50;//资源的最大数目为50
voiddisplay()
{
inti,j,number,m,n;
charming;
inta[50]={0};
cout<〈”请输入系统中资源的种类:
”;
cin〉>n;
N=n;
for(i=0;i〈n;i++){
cout〈〈”资源”〈
";
cin〉〉ming>〉number;
name[i]=ming;
b[i]=number;
}
cout<<"请输入进程的数量:
”;
cin〉〉m;
M=m;
cout〈<”请输入各进程的最大需求(”〈〈m<<"*"< ”< for(i=0;i for(j=0;j cin〉>Max[i][j]; cout〈〈”请输入各进程的已分配(”<〈m〈〈”*"< "〈〈endl; for(i=0;i for(j=0;j cin>〉Allocation[i][j]; Need[i][j]=Max[i][j]—Allocation[i][j]; if(Need[i][j]〈0){ cout〈〈”您输入的第”〈 ”<〈endl; j-—; continue; } } cout<〈"目前可用的资源: "< for(i=0;i〈N;i++) cout〈〈name[i]〈<""; cout〈 for(j=0;j〈N;j++){ for(i=0;i a[j]+=Allocation[i][j]; } Available[j]=b[j]-a[j]; } for(i=0;i〈N;i++) cout< cout< } voidprint()//显示资源分配情况 { inti,j; cout<〈”MaxAllocationNeed”< cout<〈”进程名”; for(j=0;j<3;j++){ for(i=0;i cout< cout〈<""; } cout<〈endl; for(i=0;i cout<<””〈〈i<〈"”; for(j=0;j cout〈 cout<<"”; for(j=0;j cout〈 cout<〈””; for(j=0;j〈N;j++) cout〈 cout< } } intchangdata(inti)//进行资源分配 { intj; for(j=0;j〈M;j++){ Available[j]=Available[j]-Request[j]; Allocation[i][j]=Allocation[i][j]+Request[j]; Need[i][j]=Need[i][j]—Request[j]; } return1; } intsafe(intnum,intM,intN)//安全性算法对系统进行分析 { inti,j,k=0,m,apply,Finish[5]={0}; intflag; intflag1; for(j=0;j {Work[j]=Available[j];} for(flag=0;flag for(i=0;i〈M;i++){ apply=0; for(j=0;j if(Finish[i]==False&&Need[i][j]〈=Work[j]){ apply++; if(apply==N){ for(m=0;m〈N;m++){ Work[m]=Work[m]+Allocation[i][m];//变分配数 } Finish[i]=True; temp[k]=i; k++; } } } } } for(i=0;i if(Finish[i]==False){ cout〈〈”系统不安全"〈 for(i=0;i〈N;i++){ Available[i]=Available[i]+Request[i]; Allocation[num][i]=Allocation[num][i]-Request[i]; Need[num][i]=Need[num][i]+Request[i]; } return-1; } } cout〈〈”系统是安全的! "< cout<<"分配的序列: ”; for(i=0;i cout< if(i〈M-1)cout〈〈”->”; } cout< for(i=0;i〈N;i++){ if(Max[num][i]==Allocation[num][i]) {flag1=1;} else{ flag1=0; break; } } if(flag1==1){ for(i=0;i〈N;i++){ Available[i]=Available[i]+Allocation[num][i]; Allocation[num][i]=0; } } return0; } voidbank(intM,intN)//银行家算法对申请资源对进行判定 { charch; inti=0,j=0; ch='y'; cout<〈”请输入要求分配的资源进程号(0—”< ”; cin>>i;//输入须申请的资源号 cout<<"请输入进程"< "〈〈endl; for(j=0;j〈N;j++){ cout〈〈name[j]〈<”: "; cin>〉Request[j];//输入需要申请的资源 } for(j=0;j〈N;j++){ if(Request[j]>Need[i][j]){//判断申请是否大于需求,若大于则出错 cout<〈"进程"〈 cout〈<”分配不合理,不予分配! ”〈 ch=’n'; break; } else{ if(Request[j]>Available[j]){//判断申请是否大于当前资源,若大于则出错 cout<<”进程"<〈i〈<”申请的资源大于系统现在可利用的资源"; cout<〈"分配出错,不予分配! "< ch=’n’; break; } } } if(ch=='y'){ changdata(i);//根据进程需求量变换资源 print();//根据进程需求量显示变换后的资源 safe(i,M,N);//根据进程需求量进行银行家算法判断 } } voidmain() { inti; display(); print(); safe(0,M,N); for(i=0;i〈M;i++) {bank(M,N);} print(); }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 课程设计