银行家算法操作系统.docx
- 文档编号:29790509
- 上传时间:2023-07-26
- 格式:DOCX
- 页数:18
- 大小:88.12KB
银行家算法操作系统.docx
《银行家算法操作系统.docx》由会员分享,可在线阅读,更多相关《银行家算法操作系统.docx(18页珍藏版)》请在冰豆网上搜索。
银行家算法操作系统
银行家算法操作系统
课程设计(论文)任务书
信息工程 学院 运算机 专业3 班
一、课程设计(论文)题目 资源治理系统的设计与实现——银行家算法实现
二、课程设计(论文)工作自2008年6月23日起至2008年6月28日止。
三、课程设计(论文)地点:
5#204
四、课程设计(论文)内容要求:
1.本课程设计的目
配合《运算机操作系统》课程的教学,通过模拟操作系统原理的实现,
使学生能更深刻地领会操作系统工作原理和操作系统实现方法的明白得,并可练
习程序设计,特开设此课程设计。
2.课程设计的任务及要求
1)差不多要求:
用你熟悉语言编程实现一个资源治理系统,该系统必须包括资源的添加、删除
和修改等功能,同时承诺其它进程来申请那个地点的资源,任何一个进程来申请资
源时,必须先登记该进程对资源的申请要求,然后由系统检查当前资源的状况,
并用银行家算法和安全性算法来检查是否承诺分配资源给进程。
每个进程申请
资源的情形必须进行记录,并作为课程设计报告的一部分数据。
2)创新要求:
在差不多要求达到后,可进行创新设计,如改善算法性能、友好的人机界面
等。
3)课程设计论文编写要求
(1)要按照书稿的规格打印与写课程设计论文
(2)论文包括名目、功能描述、设计思路、具体实现、运行调试与分析讨
论、设计体会与小结、参考文献、附录(源代码)等
(3)课程设计论文装订按学校的统一要求完成
4)答辩与评分标准:
(1)考勤与学习态度:
20分;
(2)设计思路:
20分;
(3)代码实现:
20分;
(4)调试与分析:
20分;
(5)回答问题:
10分;
(6)论文规范性:
10分。
5)参考文献
[1]汤子瀛,哲凤屏,汤小丹.《运算机操作系统》.西安电子科技大学出版社
[2]谭浩强《C程序设计》(第三版)清华大学出版社
[3]csdn
6)课程设计进度安排
内容天数 地点
1天5#204
1天5#204
1天5#204
学生签名:
2008年6月28日
课程设计(论文)评审意见
(1)考勤与态度(20分):
优( )、良( )、中( )、一样( )、差( );
(2)设计思路 (20分):
优( )、良( )、中( )、一样( )、差( );
(3)代码实现 (20分):
优( )、良( )、中( )、一样( )、差( );
(4)调试与分析 (20分):
优( )、良( )、中( )、一样( )、差( );
(5)回答问题 (10分):
优( )、良( )、中( )、一样( )、差( );
(6)论文规范性(10分):
优( )、良( )、中( )、一样( )、差( );
评阅人:
职称:
讲师
2008年6月30日
绪论
这次课程设计要求完成一个资源治理系统,该系统必须包括资源的添加、删除和修改等功能,同时承诺其它进程来申请那个地点的资源,任何一个进程来申请资源时,必须先登记该进程对资源的申请要求,然后由系统检查当前资源的状况,并用银行家算法和安全性算法来检查是否承诺分配资源给进程。
通过课程设计,加深我们对利用银行家算法幸免死锁的明白得。
在设计中要紧的难点是用语言编写银行家算法和安全性算法,使系统资源分配能安全进行,幸免系统死锁。
具体要求如下:
(1) 模拟一个银行家算法;
(2) 初始化时让系统拥有一定的资源;
(3) 假如预分配后,系统处于安全状态,则修改系统的资源分况;
(4) 假如预分配后,系统处于不安全状态,则提示不能满足要求,
此次课程设计的要紧内容时模拟实现动态资源分配。
同时要求编写和调试一个系统动态资源的简单模拟程序,观看死锁产生的条件,并使用适当的算法,有效的防止和幸免死锁的发生。
一、功能描述
在多道程序系统中,虽可借助于多个进程的并发执行,来改善系统的资源利用提高吞吐量,但可能发生一种危险——死锁。
所谓死锁,是指多个进程运行中因争夺资源而造成的一种僵局,当进程处于这种僵持状态时,若无外力作用,他们都无法再向前推进。
尽管进程在运行过程中,可能发生死锁,但死锁的发生必须同时具备四个条件:
互斥条件、要求和保持条件、不剥夺条件、环路等待条件;防止死锁的机构只须确保上述四个条件之一不显现,则系统可不能发生死锁。
系统的状态分为安全状态和不安全状态,只要能使系统都处于安全状态,便可幸免死锁。
所谓安全状态,是指系统能按某种进程顺序(P1,P2,…,Pn),来为每个进程Pi分配其所需分配,直至满足每个进程对资源的最大需求,使每个进程都可顺利地完成。
假如系统无法找到一个如此地安全系列,则称系统处于不安全状态。
在操作系统中研究资源分配策略时也有类似的问题,系统中有限的资源要供多个进程使用,必须保证得到资源的进程能在有限的时刻内归还资源,以供它进程使用资源。
假如资源分配不得当就会发生进程循环等待资源,各进程都无法连续执行下去的死锁现象。
而最有代表性的幸免死锁的算法,是Dijkstra的银行家算法。
银行家算法是幸免死锁的一种重要方法,在课程设计中用C语言编写一个资源治理系统,并要用银行家算法和安全性算法检查是否承诺分配资源给进程,幸免死锁。
通过课程设计,加深我们对了解有关资源申请、幸免死锁等概念,并加深我们对银行家算法明白得。
提高了我们分析、解决问题的能力。
二、设计思路
在幸免死锁方法中承诺进程动态地申请资源,但系统在进行资源分配之前,应先运算此次分配资源的安全性,若分配可不能导致系统进入不安全状态,则分配,否则等待。
银行家算法是幸免死锁的一种重要方法,为实现银行家算法,系统必须设置若干数据结构。
2.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.2、银行家算法
设Requesti是进程Pi的要求向量,假如Requesti[j]=K,表示进程Pi需要K个Rj类型的资源。
当Pi发出资源要求后,系统按下述步骤进行检查:
假如Requesti[j]≤Need[i,j],便转向步骤2;否则认为出错,因为它所需要的资源数已超过它所宣布最大值。
1)假如Requesti[j]≤Available[j],便转向步骤(3);否则,表示尚无足够资源,Pi须等待。
2)系统试探着把资源分配给进程Pi,并修改下面数据结构中的数值:
Available[j]∶=Available[j]-Requesti[j];
Allocation[i,j]∶=Allocation[i,j]+Requesti[j];
Need[i,j]∶=Need[i,j]-Requesti[j];
3)系统执行安全性算法,检查此次资源分配后,系统是否处于安全状态。
若安全,才正式将资源分配给进程Pi,以完成本次分配;否则,将本次的试探分配作废,复原原先的资源分配状态,让进程Pi等待。
2.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[i]+Allocation[i,j];
Finish[i]∶=true;
gotostep2;
4)假如所有进程的Finish[i]=true都满足,则表示系统处于安全状态;否则,系统处于不安全状态
三、具体实现
3.1、实现过程
在程序中设计五个进程,分别为pr0,pr1,pr2,pr3,pr4。
共享三类资源。
在那个资源治理系统中对进程的所需最大资源(Max)、已分配给当前进程资源(Allocation)和系统可用资源(Available)分别进行了初始化了值。
进程可动态地申请资源和开释资源,系统按各进程的申请动态地分配资源。
要求程序具有显示和打印各进程的某一时刻的资源分配表和安全序列,若分配不安全,则开释分配的资源,防止使系统进入不安全状态。
显示和打印各进程依次要求申请的资源号以及为某进程分配资源后的有关资源数据。
程序还能够实现对系统的修改。
假如修改系统可用资源(Available),和进程分配资源。
程序具体的设计是:
函数voidshowdata()用来显示资源矩阵,包括系统可用资源数目,进程对资源最大需求数,系统已分配给进程的资源数,进程还需求资源。
通过以上显示,专门直观的观看到资源分配和修改的过程。
函数share()用来利用银行家算法对某个进程申请资源对进行判定。
函数intchangdata(inti)用来实现资源试探分配。
要紧执行的步骤是:
Avaliable[j]=Avaliable[j]-Request[j];Allocation[i][j]=Allocation[i][j]+Request[j];Need[i][j]=Need[i][j]-Request[j]。
函数safe()用来实现安全性算法,对分配后的资源进行运算,若分配资源后,系统是安全的,则资源完成本次分配。
若不安全将本次的试探分配作废,调用shifang()函数复原原先的资源分配状态。
资源修改功能用Revision()来实现。
3.2流程图
四、运行调试及结果分析
为了便于检验程序的正确性,那个地点用了书上的数据进行了初始化。
程序运行时选择1,输入进程pr1的要求向量(1,0,2)通过程序运算,资源分配成功。
资源具体分配过程如下图所示。
得出一个安全序列为pr1,pr3,pr0,pr2,pr4。
这与书上的有点不同,但通过运算,这也是一个正确的安全序列。
对进程提出的要求向量,系统可能存在多个安全序列。
要紧是在安全路径的找算法上。
进程pr0要求资源:
pr0发出要求向量(0,2,0),由于Request0不大于Need0,Request0不大于Available0。
系统试探着为它分配资源。
由结果可知,系统不安全。
则系统不分配资源,并回收系统预分配给pr0的资源。
程序运行时选择2,进行系统资源的修改。
那个地点选择修改系统可用资源。
修改后的Available为(2,3,2)。
资源修改成功。
五、设计体会与小结
一周的操作系统课程设计终于终止了,尽管专门忙碌专门疲劳,但感受收成依旧蛮大的。
我几乎每天的用心和辛劳,唤回了我对操作系统的重新的认识,在编写程序不断显现错误和改正的过程序中加深了我对银行家算法的明白得。
那个系统的功能差不多能满足要求,完成了对资源的修改还有用银行家算法和安全性算法来检查是否承诺分配资源给进程。
在课程设计的过程中,通过与同组人的相互讨论,专门多问题迎刃而解。
让我从中体会到是小组合作的力量。
设计要紧由两部分组成:
第一部分:
银行家算法(扫描)
1.假如Request<=Need,则转向2;否则,出错
2.假如Request<=Available,则转向3,否则等待
3.系统试探分配要求的资源给进程
4.系统执行安全性算法
安全性算法
1.设置两个向量
(1).工作向量:
Work=Available(表示系统可提供给进程连续运行所需要的各类资源数目)
(2).Finish:
表示系统是否有足够资源分配给进程(True:
有;False:
没有).初始化为False
2.若Finish[i]=False&&Need<=Work,则执行3;否则执行4(I为资源类别)
3.进程P获得第i类资源,则顺利执行直至完成!
并开释资源:
Work=Work+Allocation;Finish[i]=true;转2
4.若所有进程的Finish[i]=true,则表示系统安全;否则,不安全!
第二部分要紧是进行资源的修改。
在那个地点能够修改资源的可用资源和资源还需求资源。
由于时刻有限,还不是专门完善,系统还有许多不尽人意的地点。
这些都有待进一步改善
六、参考文献
[1]汤子瀛,哲凤屏,汤小丹.运算机操作系统.西安:
西安电子科技大学出版社,2005
[2]谭浩强《C程序设计》(第三版)清华大学出版社
[3]csdn
七、
附录(源代码)
#include
#include
#defineM5//定义进程数
#defineN3//定义资源数
#defineFalse0
#defineTrue1
intMax[][3]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}};
intAvaliable[]={3,3,2};//系统可用资源
intAllocation[][3]={{0,1,0},{2,0,0},{3,0,2},{2,1,1},{0,0,2}};//系统已分配资源
intNeed[][3]={{7,4,3},{1,2,2},{6,0,0},{0,1,1},{4,3,1}};//还需要资源
intRequest[3];
voidshowdata()//显示资源矩阵
{
inti,j;
printf("系统可用的资源:
\n");
printf("resouce:
");
for(j=0;j printf("%d,",Avaliable[j]);//输出分配资源 printf("\n"); printf("各进程的资源需求: \n"); for(i=0;i printf("pr%d: ",i); for(j=0;j printf("%d,",Max[i][j]);//输出最大需求资源数 } printf("\n"); } printf("各进程得到资源: \n"); for(i=0;i printf("pr%d: ",i); for(j=0;j printf("%d,",Allocation[i][j]);//输出已分配资源数 printf("\n"); } printf("各进程还需求资源: \n"); for(i=0;i printf("pr%d: ",i); for(j=0;j printf("%d,",Need[i][j]);//输出还需要资源数 printf("\n"); } } intchangdata(inti)//进行资源分配 { intj; for(j=0;j Avaliable[j]=Avaliable[j]-Request[j]; Allocation[i][j]=Allocation[i][j]+Request[j]; Need[i][j]=Need[i][j]-Request[j]; } return1; } intchkerr()//安全性算法 { intWork[3],Finish[M]={0},temp[M]; inti,k=0,m,apply; intj; Work[0]=Avaliable[0];Work[1]=Avaliable[1];Work[2]=Avaliable[2]; for(i=0;i apply=0; for(j=0;j<3;j++){ if(Finish[i]==False&&Need[i][j]<=Work[j]){ apply++; if(apply==3){ for(m=0;m<3;m++) Work[m]=Work[m]+Allocation[i][m];//变分配数 Finish[i]=True; temp[k]=i; i=-1; k++; } } else if(Finish[i]==False){ if(i==M-1){ printf("系统不安全\n");//不成功系统不安全 return-1; } break; } } } printf("系统资源分配成功! ");//假如安全,输出成功 printf("分配的序列: \n"); for(i=0;i { printf("pr%d",temp[i]); } return0; } voidshare()//利用银行家算法对申请资源对进行判定 { charch; inti=0,j=0; ch='y'; printf("\n请输入要求分配的资源进程号从(0to4): "); scanf("%d",&i);//输入须申请的资源号 printf("请输入进程%d申请的资源: \n",i); for(j=0;j<3;j++) { printf("第%d个资源: ",j+1); scanf("%d",&Request[j]);//输入需要申请的资源 } for(j=0;j if(Request[j]>Need[i][j])//判定申请是否大于需求,若大于则出错 { printf("进程%d申请的资源大于它需要的资源",i); printf("error! \n"); ch='n'; break; } else{ if(Request[j]>Avaliable[j])//判定申请是否大于当前资源,若大于则 {//出错 printf("进程%d申请的资源大于available",i); printf("error! \n"); ch='n'; break; } } } if(ch=='y'){ changdata(i);//依照进程需求量变换资源 showdata();//依照进程需求量显示变换后的资源 chkerr();//依照进程需求量进行银行家算法判定 } } voidRevision(){ printf("请选择: 1: 修改进程还需要的资源2: 修改进程可用资源"); intchoice1; scanf("%d",&choice1); if(choice1==1){ printf("输入要修改的资源号(0~4)"); intp; scanf("%d",&p); printf("输入修改后进程还需要的资源(1,1,1)\n"); scanf("%d,%d,%d",&Need[p][0],&Need[p][1],&Need[p][2]); printf("经修改后各进程还需求资源: \n"); for(inta=0;a printf("pr%d: ",a); for(intb=0;b printf("%d,",Need[a][b]);//输出还需要资源数 printf("\n"); } } if(choice1==2) { printf("输入系统可用资源EX(1,1,1)\n"); scanf("%d,%d,%d",&Avaliable[0],&Avaliable[1],&Avaliable[2]); printf("经修改后的系统可用资源为\n"); for(intk=0;k printf("%d,",Avaliable[k]); } } intmain()//主函数 { printf("****************银行家算法演示*******************\n"); printf("**************曾金路&&雍虎***************\n"); intchoice; showdata();//显示各种资源 chkerr();//用银行家算法判定系统是否安全 do{ printf("\n输入要进行的操作1: 分配资源2: 修改资源3: 离开"); scanf("%d",&choice); if(choice==1) { share(); } if(choice==2) { Revision(); } if(choice==3) break; }while((choice==1)||(choice==2)); return1; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 银行家 算法 操作系统