您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > 操作系统磁盘调度算法实验报告及代码
华南农业大学信息(软件)学院《操作系统分析与设计实习》成绩单开设时间:2014学年第一学期小组成员、组内分工及各成员成绩学号姓名分工成绩实验题目题目二磁盘调度算法的模拟实现及对比自我评价通过这次的操作系统课程设计,我懂得了许多,首先是让我对操作系统磁盘调度策略有了更加深刻的认识,自己动手操作比光看书能更加了解磁盘调度的策略和原理,同时对磁盘调度的四种算法——先来先服务算法(FCFS)、最短寻道时间优先算法(SSTF)、有了更深刻的理解和掌握,使我能够为磁盘调度选择适当的算法,提高CPU工作效率。设计过程中遇到的困难在老师和同学的帮助下顺利解决并通过了验收,我深刻认识到算法的逻辑性对程序的重要影响,算法的准确度对程序运行结果的重要影响,这对我以后在操作系统的学习中有极大帮助。也增强了我写代码的能力,尤其是设计算法有了进步,知道了时间复杂度的重要性。由于这次的课程设计是单人做的,所以也增强了独立做程序的能力。不过,通过这次课程设计,我也了解到自己有很多不足,比如在设计界面方面明显经验不足,许多地方都需要上网查询,以至于界面的简陋,代码也不够工整明了。总的来说,这次课程设计不仅提升了自己的知识和能力,还让自己知道了自己的许多不足之处。教师评语评价指标:题目内容和要求完成情况优□良□中□差□对算法原理的理解程度优□良□中□差□程序设计水平优□良□中□差□程序运行效果及正确性优□良□中□差□课程设计报告结构清晰优□良□中□差□报告中总结和分析详尽优□良□中□差□教师签名一、需求分析:(1)输入的形式和输入值的范围:在文本框输入序列长度,输入值为int类型(2)输出的形式:输出每种磁盘调度算法的服务序列(3)程序所能达到的功能:模拟实现FCFS、SSTF、电梯LOOK、C-SCAN算法,并计算及比较磁头移动道数。测试数据:包括正确的输入及其输出结果和含有错误的输入及其输出结果。输入磁道范围0~1000输入所选磁道个数0~1000选择算法1~4二、概要设计:主程序流程图:三、详细设计:先来先服务算法(FCFS):按先来后到次序服务,未作优化。最简单的移臂调度算法是“先来先服务”调度算法,这个算法实际上不考虑访问者要求访问的物理位置,而只是考虑访问者提出访问请求的先后次序。采用先来先服务算法决定等待访问者执行输入输出操作的次序时,移动臂来回地移动。先来先服务算法花费的寻找时间较长,所以执行输入输出操作的总时间也很长。最短寻道时间优先算法(SSTF):最短寻找时间优先调度算法总是从等待访问者中挑选寻找时间最短的那个请求先执行的,而不管访问者到来的先后次序。与先来先服务、算法比较,大幅度地减少了寻找时间,因而缩短了为各访问者请求服务的平均时间,也就提高了系统效率。但最短查找时间优先(SSTF)调度,FCFS会引起读写头在盘面上的大范围移动,SSTF查找距离磁头最短(也就是查找时间最短)的请求作为下一次服务的对象。SSTF查找模式有高度局部化的倾向,会推迟一些请求的服务,甚至引起无限拖延(又称饥饿)。扫描算法(SCAN):SCAN算法又称电梯调度算法。SCAN算法是磁头前进方向上的最短查找时间优先算法,它排除了磁头在盘面局部位置上的往复移动,SCAN算法在很大程度上消除了SSTF算法的不公平性,但仍有利于对中间磁道的请求。“电梯调度”算法是从移动臂当前位置开始沿着臂的移动方向去选择离当前移动臂最近的那个柱访问者,如果沿臂的移动方向无请求访问时,就改变臂的移动方向再选择。但是,“电梯调度”算法在实现时,不仅要记住读写磁头的当前位置,还必须记住移动臂的当前前进方向。循环扫描(C-SCAN):循环扫描CSCAN是为了减少SCAN算法造成的某些进程的请求被严重推迟,CSCAN算法规定磁头单向移动。函数调用关系图:四、调试分析:(1)调试过程中遇到的问题是如何解决的以及对设计与实现的讨论和分析;通过对每一行的输出判断问题出现在哪里,然后把出问题的地方缩小到一定范围,然后解决问题,如若解决不出则上网查询,再不行就咨询同学。设计主要分为界面设计和算法设计,界面设计部分并没有进行过多的改进,算法部分SSTF算法实现的比较复杂,时间复杂度较高。(2)算法的时间复杂性(包括基本操作和其他算法的时间复杂性的分析)和改进设想;FIFO算法经历一重循环,时间复杂度为O(n),算法比较简单;SSTF算法经历二重循环,时间复杂度为O(n^2),算法较为复杂SCAN和CSCAN算法含多个一重循环,时间复杂度为O(n),动态数组存储服务序列;(3)设计过程的经验和体会;设计过程必须要考虑时间复杂度,过高的时间复杂度会导致程序执行效率低下。必须要进行结构化设计,各个模块要很清晰的体现,能在代码中找到相关模块的代码,这样才便于程序的维护和调试。(4)实现过程中出现的主要问题及解决方法。主要问题是SSTF算法的设计。解决方法是上网查询SSTF算法的代码,学习其中的算法思想,然后运用到自己的代码中去。五、运行结果:输入磁道范围、输入所选磁道个数、选择算法:测试与运行结果:输出请求序列、平均寻道时间:六、总结:通过这次的操作系统课程设计,我懂得了许多,首先是让我对操作系统磁盘调度策略有了更加深刻的认识,自己动手操作比光看书能更加了解磁盘调度的策略和原理,同时对磁盘调度的四种算法——先来先服务算法(FCFS)、最短寻道时间优先算法(SSTF)、有了更深刻的理解和掌握,使我能够为磁盘调度选择适当的算法,提高CPU工作效率。设计过程中遇到的困难在老师和同学的帮助下顺利解决并通过了验收,我深刻认识到算法的逻辑性对程序的重要影响,算法的准确度对程序运行结果的重要影响,这对我以后在操作系统的学习中有极大帮助。也增强了我写代码的能力,尤其是设计算法有了进步,知道了时间复杂度的重要性。由于这次的课程设计是单人做的,所以也增强了独立做程序的能力。不过,通过这次课程设计,我也了解到自己有很多不足,比如在设计界面方面明显经验不足,许多地方都需要上网查询,以至于界面的简陋,代码也不够工整明了。总的来说,这次课程设计不仅提升了自己的知识和能力,还让自己知道了自己的许多不足之处。七、源代码:#includestdio.h#includeiostream#includestring.h#includemath.husingnamespacestd;#definemaxsize1000//判断输入的数据是否有效intdecide(charstr[]){inti=0;while(str[i]!='\0'){if(str[i]'0'||str[i]'9'){return0;break;}i++;}returni;}//将字符串转换为数字inttrans(charstr[],inta){inti;intsum=0;for(i=0;ia;i++){sum=sum+(int)((str[i]-'0')*pow(10,a-i-1));}returnsum;}//冒泡排序算法int*bubble(intcidao[],intm){inti,j;inttemp;for(i=0;im;i++)for(j=i+1;jm;j++){if(cidao[i]cidao[j]){temp=cidao[i];cidao[i]=cidao[j];cidao[j]=temp;}}cout排序后的磁盘序列为:;for(i=0;im;i++){coutcidao[i];}coutendl;returncidao;}//当前磁道输入intprintnow(){charstr[10];inta,now;cout请输入当前磁道号:;A:cinstr;a=decide(str);if(a==0){cout输入数据类型有误,请重新输入!endl;gotoA;}elsenow=trans(str,a);returnnow;}intprintoi(intcidao[],intnow,intm){inti;intsum=0;cout磁道扫描序列为:;for(i=m-1;i=0;i--){coutcidao[i];sum+=abs(now-cidao[i]);now=cidao[i];}returnsum;}//直接由内向外依次给予各请求服务intprintio(intcidao[],intnow,intm){inti;intsum=0;cout磁道扫描序列为:;for(i=0;im;i++){coutcidao[i];sum+=abs(cidao[i]-now);now=cidao[i];}returnsum;}//直接从当前次磁道到最外,再由外向内依次给予各请求服务intprintioi(intcidao[],intnow,intm){inti;intsum=0;cout磁道扫描序列为:;for(i=m-1;i=0;i--){coutcidao[i];sum+=abs(now-cidao[i]);now=cidao[i];}returnsum;}//直接从当前次磁道到最内,再由内向外依次给予各请求服务intprintoio(intcidao[],intnow,intm){inti;intsum=0;cout磁道扫描序列为:;for(i=0;im;i++){coutcidao[i];sum+=abs(cidao[i]-now);now=cidao[i];}returnsum;}//先向磁道减小的方向,再向磁道增加的方向intprintsb(intcidao[],intnow,intm){intk=0;intl=0;intr=0;intj;intsum=0;while(cidao[k]now){k++;}l=k+1;r=k;for(j=l;j=0;j--){coutcidao[j];sum+=now-cidao[j];now=cidao[j];}now=cidao[0];while(rm){coutcidao[r];sum+=cidao[r]-now;now=cidao[r];r++;}returnsum;}//先向磁道增加的方向,再向磁道减小的方向intprintbs(intcidao[],intnow,intm){intk=0;intl=0;intr=0;intj;intsum=0;while(cidao[k]now){k++;}l=k+1;r=k;while(rm){coutcidao[r];sum+=cidao[r]-now;now=cidao[r];r++;}now=cidao[m-1];for(j=l;j=0;j--){coutcidao[j];sum+=now-cidao[j];now=cidao[j];}returnsum;}//先向磁道减小的方向,再从磁道最大的地方向减小的方向,intprintsbs(intcidao[],intnow,intm){intk=0;intl=0;intr=0;intj;intsum=0;cout磁盘扫描序列为:;while(cidao[k]now){k++;}l=k-1;r=k;for(j=l;j=0;j--){coutcidao[j];sum+=now-cidao[j];now=cidao[j];}now=cidao[0];//sum+=abs(cidao[0]-cidao[m-1]);for(j=m-1;j=r;j--){coutcidao[j];sum+=abs(now-cidao[j]);now=cidao[j];}returnsum;}//先向磁道增大的方向,再从磁道最小的地方向向增大的方向intprintbsb(intcidao[],intnow,intm){intk=0;intl=0;intr=0;intj;intsum=0;cout磁盘扫描序列为:;while(cidao[k]now){k++
本文标题:操作系统磁盘调度算法实验报告及代码
链接地址:https://www.777doc.com/doc-2339828 .html