您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > 磁盘调度算法实验报告-(2)
1磁盘调度算法学生姓名:学生学号:专业班级:指导老师:2013年6月20日21、实验目的:通过这次实验,加深对磁盘调度算法的理解,进一步掌握先来先服务FCFS、最短寻道时间优先SSTF、SCAN和循环SCAN算法的实现方法。2、问题描述:设计程序模拟先来先服务FCFS、最短寻道时间优先SSTF、SCAN和循环SCAN算法的工作过程。假设有n个磁道号所组成的磁道访问序列,给定开始磁道号m和磁头移动的方向(正向或者反向),分别利用不同的磁盘调度算法访问磁道序列,给出每一次访问的磁头移动距离,计算每种算法的平均寻道长度。3、需求分析通过这次实验,加深对磁盘调度算法的理解,进一步掌握先来先服务FCFS、最短寻道时间优先SSTF、SCAN和循环SCAN算法的实现方法。通过已知开始磁道数、访问磁道总数、磁道号访问序列、访问方向及访问方式得到访问序列及移动距离和平均移动距离!(1)输入的形式;intTrackOrder[MaxNumber];//被访问的磁道号序列intdirection;//寻道方向intNum;//访问的磁道号数目3intstart;//(2)输出的形式;intMoveDistance[MaxNumber]={0};//移动距离doubleAverageDistance=0;//平均寻道长度移动的序列!(3)程序所能达到的功能;模拟先来先服务FCFS、最短寻道时间优先SSTF、SCAN和循环SCAN算法的工作过程。假设有n个磁道号所组成的磁道访问序列,给定开始磁道号m和磁头移动的方向(正向或者反向),分别利用不同的磁盘调度算法访问磁道序列,给出每一次访问的磁头移动距离,计算每种算法的平均寻道长度。(4)测试数据,包括正确的输入及其输出结果和含有错误的输入及其输出结果。开始磁道号:100磁道号方向:内(0)和外(1)磁道号数目:9页面序列:5558391890160150381844、概要设计说明本程序中用到的所有抽象数据类型的定义、主程序的流程以及各程序模块之间的层次(调用)关系。4intTrackOrder[MaxNumber];//被访问的磁道号序列intMoveDistance[MaxNumber]={0};//移动距离doubleAverageDistance=0;//平均寻道长度intdirection;//寻道方向intNum;//访问的磁道号数目intstart;//开始磁道号5、详细设计实现程序模块的具体算法。56、调试分析(1)调试过程中遇到的问题以及解决方法,设计与实现的回顾讨论和分析;在SCAN_CSAN算法中在访问不同的数组时没有注意到上一个磁道号和要访问的磁道号的大小比较导致结果不对,后来在分析结果中找出原因。(2)算法的性能分析(包括基本操作和其它算法的时间复杂度和空间复杂度的分析)及其改进设想;6FCFS:时间复杂度为O(1)空间复杂度为:O(1)SSTF:时间复杂度为O(n^2)空间复杂度为:O(1)SCAN_CSAN:时间复杂度为O(n^2)空间复杂度为:O(1)7、用户使用说明程序的使用说明,列出每一步的操作步骤。(1)输入开始磁道号(2)输入访问磁道号总数(3)输入访问磁道号序列序列(4)选择算法(5)选择方向(6)得出结果8、测试结果789、存在问题在求移动距离时,若调用C++的库函数求绝对值会更方便!10、心得体会首先要明确磁盘调度的原理,画出算法流程图!这样在解决问题时更容易!11、附录9程序源代码:#includeiostream.h#defineMaxNumber100voidFCFS(intTrackOrder[MaxNumber],intMoveDistance[MaxNumber],doubleAverageDistance,intstart,intNum){inti,temp=start,sum=0;cout移动顺序移动距离endl;for(i=0;iNum;i++){if(TrackOrder[i]temp)MoveDistance[i]=TrackOrder[i]-temp;elseMoveDistance[i]=temp-TrackOrder[i];sum+=MoveDistance[i];temp=TrackOrder[i];coutTrackOrder[i]MoveDistance[i]endl;}coutendl;AverageDistance=sum*1.0/Num;cout平均寻道长度:AverageDistanceendl;}voidSSTF(intTrackOrder[MaxNumber],intMoveDistance[MaxNumber],doubleAverageDistance,intstart,intNum){inttemp=start,sum=0,s,count=0,min;intkind[MaxNumber]={0};cout移动顺序移动距离endl;while(countNum){for(inti=0;iNum;i++){if(kind[i]==0){if(TrackOrder[i]temp)min=TrackOrder[i]-temp;elsemin=temp-TrackOrder[i];s=i;break;10}}inttemp1;for(i=0;iNum;i++)//找出里此时磁道距离最近的磁道号{if(TrackOrder[i]temp)temp1=TrackOrder[i]-temp;elsetemp1=temp-TrackOrder[i];if(temp1min&&kind[i]==0){min=temp1;s=i;}}MoveDistance[count]=min;sum+=MoveDistance[s];temp=TrackOrder[s];coutTrackOrder[s]MoveDistance[s]endl;kind[s]=1;count++;}coutendl;AverageDistance=sum*1.0/Num;cout平均寻道长度:AverageDistanceendl;}voidpaixu(inta[MaxNumber],intn,intTrackOrder[MaxNumber])//从小到大排序{intsym=0;while(sym==0){intkind=0;for(inti=0;in-1;i++){ints1=a[i];ints2=a[i+1];if(TrackOrder[s1]TrackOrder[s2]){ints=a[i+1];a[i+1]=a[i];a[i]=s;kind=1;11}}if(kind==0)sym=1;}}voidSCAN_CSAN(intTrackOrder[MaxNumber],intMoveDistance[MaxNumber],doubleAverageDistance,intstart,intNum,intdirection,intchioce){intsum=0;inta[MaxNumber],b[MaxNumber];inttemp=start;inti,num1=0,num2=0;cout移动顺序移动距离endl;for(i=0;iNum;i++)//分类{if(TrackOrder[i]temp){a[num1]=i;num1++;}else{b[num2]=i;num2++;}}paixu(a,num1,TrackOrder);//将数组按从小到达排序paixu(b,num2,TrackOrder);//将数组按从小到达排序ints;if(direction==0)//访问方向向外{for(i=0;inum1;i++)//先访问num1并从前往后访问{s=a[i];MoveDistance[s]=TrackOrder[s]-temp;sum+=MoveDistance[s];temp=TrackOrder[s];coutTrackOrder[s]MoveDistance[s]endl;}if(chioce==3)//SCAN算法{for(i=num2-1;i=0;i--)//再访问num2并且从后往前访问{12s=b[i];MoveDistance[s]=temp-TrackOrder[s];sum+=MoveDistance[s];temp=TrackOrder[s];coutTrackOrder[s]MoveDistance[s]endl;}}else//CSAN算法{s=b[0];MoveDistance[s]=temp-TrackOrder[s];sum+=MoveDistance[s];temp=TrackOrder[s];coutTrackOrder[s]MoveDistance[s]endl;for(i=1;inum2;i++)//再访问num2并且从前往后访问{s=b[i];MoveDistance[s]=TrackOrder[s]-temp;sum+=MoveDistance[s];temp=TrackOrder[s];coutTrackOrder[s]MoveDistance[s]endl;}}}else//访问方向向内{for(i=num2-1;i=0;i--)//先访问num2并且从后往前访问{s=b[i];MoveDistance[s]=temp-TrackOrder[s];sum+=MoveDistance[s];temp=TrackOrder[s];coutTrackOrder[s]MoveDistance[s]endl;}if(chioce==3)//SCAN算法{for(i=0;inum1;i++)//再访问num1并且从前往后访问{s=a[i];MoveDistance[s]=TrackOrder[s]-temp;sum+=MoveDistance[s];temp=TrackOrder[s];coutTrackOrder[s]MoveDistance[s]endl;13}}else//CSAN算法{s=a[num1-1];MoveDistance[s]=TrackOrder[s]-temp;sum+=MoveDistance[s];temp=TrackOrder[s];coutTrackOrder[s]MoveDistance[s]endl;for(i=num1-2;i=0;i--)//再访问num1并且从后往前访问{s=a[i];MoveDistance[s]=temp-TrackOrder[s];sum+=MoveDistance[s];temp=TrackOrder[s];coutTrackOrder[s]MoveDistance[s]endl;}}}coutendl;AverageDistance=sum*1.0/Num;cout平均寻道长度:AverageDistanceendl;}voidmain(){intTrackOrder[MaxNumber];//被访问的磁道号序列intMoveDistance[MaxNumber]={0};//移动距离doubleAverageDistance=0;//平均寻道长度intdirection;//寻道方向intNum;//访问的磁道号数目intstart;//开始磁道号intkind=0,chioce;cout请输入开始磁道号:;cinstart;cout请输入访问的磁道号数目:;cinNum;cout请输入被访问的磁道号序列:;for(inti=0;iNum;i++)cinTrackOrder[i];while(kind==0){14cout请选
本文标题:磁盘调度算法实验报告-(2)
链接地址:https://www.777doc.com/doc-2140145 .html