课程设计报告--磁盘调度算法及代码的实现

上传人:仙*** 文档编号:89258239 上传时间:2022-05-12 格式:DOC 页数:21 大小:86KB
返回 下载 相关 举报
课程设计报告--磁盘调度算法及代码的实现_第1页
第1页 / 共21页
课程设计报告--磁盘调度算法及代码的实现_第2页
第2页 / 共21页
课程设计报告--磁盘调度算法及代码的实现_第3页
第3页 / 共21页
点击查看更多>>
资源描述
-课程设计报告?计算机操作系统?课程设计题目:磁盘调度算法学生: 专 业: 班 级: 学 号: 指导教师:2021年01月10日目 录1.需求分析012. 总体设计及分类简介 011先来先效劳FCFS算法012最短寻道时间优先SSTF算法013扫描调度SCAN算法014循环扫描C-SCAN算法013.课程设计目的014.课程设计要求025.详细设计及算法流程图021总流程图022先来先效劳FCFS算法流程图033最短寻道时间优先SSTF算法流程图044扫描调度SCAN算法流程图055循环扫描C-SCAN算法流程图066.课程设计具体步骤071定义函数局部主要代码072先来先效劳FCFS算法局部主要代码073最短寻道时间优先SSTF算法局部主要代码074扫描调度SCAN算法局部主要代码095循环扫描C-SCAN算法局部主要代码097.课程设计结果显示101先来先效劳FCFS算法测试结果102最短寻道时间优先SSTF算法测试结果113扫描调度SCAN算法测试结果124循环扫描C-SCAN算法测试结果138.课程设计总结149.心得体会1510.参考资料 15磁盘调度算法一.需求分析编译程序运用磁盘的四种调度算法实现对磁盘的调度,四种算法分别为先来先效劳FCFS算法,最短寻道时间优先SSTF算法,扫描调度SCAN算法,循环扫描C-SCAN算法。二总体设计及分类简介磁盘调度中常用的有四种算法,功能分别如下:1.先来先效劳FCFS算法。即先来的请求先被响应。FCFS策略看起来似乎是相当公平的,但是当请求的频率过高的时候FCFS策略的响应时间就会大大延长。FCFS策略为我们建立起一个随机机制的模型,但是假设用这个策略反复响应从里到外的请求,则将会消耗大量的时间。为了尽量降低寻道时间,看来我们需要对等待着的请求进展适当的排序,而不是简单的使用FCFS策略。这个过程就叫做磁盘调度管理。有时候FCFS也被看作是最简单的磁盘调度算法。2. 最短寻道时间优先SSTF算法。要求的磁道,与当前磁头所在的磁道距离最近,以使每次的寻道时间最短。 3.扫描调度SCAN算法。该算法不仅考虑到欲的磁道与当前磁道间的距离,更优先考虑的是磁头当前的移动方向。例如,当磁头正在自里向外移动时,SCAN算法所考虑的下一个对象,应是其欲的磁道,既在当前磁道之外,又是距离最近的。这样自里向外的,直至再无更外的磁道需要时,才将磁道换向自外向里移动。这时,同样也是每次选择这样的进程来调度,也就是要的当前位置距离最近者,这样,磁头又逐步地从外向里移动,直至再无更里面的磁道要,从而防止了出现“饥饿现像。 4.循环扫描C-SCAN算法。当磁头刚从里向外移动而越过了*一磁道时,恰好又有一进程请求此磁道,这时,该里程就必须等待,为了减少这种延迟,CSCAN算法规定磁头单向移动,而本实验过程中我们所设计的是磁头从里向外移动,而从外向里移动时只须改方向而已,本实验未实现。但本实验已完全能演示循环扫描的全过程。三课程设计目的1.熟悉并掌握磁盘管理系统的设计方法,加深对所学各种磁盘调度算法及其算法的特点的了解。2.掌握磁盘调度的根本概念,比拟各种磁盘调度算法的优劣四.课程设计要求从课程设计的目的出发,通过设计工作的各个环节,到达以下设计要求:1.对系统进展功能模块分析、控制模块分析正确;2.系统设计要实用;3.编程简练,可用,功能全面,具有较好的强健性;4.说明书、流程图要清楚。五. 详细设计及算法流程图1. 总流程图输入磁道的个数输入所需功能的前置编号开场输入数字为14.输入当前磁道号退出数字为0.输入错误结果显示完毕2. 先来先效劳FCFS算法流程图开场sum=0,j,i,first=0,nowi=0;in;i+确定磁头所在位置计算sum i=0,j=1;jn;i+,j+first+=abs(aj-ai)sum+=first+abs(now-a0)移动的总磁道数完毕3. 最短寻道时间优先SSTF算法流程图开场for(i=0;in;i+)coutai;sum=an-1-now;i=0;in;i+j=i+1;j=0;i-)coutaiajif(an-1=now)while(ak=0)&(rn)移动的总道数完毕4. 扫描调度SCAN算法流程图for(j=i+1;jn;j+)按递增顺序排好的磁道for(i=0;in;i+)int a,int n开场for( i=0;in;i+)if(an-1=now)Int d; while(aknow)循环确定磁头的方向移动的总道数完毕循环循环5. 循环扫描C-SCAN算法流程图int a,int nfor(i=0;in;i+)循环for(i=0;in;i+)循环按递增顺序排好的磁道for(i=0;in;i+)循环开场if(an-1=now)磁头位置在两侧磁道之间确定磁头的方向移动的总道数完毕六课程设计具体步骤1.定义函数局部主要代码*include*includeusing namespace std;void FCFS(int a,int n);void SSTF(int a,int n);void SCAN(int a,int n);void CSCAN(int a,int n);2. 先来先效劳FCFS算法局部主要代码void FCFS(int a,int n)int sum=0,j,i,first=0,now;coutnow;/确定当前磁头所在位置cout磁盘调度顺序为:endl;for( i=0;in;i+)coutai ;for(i=0,j=1;jn;i+,j+) first+=abs(aj-ai); sum+=first+abs(now-a0);coutendl;cout移动的总磁道数为: sumendl;3. 最短寻道时间优先SSTF算法局部主要代码for(i=0;in;i+)for(j=i+1;jaj) temp=ai; ai=aj; aj=temp; if(an-1=0;i-) coutai ; sum=now-a0;if(l=-1)/磁头位置里侧的磁道已完 for(j=r;jn;j+)/磁头位置外侧的磁道 coutaj-1;j-) /磁头位置里侧的磁道 coutaj ; sum+=an-1-a0; coutendl; cout移动的总道数为:sumendl;4.扫描调度SCAN算法局部主要代码void SCAN(int a,int n)int temp;int k=1;int now,l,r;int i,j,sum=0;for(i=0;in;i+)if(an-1=0;i-) coutai ; sum=now-a0; 5. 循环扫描C-SCAN算法局部主要代码void CSCAN(int a,int n)int temp;int now,l,r;int i,j,sum=0;int k=1;for(i=0;in;i+)if(an-1=now)/磁头位置大于最外围欲磁道 for(i=0;in;i+) coutai ; sum=now-2*a0+an-1;七课程设计结果显示1.先来先效劳FCFS算法测试结果2. 最短寻道时间优先SSTF算法测试结果3.扫描调度SCAN算法测试结果4.循环扫描C-SCAN算法测试结果八课程设计总结计算机磁盘是一种很重要也很常用的外部设备,其分配也有一定的分配策略。在操作系统中,作业对磁盘的请求常常要排队,由此需要一些高效率的磁盘分配策略算法。1先来先效劳算法为一种最简单的磁盘调度算法,它直接根据作业请求磁盘的先后顺序对磁盘进展寻访,公平、简单,每个作业的磁盘请求都可以得到处理,不会出现*个作业的请求长期得不到满足的情况,但未对寻道方案进展优化;2最短寻道时间优先算法优先选择距离当前磁头位置最近的作业磁道请求,可以使得每次寻道时所用的时间都最短,但不能保证平均周转时间及带权周转时间最短;3电梯算法同时考虑下一个作业磁道请求与当前磁头位置的距离和当前磁头移动方向先选择当前磁头之外距离其最近的磁道进展,直到再无更外的磁道请求,再将磁臂换向,磁头侧距离当前磁头位置最近的作业磁道请求,防止了饥饿现象的出现,每个作业的磁盘请求都可以得到处理,且使每次寻道时间相对较短;4N_SCAN算法同时考虑下一个作业磁道请求与当前磁头位置的距离和当前磁头移动方向,但每次磁臂调转方向时,将同时处理在磁头向一侧移动过程当中输入的作业请求,先选择当前磁头之外距离其最近的磁道进展,直到再无更外的磁道请求,接下来一并考虑在磁头向外侧移动过程当中输入的作业请求与磁头侧未被处理的作业磁道请求,此算法对中间磁道请求比拟有利。总之,各种算法都有其长处,也各有缺乏,需要在实际应用中权衡利弊,择优使用才能到达最好的效果。九心得体会在这几天的课程设计中,由于之前做过相似的实验,所以在一开的实验设计流程图时还是很快就完成了,不过在接下来的编写代码的阶段里,出现很大的问题,花费了很多的时间。好在有教师的耐心细心的指导,一步一步的验证,一点一点的改正。每一次的运行看到错误都在慢慢的减少,正确的设计结果也在不断的靠近,最终取得了成功。由于自己的知识和能力还不到位,在课程设计时间里经历了很多困难和挑战,但我认为,在这过程中的每一次的错误和故障,都使我收获颇丰,使我成长了很多。当然,这个磁盘调度系统的设计远非完美,还有很多地方可以改良,例如界面可以更加友好,资源可以更加节约,算法也还有优化的余地,但是时间有限,经历也有限,在课程设计时间允许的围只能做到这样,我会在课余时间自行完善该磁盘调度算法程序。每一次的课程设计都是自己对所学知识的强化,是一次难得的动手时机。在课程设计的每一个步骤的执行中,都要认真的反复的去做,因为一个小小的错误都会导致课程设计结果发生巨大的偏差。完成一个成功的设计,会让自己学会很多很多的东西,并且能够很清楚的看到自己的缺乏,查补缺漏,继续学习。通过自己的动手动脑,既增加了知识,又给了我专业知识以及专业技能上的提升,对提高自己的思维能力和操作能力有很大的帮助。同时我也会更加努力,认真学习,争取在以后的课程中做得更好!十参考资料?计算机操作系统?清华大学?计算机操作系统实验指导?清华大学附录:*include*includeusing namespace std;void FCFS(int a,int n);void SSTF(int a,int n);void SCAN(int a,int n);void CSCAN(int a,int n);int main() int n; /磁道的个数 int s; /功能号 cout请输入当前磁道的个数,按Enter键显示生成的随机磁道号:n; int *a=new intn; cout生成的随机磁道号为:; srand(unsigned)time(NULL); for(int i=0;in;i+) ai=(rand()%100)+1; coutai ; coutendl; while(1) coutendl; cout endl; cout 磁盘调度算法功能列表 endl; cout endl; cout 1、先来先效劳算法FCFS endl; cout endl; cout 2、最短寻道时间算法SSTF endl; cout endl; cout 3、扫描算法SCAN endl; cout endl; cout 4、循环扫描算法CSCAN endl; cout endl; cout 0、退出 endl; cout endl; coutendl; couts; if(s4) cout数据输入有误!请重新输入:endl; else switch(s) case 0: e*it(0);break ; case 1:FCFS(a,n); break; case 2:SSTF(a, n);break; case 3:SCAN(a, n);break; case 4:CSCAN(a,n);break; return 0; /先来先效劳调度算法FCFSvoid FCFS(int a,int n)int sum=0,j,i,first=0,now;coutnow;/确定当前磁头所在位置cout磁盘调度顺序为:endl;for( i=0;in;i+)/按顺序输出磁道号coutai ;/计算sumfor(i=0,j=1;jn;i+,j+) first+=abs(aj-ai);/外围磁道与最里面磁道的距离sum+=first+abs(now-a0);coutendl;cout移动的总磁道数为: sumendl;/最短寻道时间算法SSTFvoid SSTF(int a,int n)int temp;int k=1;int now,l,r;int i,j,sum=0;/将磁道号按递增排序for(i=0;in;i+)for(j=i+1;jaj) temp=ai; ai=aj; aj=temp; cout按递增顺序排好的磁道显示为:endl;for( i=0;in;i+)coutai ;/输出排好的磁道顺序coutendl;coutnow;/确定当前磁头所在位置cout磁盘调度顺序为:endl;if(an-1=0;i-) coutai=now)/当前磁头位置小于最里欲磁道 for(i=0;in;i+) coutai ; sum=an-1-now; else while(ak=0)&(rn) if(now-al)=(ar-now)/选择离磁头近的磁道 coutal ; sum+=now-al; now=al; l=l-1; else coutar ; sum+=ar-now; now=ar; r=r+1; if(l=-1)/磁头位置里侧的磁道已完 for(j=r;jn;j+)/磁头位置外侧的磁道 coutaj-1;j-) /磁头位置里侧的磁道 coutaj ; sum+=an-1-a0; coutendl; cout移动的总道数为:sumendl;/扫描算法SCANvoid SCAN(int a,int n)int temp;int k=1;int now,l,r;int i,j,sum=0;for(i=0;in;i+)/对磁道按由小到大顺序排列输出 for(j=i+1;jaj) temp=ai; ai=aj; aj=temp; cout按递增顺序排好的磁道为:endl;for( i=0;in;i+)coutai ;coutendl;coutnow;/以下算法确定磁道顺序 if(an-1=0;i-) coutai=now) /磁头位置小于最里欲磁道 for(i=0;in;i+) coutai ; sum=an-1-now; else /磁头位置在最里侧磁道与最外侧磁道之间 int d; while(aknow) /确定当前磁道在已排的序列中的位置 k+; l=k-1;/在磁头位置的前一个欲磁道 r=k; /磁头欲磁道 coutd; /确定磁头的方向 cout=0;j-) coutaj ; for(j=r;jn;j+) coutaj ; sum=now-2*a0+an-1; if(d=1) /磁头向外 for(j=r;jn;j+) coutaj=0;j-) coutaj ; sum=2*an-1-now-a0; elsecout请输入0或1!endl; coutendl; cout移动的总道数为: sumendl;/循环扫描算法CSCANvoid CSCAN(int a,int n)int temp;int now,l,r;int i,j,sum=0;int k=1;for(i=0;in;i+)/对磁道按由小到大顺序排列输出 for(j=i+1;jaj) temp=ai; ai=aj; aj=temp; cout按递增顺序排好的磁道为:endl; for( i=0;in;i+) coutai ; coutendl;coutnow;/确定当前磁道号if(an-1=now)/磁头位置大于最外围欲磁道 for(i=0;in;i+) coutai=now)/磁头位置小于最里欲磁道 for(i=0;in;i+) coutai ; sum=an-1-now; else /磁头位置在最里侧磁道与最外侧磁道之间 int d; while(aknow) k+; l=k-1;/在磁头位置的前一个欲磁道 r=k; /磁头欲磁道 coutd; /确定磁头的方向 cout磁盘调度顺序为:; if(d=0|d=1) if(d=1) /磁头向外侧 for(j=r;jn;j+)/先外侧磁道再转向最里欲磁道 coutaj ; for(j=0;jr;j+) coutaj=0;j-) coutaj=r;j-) coutaj ; sum=2*an-1-2*a0+now-ar; else cout请输入0或1!; coutendl; cout移动的总道数为: sumendl;. z
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 管理文书 > 施工组织


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!