软件课程设计报告.docx
- 文档编号:4632342
- 上传时间:2022-12-07
- 格式:DOCX
- 页数:17
- 大小:53.16KB
软件课程设计报告.docx
《软件课程设计报告.docx》由会员分享,可在线阅读,更多相关《软件课程设计报告.docx(17页珍藏版)》请在冰豆网上搜索。
软件课程设计报告
软件课程设计综合实验报告
专业:
__________网络工程_________________
年级:
__________07级_________________
姓名:
__________仇慎超_______________
学号:
__________070602122________________
提交日期:
______2010.11.22_______________
1.实验目的:
1)理解死锁避免相关内容;
2)掌握银行家算法主要流程;
3)掌握安全性检查流程。
2.实验内容:
1)设计多个资源(≥3);
2)设计多个进程(≥3);
3)设计银行家算法相关的数据结构;
4)动态进行资源申请、分配、安全性检测并给出分配结果。
3.实验要求:
1)编写程序完成实验内容;
2)在实验报告中画出银行家和安全性检查函数流程图;
3)撰写实验报告。
4.实验环境:
VC++6.0
5.程序设计和说明:
1)银行家算法的数据结构
(1)可利用资源向量Available。
其中每个元素代表每类资源的数目。
(2)最大需求矩阵Max。
其中每个元素代表每个进程对于每类资源的最大需求量。
Max[i,j]=K表示i进程对于j类资源的最大需求量为K。
(3)分配矩阵Allocation。
其中每个元素代表每个进程已得到的每类资源的数目。
(4)需求矩阵Need。
其中每个元素代表每个进程还需要的每类资源的数目。
2)银行家算法
Requesti[j]=K表示进程Pi需要K个j类资源。
(1)如果Requesti[j]≤Need[i,j],便转向步骤2,否则认为出错。
(2)如果Requesti[j]≤Available[j],便转向步骤3,否则表示无足够资源,Pi需等待;
(3)系统尝试分配资源给Pi;
(4)系统进行安全性检查,检查此次资源分配后,系统是否安全。
如果安全,则正式分配资源,否则撤销此次分配。
3)安全性算法
(1)设置两个向量:
工作向量Work和Finish。
算法开始时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;
到第2)步。
(4)直到所有Finish[i]=True,表示系统处于安全状态;否则系统处于不安全状态。
6、流程图:
NO
YES
NO
YES
NO
YES
7、实验代码:
#include
#include
#include
#defineFalse0
#defineTrue1
intMax[100][100]={0};//各进程所需各类资源的最大需求
intAvaliable[100]={0};//系统可用资源
charname[100]={0};//资源的名称
intAllocation[100][100]={0};//系统已分配资源
intNeed[100][100]={0};/还需要资源
intRequest[100]={0};//请求资源向量
inttemp[100]={0};//存放安全序列
intWork[100]={0};//存放系统可提供资源
intM=100;//作业的最大数为100
intN=100;//资源的最大数为100
intMiddle[100]={0};
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; } voidshowdata()//显示资源矩阵 { inti,j; cout<<"系统目前可用的资源[Avaliable]: "< for(i=0;i cout< cout< for(j=0;j cout< cout< cout<<"MaxAllocationNeed"< cout<<"进程名"; for(j=0;j<3;j++){ for(i=0;i cout< cout<<""; } cout< for(i=0;i cout<<""< for(j=0;j cout< cout<<""; for(j=0;j cout< cout<<""; for(j=0;j cout< cout< } } voidshare()//利用银行家算法对申请资源对进行判定 { charch; inti=0,j=0; ch='y'; cout<<"请输入要求分配的资源进程号(0-"< "; cin>>i;//输入须申请的资源号 cout<<"请输入进程"< "< for(j=0;j { cout< "; cin>>Request[j];//输入需要申请的资源 } for(j=0;j if(Request[j]>Need[i][j])//判断申请是否大于需求,若大于则出错 { cout<<"进程"< cout<<"分配不合理,不予分配! "< ch='n'; break; } else{ if(Request[j]>Avaliable[j])//判断申请是否大于当前资源,若大于则 { cout<<"进程"< cout<<"分配出错,不予分配! "< ch='n'; break; } } } if(ch=='y'){ changdata(i);//根据进程需求量变换资源 showdata();//根据进程需求量显示变换后的资源 safe();//根据进程需求量进行银行家算法判断 } } intsafe()//安全性算法 { inti,k=0,m,apply,Finish[100]={0}; intj; intflag=0; Work[0]=Avaliable[0]; Work[1]=Avaliable[1]; Work[2]=Avaliable[2]; for(i=0;i apply=0; for(j=0;j if(Finish[i]==False&&Need[i][j]<=Work[j]){ apply++; if(apply==N){ for(m=0;m Work[m]=Work[m]+Allocation[i][m];//变分配数 Finish[i]=True; temp[k]=i; i=-1; k++; flag++; } } } } for(i=0;i if(Finish[i]==False){ cout<<"系统不安全"< return-1; } } cout<<"系统是安全的! "< cout<<"分配的序列: "; for(i=0;i cout< if(i } cout< return0; } voidaddresources(){//添加资源 intn,flag; cout<<"请输入需要添加资源种类的数量: "; cin>>n; flag=N; N=N+n; for(inti=0;i cout<<"名称: "; cin>>name[flag]; cout<<"数量: "; cin>>Avaliable[flag++]; } showdata(); safe(); } voiddelresources(){//删除资源 charming; inti,flag=1; cout<<"请输入需要删除的资源名称: "; do{ cin>>ming; for(i=0;i if(ming==name[i]){ flag=0; break; } if(i==N) cout<<"该资源名称不存在,请重新输入: "; } while(flag); for(intj=i;j { name[j]=name[j+1]; Avaliable[j]=Avaliable[j+1]; } N=N-1; showdata(); safe(); } voidchangeresources(){//修改资源函数 cout<<"系统目前可用的资源[Avaliable]: "< for(inti=0;i cout< "< cout<<"输入系统可用资源[Avaliable]: "< cin>>Avaliable[0]>>Avaliable[1]>>Avaliable[2]; cout<<"经修改后的系统可用资源为"< for(intk=0;k cout< "< showdata(); safe(); } voidaddprocess(){//添加作业 intflag=M; M=M+1; cout<<"请输入该作业的最打需求量[Max]"< for(inti=0;i cout< "; cin>>Max[flag][i]; Need[flag][i]=Max[flag][i]-Allocation[flag][i]; } showdata(); safe(); } intmain()//主函数 { inti,j,number,choice,m,n,flag; charming; cout<<"*****************资源管理系统的设计与实现*****************"< cout<<"请首先输入系统可供资源种类的数量: "; cin>>n; N=n; for(i=0;i { cout<<"资源"< "; cin>>ming; name[i]=ming; cout<<"资源的数量: "; cin>>number; Avaliable[i]=number; } cout< cout<<"请输入作业的数量: "; cin>>m; M=m; cout<<"请输入各进程的最大需求量("< "< for(i=0;i for(j=0;j cin>>Max[i][j]; do{ flag=0; cout<<"请输入各进程已经申请的资源量("< "< for(i=0;i for(j=0;j cin>>Allocation[i][j]; if(Allocation[i][j]>Max[i][j]) flag=1; Need[i][j]=Max[i][j]-Allocation[i][j]; } if(flag) cout<<"申请的资源大于最大需求量,请重新输入! \n"; } while(flag); for(i=0;i<100;i++) { staticintj=0; for(intk=0;k Middle[i]+=Allocation[k][j]; } j++; } for(i=0;i<100;i++) { Avaliable[i]-=Middle[i]; } showdata();//显示各种资源 safe();//用银行家算法判定系统是否安全 while(choice) { cout<<"**************银行家算法演示***************"< cout<<"1: 增加资源"< cout<<"2: 删除资源"< cout<<"3: 修改资源"< cout<<"4: 分配资源"< cout<<"5: 增加作业"< cout<<"0: 离开"< cout<<"*******************************************"< cout<<"请选择功能号: "; cin>>choice; switch(choice) { case1: addresources();break; case2: delresources();break; case3: changeresources();break; case4: share();break; case5: addprocess();break; case0: choice=0;break; default: cout<<"请正确选择功能号(0-5)! "< } } return1; } 6.测试结果: ***********************资源管理系统的设计与实现*************************** 请首先输入系统可供资源种类的数量: 3 资源1的名称: A 资源的数量: 10 资源2的名称: B 资源的数量: 5 资源3的名称: C 资源的数量: 7 请输入作业的数量: 5 请输入各进程的最大需求量(5*3矩阵)[Max]: 753 322 902 222 433 请输入各进程已经申请的资源量(5*3矩阵)[Allocation]: 010 200 302 211 002 系统目前可用的资源[Avaliable]: ABC 332 MaxAllocationNeed 进程名ABCABCABC 0753010743 1322200122 2902302600 3222211011 4433022431 系统是安全的! 分配的序列: 1->3->0->2->4 *******************银行家算法演示******************** 1: 增加资源 2: 删除资源 3: 修改资源 4: 分配资源 5: 增加作业 0: 离开 ***************************************************** 请选择功能号: 4 请输入要求分配的资源进程号(0-4): 1 请输入进程1申请的资源: 102 A: B: C: 系统目前可用的资源[Avaliable]: ABC 230 MaxAllocationNeed 进程名ABCABCABC 0753010743 1322302020 2902302600 3222211011 4433002431 系统是安全的! 分配的序列: 1->3->0->2->4 *******************银行家算法演示******************** 1: 增加资源 2: 删除资源 3: 修改资源 4: 分配资源 5: 增加作业 0: 离开 ***************************************************** 请选择功能号: 8、实验思考: 1)针对死锁有哪些可行的解决方案? 1.预防死锁。 该方法是通过设置某些限制条件,去破坏产生死锁的四个必要条件中的一个或几个条件,来预防发生死锁。 但由于所施加的限制条件旺旺太严格,因而可能会导致系统资源利用率和系统吞吐率低。 2.避免死锁。 该方法同样是属于事先预防的策略,但它并不须事先采取各种限制措施去破坏产生死锁的四个必要条件,而是在资源的动态分配过程中,用某种方法去防止系统进入不安全状态,从而避免发生死锁。 3.这种方法并不事先采取任何限制性措施,也不必检查系统是否已经进入不安全区,而是允许系统在运行过程中发生死锁。 但可通过系统所设置的检测机构,及时的检测出死锁的发生,并精确地确定与死锁有关的进程和资源。 4.解除死锁。 这是与检测死锁相配套的一种措施。 当检测到系统中已发生死锁时,须将进程从死锁状态中解脱出来。 常用的实施方法是撤销或挂起一些进程,以便回收一些资源,再将这些资源分配给已经处于阻塞状态的进程,使之转为就绪状态,以继续运行。 2)死锁解除的难点是什么? 1..剥夺资源。 从其它进程剥夺足够数量的资源给死锁进程,以解决死锁状态 2.撤销进程。 最简单的撤销进程的方法是使全部死锁进程都夭折;稍微温和一点的方法是按照某种顺序逐个地撤销进程,直至没有足够的资源可用,使死锁状态消除为止。 8、实验体会: 为期几周的软件课程设计终于即将结束了,这几周的实验对于一个有志于软件方向的我来说是极其重要的。 它让我开始由基层对软件资源有了一定的了解。 让我对进程的管理、资源分配以及死锁解锁的等认识更加深入了。 对于以后的软件开发工作起到了很大的影响,让我的目光不仅仅局限于表层的现象,使我可以更加具体切有针对性的处理这方面的问题,不再捉足见肘。 在实验中尤其让我深受启发的便是这次银行家算法程序,原先我对于银行家算法也只是止步于理论的阶段,从来没有想到过具体实现时还有这么多问题要考虑。 首先遇见的便是资源分配的问题,如何更加合理的分配系统资源,如何分配需求矩阵,成了最大的问题,它直接影响的后面程序的编写,最后迫不得以请教了很多的同学借鉴了他们的方法,预先在草稿上面模拟计算出大概的方案,方才最终解决了问题。 其次的问题便是安全性检查的问题了,怎样用程序完美的执行检查,对于一个不经常接触C程序编程的人来说也是一个挑战,不过经过努力最终还是圆满解决了。 这次的软件综合实验不仅在知识上,也在观念上给了我极大的启发。 这是一笔无形的财富,也让我能够在今后的生活中能够走的更远。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 软件 课程设计 报告