1、磁盘移臂调度过程模拟先来先服务法电梯算法学 号: 课 程 设 计题 目磁盘移臂调度过程模拟-先来先服务法,电梯算法学 院计算机学院专 业班 级姓 名指导教师吴利军2013年01月14日课程设计任务书学生姓名: 指导教师: 吴利军 工作单位: 计算机科学与技术学院 题 目: 磁盘移臂调度过程模拟设计先来先服务法、电梯算法初始条件:1预备内容:阅读操作系统的文件管理章节内容,理解有关文件组织形式、存储设备的概念。2实践准备:掌握一种计算机高级语言的使用。要求完成的主要任务: (包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)1编程序模拟磁盘调度的过程,采用指定算法,模拟并输出存取臂的移动
2、顺序,并计算存取臂移动的磁道总数。 能够处理以下的情形: 可根据需要输入当前磁头的位置,磁头移动方向; 能够输入柱面数,磁道访问序列等参数,并能够显示调度结果(磁盘访问请求的磁道号以及磁头移动的总磁道数)。2设计报告内容应说明: 需求分析; 功能设计(数据结构及模块说明); 开发平台及源程序的主要部分; 测试用例,运行结果与运行情况分析; 自我评价与总结:)你认为你完成的设计哪些地方做得比较好或比较出色;)什么地方做得不太好,以后如何改正;)从本设计得到的收获(在编写,调试,执行过程中的经验和教训);)完成本题是否有其他方法(如果有,简要说明该方法);时间安排:设计安排一周:周1、周2:完成程
3、序分析及设计。周2、周3:完成程序调试及测试。周4、周5:验收、撰写课程设计报告。(注意事项:严禁抄袭,一旦发现,一律按0分记)指导教师签名: 年 月 日系主任(或责任教师)签名: 年 月 日一:摘要文件系统是OS与用户关系最紧密的一部分,对用户来说,它是OS中最直观的部分,能否方便使用OS,以及OS的可信赖程度往往取决于文件系统的功能和性能。而大容量磁盘、磁带等的出现,为程序和数据等软件资源的透明存取提供了物质基础。这也导致了对软件资源管理质的飞跃文件系统的出现。文件的存储设备有多种类型,例如磁盘、光盘、磁带等。其中存储设备的特性决定了文件的存取设备和方法,例如:顺序存取设备和直接存取设备。
4、任何一种存取设备和方法都有它的优点和缺点,我们要根据不同的场景,来设计出不同的算法来存取文件,是的CPU的工作效率能够得以提高。二:需求分析磁盘是可被多个多个进程共享的设备,当有多个进程都请求访问磁盘时,应采用一种适当的调度算法,对这些请求的服务顺序调整安排,以便达到降低平均磁盘服务时间,达到公平、高效。常用的磁盘调度算法有先来先服务算法,最短寻道时间优先算法,扫描算法(或称为电梯算法)。其中先来先服务算法的宗旨是哪个进程先来,则先跳读哪个算法。这算法实现简单,而且相对公平,但是效率不高,而且,相邻两次请求可能会造成最内到嘴歪的柱面寻道,是磁头反复移动,增加了服务时间,对机械也不利。而最短寻道
5、时间优先算法则是优先选择距离当前磁头最近的访问请求的进程,对其进行服务,它主要考虑的是寻道优先,这样能够减少磁头与磁道的摩擦,改善了磁盘平均服务时间,但这也有可能造成某些访问请求长期等待,得不到服务。基于上述两种算法的优缺点,电梯算法应运而生,塔克服了最短寻道优先的缺点,既考虑了距离,同时又考虑了方向。其具体做法如下:当设备无访问请求时,磁头不懂;党设备有访问请求时,磁头按一个方向移动,而在移动的过程中,对遇到的访问请求进行服务,然后判断该方向上是否还有访问请求;如果有则继续扫描,如果没有,就改变移动方向,并为经过的访问,请求服务,如此反复。电梯算法适用于负担重的系统,这样可以较大程度的减轻由
6、于先来先服务算法带来的磁头来回跑动的不利或者最短寻道优先算法的某些服务长时间等待而得不到服务的缺点。而对于那些磁盘负担很轻的系统,我们则可以才用先来先服务的算法,因为这样的系统,磁盘调度不是很频繁,基于对进程,设备的利用率来说,则可以才用先来先服务算法,以达到公平,简单的效果。每个调度算法都有各自的优缺点,我们要根据不同的场景,来选择不同的调度算法,甚至是开发出新的调度算法,以满足不同的场景的需要,提高CPU的效率。三:功能设计 磁盘上每个物理块的位置可以表示为;(柱面号、磁头号、扇区号),而为了管理的方便,文件系统使用的是磁盘的物理块号,磁盘的物理地址(三维)与磁盘物理块号(线性)有一一对应
7、的关系。启动磁盘输入输出要用磁盘物理地址。磁盘物理地址与磁盘物理块号之间的转换由操作系统中文件系统与设备管理借口实现。因此我们要设计的系统,要求可以输入柱面号,磁盘号和磁头的初始位置以及磁头最初的方向。当然,根据场景不同我们还需要选择不同的调度算法,以充分利用CPU,是的系统的资源能够合理的分配。所以本系统要求可以选择调度算法,并且在初始化的环境下,输入初始磁道号,以及需调度的作业数,和手动确定各个作业所在的磁道数。再确定选择的调度算法之后,我们还要求输出在此次调度算法的情况下,磁道依次走过的路线和总的磁道数。四:开发平台及源程序 本系统是基于VS2010的开发,所使用的语言是C语言,主要源程
8、序如下:输入磁道数的函数:void input() bool flag1=true; for(int i=0;inumber;i+) while(flag1) scanf(%d,&ai); if(aidisc) sum=a0-disc; else sum=disc-a0; printf(您选择的是先来先服务算法,调度作业的磁道依次为:); for(int i=0;inumber;i+) printf(%d ,ai); printf(n); for(int i=0;inumber-1;i+) if(aiai+1) s=ai+1-ai; else s=ai-ai+1; sum+=s; else p
9、rintf(您选择的是电梯算法,请选择电梯的初始走向n); while(flag) printf(1:由小到大;2由大到小n); scanf(%d,&m); if(m!=1&m!=2) printf(您的选择有误,请重新选择n); else flag=false; if(m=1) insort(a); else desort(a); printf(所走的磁道总数为:%d,sum); printf(n);选择调度算法函数:int choose() int n; bool flag=true; while(flag) printf(请选择调度算法n); printf(1:先来先服务算法n); pr
10、intf(2:电梯算法n); scanf(%d,&n); if(n!=1&n!=2) printf(您的选择有误!?n); else flag=false; return n;排序函数:void insort(int *a) int bMAX; /记录原本的数组a int i=1; /排序时记录的排序次数 int temp; /保存需替换的变量 bool chflag=true; /排序时两种情况的标志 for(int j=0;jnumber;j+) bj=aj; while(inumber) for(int j=0;jbj+1) temp=bj; bj=bj+1; bj+1=temp; i+
11、; temp=0; for(int j=0;jnumber;j+) if(bjdisc) temp+; printf(调度作业的磁道数一次为:); for(int j=temp;jnumber;j+) printf(%d ,bj); for(int j=0;jtemp;j+) printf(%d ,bj); sum=bnumber-1-disc; sum+=bnumber-1-b0; printf(n);void desort(int *a) int bMAX; /保存数组a int i=1; / 记录排序时的次数 int temp; /保存需替换的变量 bool chflag=true; /
12、排序时,两种情况的标志 for(int j=0;jnumber;j+) bj=aj; while(inumber) for(int j=0;jbj+1) temp=bj; bj=bj+1; bj+1=temp; i+; printf(调度作业的磁道数依次为:); temp=-1; for(int j=0;jnumber;j+) if(bj=0;j-) printf(%d ,bj); for(int j=temp+1;jnumber;j+) printf(%d ,bj); sum=disc-b0; sum+=bnumber-1-b0; printf(n);五:测试用例六:自我评价与总结1:设计的
13、优点 此次系统的设计,考虑到了可多次连续操作的特性,不用每次启动系统只能操作一次,然后就退出的缺点。还有,根据程序的要求,程序中遇到了数组排序的问题,此次设计采用的是冒泡排序法,实现简单,容易理解。另外,充分保证了程序的健壮性,考虑到输入磁道数或作业数为负的情况,使程序不易崩溃,或出现无限循环的情况。2:设计的不足此次设计,输入的n个数用数组保存,而数组又不能动态创建,所以在创建数组时要分配足够的内存,而实际情况中,大多数情况是用不到这么多的内存的,所以,数据结构选用数组,在某种程度上浪费了内存空间。另外,在电梯算法中,我个人也考虑了好久,能不能一次性输入两个一样的数字,即同一楼层输入两次(表
14、现在磁盘调度中即为不同的两个作业占用同一个磁道),和同学讨论的时候,同学说,一个作业调度完以后,即可再次输入这个磁道号,虽然两个程序占用的是同一个空间,但在不同的时间上处理,这样是可行的。所以本次程序设计并没有考虑两个进程占用同一个磁道时,系统到底是如何调度程序的,或者,在开始输入磁道时,就不能同时输入两个一样的磁道。而是单纯的将占用同一磁道的两个进程先后调度,其优先级由输入的顺序来排列。从这一点来说,本次程序设计并没有极大的追求完美。以后遇到这样的问题,一定要多查阅资料,弄清真个过程的先后顺序,甚至是内在的关系,再开始设计程序的运行模式或方式,以追求完美。3:收获 在程序调试的过程中,我故意
15、选择了可能出走的选项,来测试程序的健壮性,看看程序在这种特殊的情况下所表现出的处理方法。事实证明这种方法虽然过程是曲折的,但是,收获也是巨大的。哪怕是多次把程序调的崩溃了,但是明白了问题的所在与程序的不足,还是值得的。也让我明白了,真的经过自己的努力来找出问题,解决问题的意义,那种喜悦,那种成就感,令我觉得,这几天的努力,辛苦,没有白费。另外,就是故意让同学来调试程序,每个人的思路不一样,多一个人来“整顿”程序,也就使得程序多了一份健壮。另外,在电梯算法中,我最开始的想法是用两个数组来保存所有的数据,然后根据电梯的走向再决定是先输出数组1还是先输出数组2,可是在后来,我发现,其实只要用一个数组
16、就可以解决问题。关键是知道和起始磁道数的分解点,找到了这一点,我就可以根据磁头的走向来确定是先输出分界点之前的数据还是先输出分界点之后的数据,这样就可以节约系统的内存。所以说,程序设计不是在一开始就要想好所有的实现步骤,也有可能在写的过程中,就能够想到很好的数据结构,或解决方案的,所以万事不要怕,虽然开头难,但只要你走下去,用心的思考,总有一个很好的解决方法来解决我们的苦恼的。4:其他方法 本次程序设计的数据结构采用的是数组,不但不能动态的创建还浪费了空间 内存。如果有一种数据结构可以动态创建,则可以节约一定的内存空间,所以在数据结构中,链表是一个更好的选择。在电梯算法中,要先由低到高的输出比
17、初始磁道大的数,在由高到低的输出比初始磁道数要小的磁道数,或者反过来,先由高到低的输出比初始磁道数要小的磁道数,再由低到高的输出比初始磁道大的磁道数,所以在创建链表的时候,应该选择双向链表,然后再把链表排序,再根据一定的算法, 同样可以达到本次设计的要求。本科生课程设计成绩评定表序号评分项目满分实得分1学习态度认真、遵守纪律102设计分析合理性103设计方案正确性、可行性、创造性204设计结果正确性405设计报告的规范性106设计验收10总得分/等级评语:注:最终成绩以五级分制记。优(90-100分)、良(80-89分)、中(70-79分)、及格(60-69分)、60分以下为不及格指导教师签名:2013年 月 日
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1