操作系统课设.docx
- 文档编号:6080254
- 上传时间:2023-01-03
- 格式:DOCX
- 页数:14
- 大小:104.39KB
操作系统课设.docx
《操作系统课设.docx》由会员分享,可在线阅读,更多相关《操作系统课设.docx(14页珍藏版)》请在冰豆网上搜索。
操作系统课设
《操作系统》
课程设计报告
题目:
银行家算法
学部:
信息科学与技术学部
专业:
计算机科学与技术
班级:
10级2班
姓名:
杨茜
学号:
100104021133
指导老师:
秦明、丁忠俊
设计时间:
2013-02
目录
一、设计目的3
二、设计内容3
三、银行家算法的基本思想3
(一)死锁3
(二)系统安全状态4
(三)银行家算法避免死锁4
1、银行家算法中的数据结构4
2、银行家算法5
3、安全性算法5
四、系统模块间关系图,流程图6
五、输入、输出数据7
六、源程序7
七、心得体会11
银行家算法设计与实现
一、设计目的
本课程设计是学习完《操作系统原理》课程后,进行的一次全面的综合训练。
通过这次课程设计,让我们更好地掌握操作系统的原理及实现方法,加深对操作系统基础理论和重要算法的理解,加强动手能力。
二、设计内容
编制银行家算法通用程序,并检测所给状态的系统安全性。
实验环境:
环境不限,可以在vc和java等环境下完成,操作系统平台可以选择Windows,Linux等平台。
三、银行家算法的基本思想
(一)死锁
在多道程序系统中,虽可借助于多个进程的并发执行,来改善系统的资源利用率,提高系统的吞吐量,但可能发生一种危险——死锁。
所谓死锁,是指多个进程在运行过程中因争夺资源而造成的一种僵局,当进程处于这种僵持状态时,若无外力作用,它们都将无法再向前推进。
产生死锁的原因可归结为如下两点:
(1)竞争资源。
(2)进程间推进顺序非法。
死锁的发生必须具备下列四个必要条件:
(1)互斥条件。
(2)请求和保持条件。
(3)不剥夺条件。
(4)环路等待条件。
(二)系统安全状态
避免死锁的实质在于:
系统在进行资源分配时,如何使系统不进入不安全状态。
所谓安全状态,是指系统能按某种进程顺序(P1,P2,……,Pn)(称
如果系统无法找到这样一个安全序列,则称系统处于不安全状态。
(三)银行家算法避免死锁
为实现银行家算法,系统中必须设置若干数据结构。
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]
2、银行家算法
设Request[i]是进程Pi的请求向量,如果Request[i,j]=K,表示进程需要K个Rj类型的资源。
当Pi发出资源请求后,系统按下述步骤进行检查:
(1)如果Request[i,j]<=Need[i,j],便转向步骤
(2);否则认为出错,因为它所需要的资源数已超过它所宣布的最大值。
(2)如果Request[i,j]<=Available[j],便转向步骤(3);否则,表示尚无足够资源,Pi须等待。
(3)系统尝试着把资源分配给进程Pi,并修改下面数据结构中的数值:
Available[j]=Available[j]-Request[i,j];
Allocation[i,j]=Allocation[i,j]+Request[i,j];
Need[i,j]=Need[i,j]-Request[i,j];
(4)系统执行安全性算法,检查此次资源分配后,系统是否处于安全状态。
若安全,才正式将资源分配给进程Pi,以完成本次分配;否则,将本次的尝试分配作废,恢复原来的资源分配状态,让进程Pi等待。
3、安全性算法
系统所执行的安全性算法可描述如下:
(1)设置两个向量:
①工作向量Work:
它表示系统可提供给进程继续运行所需要的各类资源数目,它含有m个元素,在执行安全算法开始时,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[j]+Allocation[i,j];
Finish[i]=true;
gotostep2;
(4)如果所有进程的Finish[i]=true都满足,则表示系统处于安全状态;否则,系统处于不安全状态。
四、系统模块间关系图、流程图
NoAllNo
Yes
No
Yes
5、输入、输出数据
Process
Max
Allocation
Available
P0
0044
0032
1622
P1
2750
1000
P2
361010
1354
P3
0984
0332
P4
06610
0014
输入进程P2提出请求(1,2,2,2)
输出如图:
6、源程序
/***************************/
/*专业:
10计科2班*/
/*姓名:
杨茜*/
/*学号:
100104021133*/
/*课设:
银行家算法*/
/***************************/
#include
#include
#defineMAX_PROCESS32//最大进程数
#defineMAX_COURCE64//最大资源类别
intMAX_FACT_PROCESS;//实际总进程数
intMAX_FACT_COURCE;//实际资源类别数
intAvailable[MAX_COURCE];//可利用资源向量
intMax[MAX_PROCESS][MAX_COURCE];//最大需求矩阵
intAllocation[MAX_PROCESS][MAX_COURCE];//分配矩阵
intNeed[MAX_PROCESS][MAX_COURCE];//需求矩阵
intRequest_PROCESS;//发出请求的进程
intRequest_COURCE_NEMBER[MAX_COURCE];//请求资源数
boolFinish[MAX_COURCE];//表示系统是否有足够的资源分配给进程的标识数组
intAn[MAX_PROCESS];//安全序列
/*安全性算法*/
boolAnquan()
{
inti=0;
intt=0;
intWork[MAX_COURCE];
for(i=0;i Work[i]=Available[i]; boolFinish[MAX_PROCESS]={false}; intn=0; intm=0; while(true)//找出依次的安全进程 { for(i=0;i { for(t=0;t if(false==Finish[i]&&Need[i][t]<=Work[t])//进程i的资源需求是否满足 ; else//有不满足的条件就退出 break; } //for是否正常结束 if(t==MAX_FACT_COURCE)//不是从else跳出的 { An[m]=i; m++; t=0; while(t { Work[t]=Work[t]+Allocation[i][t];//释放进程的资源 t++; } Finish[i]=true; i=-1;//进程从头开始循环 } } if(m==MAX_FACT_PROCESS)//进程分配完毕找到安全序列 returntrue; else returnfalse; } } /*需求请求*/ boolRq() { inty; for(y=0;y { if(Request_COURCE_NEMBER[y]<=Need[Request_PROCESS][y]&&Request_COURCE_NEMBER[y]<=Available[y]) continue; else returnfalse; } for(y=0;y { Available[y]=Available[y]-Request_COURCE_NEMBER[y]; Allocation[Request_PROCESS][y]=Allocation[Request_PROCESS][y]+Request_COURCE_NEMBER[y]; Need[Request_PROCESS][y]=Need[Request_PROCESS][y]-Request_COURCE_NEMBER[y]; } returntrue; } intmain() { inti=0;intj; printf("输入进程数: "); scanf("%d",&MAX_FACT_PROCESS); printf("输入资源类别数: "); scanf("%d",&MAX_FACT_COURCE); for(i=0;i { printf("进程%d输入已分配的: ",i); for(j=0;j scanf("%d",&Allocation[i][j]); } for(i=0;i { printf("进程%d最大分配数: ",i); for(j=0;j scanf("%d",&Max[i][j]); } printf("需求矩阵Need: "); for(i=0;i { printf("\n"); for(j=0;j {Need[i][j]=Max[i][j]-Allocation[i][j]; printf("%d",Need[i][j]); } } printf("\n输入可利用资源: "); for(j=0;j scanf("%d",&Available[j]); if(Anquan()) { printf("安全序列: "); for(i=0;i printf("P%d\t",An[i]); } elseprintf("没有安全序列! "); /*****************************************/ intn=1; while(n! =0)//循环继续 { printf("\n输入发出请求的进程: "); scanf("%d",&Request_PROCESS); printf("\n输入请求资源: "); for(i=0;i scanf("%d",&Request_COURCE_NEMBER[i]); if(Rq()) { printf("进行安全检查……\n"); if(Anquan()) { printf("进程%d可以分到资源! ",Request_PROCESS); printf("安全序列: "); for(i=0;i printf("P%d",An[i]); printf("\n"); } else { for(i=0;i { Available[i]=Available[i]+Request_COURCE_NEMBER[i]; Allocation[Request_PROCESS][i]=Allocation[Request_PROCESS][i]-Request_COURCE_NEMBER[i]; Need[Request_PROCESS][i]=Need[Request_PROCESS][i]+Request_COURCE_NEMBER[i]; } printf("进程%d不能分到资源! ",Request_PROCESS); } } /*****************************************/ printf("是否继续(0退出)"); scanf("%d",&n); } return0; } 七、心得体会 为期两周的课程设计就这样结束了,因为银行家算法在学习操作系统课程时学的还不错,老师一布置此题时,就有了算法框架。 但是可能是假期都没有写程序,突然就无法写了,但是,有万前平同学的讲解,很快就写好了大概。 虽然没有任何语法错误,但是其中也有着逻辑上的错误,如输入进程需求的检查算法总是没办法调用,后来有万前平同学教我修改后就可以进行了。 之后也加了一个循环输入的算法。 谢谢老师这段时间的讲解,还有感谢万前平同学耐心帮助!
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统
![提示](https://static.bdocx.com/images/bang_tan.gif)