南京工程学院上机实验报告课程名称:操作系统实验项目名称:移动臂调度算法的实现学生班级:学生学号:学生姓名:指导教师:实验时间:实验地点:信息楼专业机房实验成绩评定:2016-2017-1学期1一、实验目的及内容掌握操作系统的设备管理功能,熟悉移动臂调度算法,设计恰当的数据结构和算法,模拟实现移动臂调度算法。要求至少模拟实现一种磁盘移臂调度算法。二、实验相关知识简介磁盘移臂调度的目标就是要使磁盘访问的总时间中的寻找时间最小。因此,磁盘移臂调度要尽量减少磁盘移动臂移动的距离。磁盘移臂调度算法很多,常用的也有好几种,一个好的磁盘调度算法,不仅要使磁盘寻找时间最小,同时,还要避免移动臂频繁地改变移动方向,因为频繁的改向不仅使时间增加,还容易损耗机械部件。常用的磁盘移臂调度算法有:先来先服务、最短寻找时间优先、单向扫描、双向扫描调度算法等。三、解决问题思路及关键程序代码分析(一)最短寻找时间优先调度算法简介最短寻找时间调度算法总是使寻找时间最短的请求最先得到服务,跟请求者的请求时间先后顺序无关。这种算法具有比先来先服务更好的性能。但是该算法可能会出现请求者被“饿死”的情况,当靠近磁头的请求源源不断地到来,这会使早来的但离磁头较远的请求长时间得不到服务。该算法的优点是可以得到较短的平均响应时间,有较好的吞吐量。该算法的缺点是缺乏公平性,对中间磁道的访问比较“照顾”,对两端磁道访问比较“疏远”,相应时间的变化幅度较大。该算法与先来先服务算法一样,都会导致移动臂频繁改向。(二)算法模拟1.对算法设计进行说明该算法的实现中,主要是选择调度处理的磁道是与当前磁头所在磁道距离最近的磁道,以使每次的寻道时间最短。当选择了某个离当前磁头所在磁道最近的磁道,下一轮的当前磁道便改成了上一轮的最近磁道,并且把这个最近的磁道从请求序列取消,直到请求序列中不再有请求的磁道。2.关键代码分析importjava.io.*;importjava.util.*;publicclass{privatestaticintmaxsize=100;privatestaticintDisc[]=newint[maxsize];//请求序列privatestaticintcount;//要访问的磁道数privatestaticintdisc;//当前磁道号privatestaticintperTime;//移过每个柱面需要时间privatestaticintDistance=0;//总寻道长度privatestaticintFindTime;//查找时间privatestaticdoubleAvgDistance;//平均寻道长度publicSuanfa(intdisc,intcount,intperTime,intDisc[]){this.disc=disc;上机实验报告2this.count=count;this.perTime=perTime;for(inti=0;iDisc.length;i++)Disc[i]=Disc[i];}publicvoidinput(){System.out.print(请输入当前磁道号:);Scanners1=newScanner(System.in);disc=s1.nextInt();System.out.print(请输入要访问的磁道数:);Scanners2=newScanner(System.in);count=s2.nextInt();System.out.print(请输入移过每个柱面需要的时间:);Scanners3=newScanner(System.in);perTime=s3.nextInt();System.out.print(请输入磁盘请求序列(以空格隔开):);Scanners4=newScanner(System.in);for(inti=0;icount;i++)Disc[i]=s4.nextInt();}publicvoidDelete(intarr[],intn){for(inti=n;iarr.length-1;i++)arr[i]=arr[i+1];}publicvoidrunning(){intj=0,count1=count;intmin;intdiscc=disc;intDiscc[]=newint[count];while(jcount){intnum=0;min=(Disc[0]=discc)?(Disc[0]-discc):(discc-Disc[0]);for(inti=0;icount1;i++){if(((Disc[i]=discc)&&(Disc[i]-disccmin))||((Disc[i]discc)&&(discc-Disc[i上机实验报告3]min))){min=(Disc[i]=discc)?(Disc[i]-discc):(discc-Disc[i]);num=i;}}Discc[j++]=Disc[num];Distance+=min;discc=Disc[num];Delete(Disc,num);count1--;}AvgDistance=(double)Distance/count;FindTime=perTime*Distance;System.out.print(\n服务序列:+disc+);for(inti=0;icount;i++)System.out.print(Discc[i]+);System.out.println(\n总寻道长度:+Distance);System.out.println(平均寻道长度:+AvgDistance);System.out.println(寻道时间:+FindTime+ms);}publicstaticvoidmain(String[]args){System.out.println(----------最短寻找时间优先算法----------);SuanfaSuanfa=newSuanfa(disc,count,perTime,Disc);Suanfa.input();Suanfa.running();}}四、运行结果程序的运行结果如图所示:上机实验报告4五、体会与提高通过本次的实验设计,把教材中的理论知识转化为实践,在一定程度上深了我对读者-写者这类经典的同步问题的理解,同时也提高了我的动手编程和独立思考的能力。虽然在分析问题的过程中,遇到了很多的疑惑与不解,但同时掌握了很多进程同步的知识教师评语:上机实验报告5