计算机操作系统课程设计报告《Linux下动态资源分配算法演示程序》.docx
- 文档编号:9304617
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:19
- 大小:177.79KB
计算机操作系统课程设计报告《Linux下动态资源分配算法演示程序》.docx
《计算机操作系统课程设计报告《Linux下动态资源分配算法演示程序》.docx》由会员分享,可在线阅读,更多相关《计算机操作系统课程设计报告《Linux下动态资源分配算法演示程序》.docx(19页珍藏版)》请在冰豆网上搜索。
计算机操作系统课程设计报告《Linux下动态资源分配算法演示程序》
《计算机操作系统》课程设计
题目:
动态资源分配算法演示程序
专业:
软件工程
年级:
2012级
小组成员:
指导教师:
时间:
地点:
2014年12月
1.概述
动态资源分配算法演示程序是对操作系统中“银行家算法”的模拟,银行家算法是操作系统中一种最具代表性的避免死锁的算法。
通过对信息的编辑,来实现自行输入信息。
资源种类与数目可在界面进行设置,在资源分配过程中可以随时增加进程及其对资源的需求。
在编辑信息时,可以修改资源和进程的各种信息,包括添加、修改和删除。
确定信息后,可以通过检查系统安全性,来显示系统的安全序列或者显示系统处于不安全状态。
请求资源功能实现了进程请求系统中资源的模拟。
如果能够通过系统安全状态检测,则系统对该进程进行资源分配;当进程满足所有资源分配后能够自行释放所有资源,退出资源竞争。
本程序是在LINUX环境系统下编写的。
本设计主要用于解决多种资源被多个独立执行的进程使用的安全算法。
该算法采用矩阵存储资源的数据,通过对系统资源预分配后检查系统状态,以避免死锁的产生。
要求如下:
(1) 模拟一个银行家算法;
(2) 初始化时让系统拥有一定的资源;
(3) 用键盘输入的方式申请资源;
(4) 如果预分配后,系统处于安全状态,则修改系统的资源分配情况;
(5) 如果预分配后,系统处于不安全状态,则提示不能满足请求,设计的主要内容是模拟实现动态资源分配。
同时编写和调试一个系统动态资源的简单模拟程序,观察死锁产生的条件,并使用适当的算法,有效的防止和避免死锁的发生。
2.课程设计任务及要求
2.1设计任务
本设计主要用于解决多种资源被多个独立执行的进程使用的安全算法。
该算法采用矩阵存储资源的数据,通过对系统资源预分配后检查系统状态,以避免死锁的产生。
2.2日程安排表
日期
任务
负责人
完成情况
2014.12.24星期三下午
查找资料,按需求设计算法
AB
完成
2014.12.25星期四上午
查找资料,开始编写代码
AB
完成
2014.12.25星期四下午
编写代码与注释
AB
完成
2014.12.26星期五上午
代码完善与修改
A
完成
2014.12.26星期五下午
文档制作
A
完成
2.3设计要求
(1)资源种类与数目可在界面进行设置,在资源分配过程中可以随时增加进程及其对资源的需求。
(2)可读取样例数据(要求存放在外部文件中)进行资源种类、数目与进程数的初始化。
(3)在资源分配过程中可以随时进行系统安全状态检测。
(4)如果能够通过系统安全状态检测,则系统对该进程进行资源分配;当进程满足所有资源分配后能够自行释放所有资源,退出资源竞争。
(5)要求进行安全性检查时按指定策略顺序进行,即按每个进程当前Need数由小至大进行排序,如果Need数相同,则按序号由小至大进行排序;
(6)具有一定的数据容错性。
3.算法及数据结构
3.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]
3.2银行家算法
3.2.1功能
设进程i提出请求Request[n],则银行家算法按如下规则进行判断。
(1)如果Request[n]>Need[i,n],则报错返回。
(2)如果Request[n]>Available,则进程i进入等待资源状态,返回。
(3)假设进程i的申请已获批准,于是修改系统状态:
Available=Available-Request
Allocation=Allocation+Request
Need=Need-Request
(4)系统执行安全性检查,如安全,则分配成立;否则试探险性分配作废,系统恢复原状,进程等待。
3.2.2数据结构
intMax[100][100]={0};//各进程所需各类资源的最大需求
intAvaliable[100]={0};//系统可用资源
charname[100]={0};//资源的名称
intAllocation[100][100]={0};//系统已分配资源
intNeed[100][100]={0};//还需要资源
intM=100;//作业的最大数为100
intN=100;//资源的最大数为100
3.2.3算法
3.3安全性算法
3.3.1功能
(1)设置两个工作向量Work=Available;Finish[M]=False
(2)从进程集合中找到一个满足下述条件的进程,
Finish[i]=False
Need<=Work
如找到,执行(3);否则,执行(4)
(3)设进程获得资源,可顺利执行,直至完成,从而释放资源。
Work=Work+Allocation;Finish=True;gotostep2;
(4)如所有的进程Finish[M]=true,则表示安全;否则系统不安全。
3.3.2数据结构
intAllocation[100][100]={0};//系统已分配资源
intRequest[100]={0};//请求资源向量
inttemp[100]={0};//存放安全序列
intWork[100]={0};//存放系统可提供资源
3.3.3算法
4.程序设计与实现
4.1程序流程图
4.2程序代码
显示资源矩阵:
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< } } 进行资源分配: 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; } 安全性算法: intsafe()//安全性算法 { intk=0,m,n,n1,apply,Finish[100]={0}; inti,j; 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]){//判断系统可用资源与还需资源关系 num+=Need[i][j]; apply++; if(apply==N){ for(m=0;m Work[m]=Work[m]+Allocation[i][m];//变分配数 Finish[i]=True; temp[k]=num; jc[k]=i; i=-1; k++; flag++; num=0; } } } } for(i=0;i if(Finish[i]==False){ cout<<"系统不安全"< return-1; } } cout<<"系统是安全的! "< cout<<"分配的序列: "; for(i=0;i for(j=i+1;j if(temp[i]>temp[j]){ n=temp[i]; temp[i]=temp[j]; temp[j]=n; n1=jc[i]; jc[i]=jc[j]; jc[j]=n1; } //遍历序列 cout< for(i=0;i cout< if(i cout<<"->";} cout< return0; } 利用银行家算法对申请资源对进行判定: 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();//根据进程需求量进行银行家算法判断 } } 添加资源: 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();//安全性检查 } 4.3实验结果 运行该程序需要在Linux环境下安装C++编译器 编译命令: g++-oziyuanziyuan.cpp 运行命令: ./ziyuan 5.结论 银行家算法是避免死锁的一种重要方法,通过编写一个简单的银行家算法程序,加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。 死锁的产生,必须同时满足四个条件,即一个资源每次只能由一个进程;第二个为等待条件,即一个进程请求资源不能满足时,它必须等待,但它仍继续保持已得到的所有其他资源;第三个为非剥夺条件,即在出现死锁的系统中一定有不可剥夺使用的资源;第四个为循环等待条件,系统中存在若干个循环等待的进程,即其中每一个进程分别等待它前一个进程所持有的资源。 防止死锁的机构只能确保上述四个条件之一不出现,则系统就不会发生死锁。 6.收获及体会 A的收获及体会: 我们选择《动态资源分配算法演示》作为我们的操作系统课程设计题目,在这非常仓促的两天半里能做出一个完整的课程设计几乎是很困难的,当中我们也遇到了许多一时半会难解决的难题。 但是我们通过翻阅资料,网上查阅的方式,一起和组员讨论,最后还是解决了这些阻碍我们项目进程的问题,比如在代码完善后我们遇到了不能在LINUX环境下运行,经过我们的了解后,我们需要在终端下载C++编译器,然后编译命令g++-oziyuanziyuan.cpp,最终成功的实现了在LINUX环境下实现了运行。 利用两天半的时间东拼死凑的把我们本组项目完成了。 就我个人而言,本次课程设计不仅可以强化了老师所教的知识,更重要的是提高我们动手能力,以及面对困难时懂得去查阅材料,和组员一起讨论解决方案,学会协作沟通。 我们这次项目不是最好的一个,但是我们也有努力用心去做。 B的收获及体会: 通过这次《动态资源分配算法演示程序》的课程设计,让我更加深入的了解到了银行家算法的步骤,明白了进程在请求资源时是通过先判断Request[i,j]是否小于等于Need[i,j],再判断Request[i,j]是否小于等于Available[j],如果都满足则修改其中各向量的值,再用安全性算法判定系统是否处于安全状态。 在这次课程设计中我们也遇到了不少问题,比如如何实现按每个进程当前Need数由小至大进行排序,如果Need数相同,则按序号由小至大进行排序这个问题,经过我们查阅资料与理解后,最终我们成功的解决了该问题,并不断完善我们的代码,还有就是如何把我们的代码在LINUX环境下运行,最终我们需要在终端下载C++编译器才能实现,编译命令如下g++-oziyuanziyuan.cpp。 最后在这次课程设计中,我更懂得了团队合作是多么的重要,合理的分配任务以及及时完成任务是提高效率的有效方法。 经过这三天的努力,我们最终按时完成了本次设计,虽然完成了,但是我觉得我们还有许多方面需要改进,不如在设计的过程中缺乏沟通,这是降低我们效率的不足之处,我希望往后的课程设计,我们能越做越好,不断有所进步。 7.参考文献 [1]汤小丹,梁红兵.计算机操作系统(第四版)[M].西安电子科技大学出版社,2014 [1]谭浩强.C语言程序设计(第四版)[M].清华大学出版社,2010
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Linux下动态资源分配算法演示程序 计算机 操作系统 课程设计 报告 Linux 动态 资源 分配 算法 演示 程序
![提示](https://static.bdocx.com/images/bang_tan.gif)