1安徽师范大学学院实验报告专业名称软件工程实验室2#201实验课程操作系统实验实验名称磁盘调度算法姓名学号同组人员实验日期2013/6/142注:实验报告应包含(实验目的,实验原理,主要仪器设备和材料,实验过程和步骤,实验原始数据记录和处理,实验结果和分析,成绩评定)等七项内容。具体内容可根据专业特点和实验性质略作调整,页面不够可附页。一、实验目的通过这个实验,加深对磁盘调度算法的理解,进一步掌握先来先服务FCFS、最短寻道时间优先SSTF、SCAN、CSCAN算法。二、实验内容利用高级语言编写先来先服务FCFS、最短寻道时间优先SSTF、SCAN、CSCAN算法。三、实验环境1.PC微机。2.Windows操作系统。3.C/C++/VB开发集成环境。四、实验源代码#includestdio.h#includestdlib.h#includeiostream.h#includemath.h#definemaxnumber1000intdecide(charstr[])//判断输入数据是否有效{inti=0;while(str[i]!='\0'){if(str[i]'0'||str[i]'9'){return0;break;}i++;}returni;}3inttrans(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;intt;for(i=0;im;i++)//使用冒泡法按从小到大顺序排列for(j=i+1;jm;j++){if(cidao[i]cidao[j]){t=cidao[i];cidao[i]=cidao[j];cidao[j]=t;}}cout排序后的磁盘序列为:;for(i=0;im;i++)//输出排序结果{coutcidao[i];}coutendl;returncidao;4}voidFCFS(intcidao[],intm)//磁道号数组,个数为m{intn;//当前磁道号intsum=0;//总寻道长度intj,i;intb;charstr[100];floatave;//平均寻道长度cout磁盘请求序列为:;for(i=0;im;i++)//按先来先服务的策略输出磁盘请求序列{coutcidao[i];}coutendl;cout请输入当前的磁道号:;B:cinstr;//对输入数据进行有效性判断b=decide(str);if(b==0){cout输入数据的类型错误,请重新输入!endl;gotoB;}elsen=trans(str,b);//输入当前磁道号sum+=abs(cidao[0]-n);cout磁盘扫描序列为:;for(i=0;im;i++)//输出磁盘扫描序列{coutcidao[i];}for(i=0,j=1;jm;i++,j++)//求平均寻道长度{sum+=abs(cidao[j]-cidao[i]);5ave=(float)(sum)/(float)(m);}coutendl;cout平均寻道长度:aveendl;}voidSSTF(intcidao[],intm){intr=1;intn,l,s;inti,j,sum=0;inta;charstr[100];floatave;cidao=bubble(cidao,m);//调用冒泡排序算法排序cout请输入当前的磁道号:;C:cinstr;//对输入数据进行有效性判断a=decide(str);if(a==0){cout输入数据的类型错误,请重新输入!endl;gotoC;}elsen=trans(str,a);//输入当前磁道号if(cidao[m-1]=n)//若当前磁道号大于请求序列中最大者,则直接由外向内依次给予各请求服务{cout磁盘扫描序列为:;for(i=m-1;i=0;i--)coutcidao[i];sum=n-cidao[0];}if(cidao[0]=n)//若当前磁道号小于请求序列中最小者,则直接由内向外6依次给予各请求服务{cout磁盘扫描序列为:;for(i=0;im;i++)coutcidao[i];sum=cidao[m-1]-n;}if(ncidao[0]&&ncidao[m-1])//若当前磁道号大于请求序列中最小者且小于最大者{cout磁盘扫描序列为:;while(cidao[r]n)//确定当前磁道在已排的序列中的位置,后面的算法都用到了,可以直接复制后少量修改,节省时间。{r++;}l=r-1;s=r;while((l=0)&&(sm))//当前磁道在请求序列范围内{if((n-cidao[l])=(cidao[s]-n))//选择与当前磁道最近的请求给予服务{coutcidao[l];sum+=n-cidao[l];n=cidao[l];l=l-1;}else{coutcidao[s];sum+=cidao[s]-n;n=cidao[s];s=s+1;}}7if(l==-1)//磁头移动到序列的最小号,返回外侧扫描仍未扫描的磁道{for(j=s;jm;j++){coutcidao[j];}sum+=cidao[m-1]-cidao[0];}else//磁头移动到序列的最大号,返回内侧扫描仍未扫描的磁道{for(j=l;j=0;j--){coutcidao[j];}sum+=cidao[m-1]-cidao[0];}}ave=(float)(sum)/(float)(m);coutendl;cout平均寻道长度:aveendl;}voidSCAN(intcidao[],intm)//先要给出当前磁道号和移动臂的移动方向{intr=1;intn,l,s,d;inti,j,sum=0;inta;charstr[100];floatave;cidao=bubble(cidao,m);//调用冒泡排序算法排序cout请输入当前的磁道号:;D:cinstr;//对输入数据进行有效性判断a=decide(str);8if(a==0){cout输入数据的类型错误,请重新输入!endl;gotoD;}elsen=trans(str,a);//输入当前磁道号if(cidao[m-1]=n)//若当前磁道号大于请求序列中最大者,则直接由外向内依次给予各请求服务,此情况同最短寻道优先{cout磁盘扫描序列为:;for(i=m-1;i=0;i--)coutcidao[i];sum=n-cidao[0];}if(cidao[0]=n)//若当前磁道号小于请求序列中最小者,则直接由内向外依次给予各请求服务,此情况同最短寻道优先{cout磁盘扫描序列为:;for(i=0;im;i++)coutcidao[i];sum=cidao[m-1]-n;}if(ncidao[0]&&ncidao[m-1])//若当前磁道号大于请求序列中最小者且小于最大者{while(cidao[r]n){r++;}l=r-1;s=r;cout请输入当前移动臂的移动的方向(1表示向外,0表示向内):;cind;if(d==0)//选择移动臂方向向内,则先向内扫描9{cout磁盘扫描序列为:;for(j=l;j=0;j--){coutcidao[j];//输出向内扫描的序列}for(j=s;jm;j++)//磁头移动到最小号,则改变方向向外扫描未扫描的磁道{coutcidao[j];//输出向外扫描的序列}sum=n-2*cidao[0]+cidao[m-1];}else//选择移动臂方向向外,则先向外扫描{cout磁盘扫描序列为:;for(j=s;jm;j++){coutcidao[j];//输出向外扫描的序列}for(j=l;j=0;j--)//磁头移动到最大号,则改变方向向内扫描未扫描的磁道{coutcidao[j];}sum=-n-cidao[0]+2*cidao[m-1];}}ave=(float)(sum)/(float)(m);coutendl;cout平均寻道长度:aveendl;}voidCSCAN(intcidao[],intm)10{intr=1;intn,l,s;inti,j,sum=0;inta;charstr[100];floatave;cidao=bubble(cidao,m);//调用冒泡排序算法排序cout请输入当前的磁道号:;E:cinstr;//对输入数据进行有效性判断a=decide(str);if(a==0){cout输入数据的类型错误,请重新输入!endl;gotoE;}elsen=trans(str,a);//输入当前磁道号if(cidao[m-1]=n)//若当前磁道号大于请求序列中最大者,则直接将移动臂移动到最小号磁道依次向外给予各请求服务{cout磁盘扫描序列为:;for(i=0;im;i++)coutcidao[i];sum=n-2*cidao[0]+cidao[m-1];}if(cidao[0]=n)//若当前磁道号小于请求序列中最小者,则直接由内向外依次给予各请求服务,此情况同最短寻道优先{cout磁盘扫描序列为:;for(i=0;im;i++)coutcidao[i];sum=cidao[m-1]-n;}if(ncidao[0]&&ncidao[m-1])//若当前磁道号大于请求序列中最小者且11小于最大者{cout磁盘扫描序列为:;while(cidao[r]n)//单向反复地从内向外扫描{r++;}l=r-1;s=r;for(j=s;jm;j++){coutcidao[j];//输出从当前磁道向外扫描的序列}for(j=0;js;j++)//当扫描完最大号磁道,磁头直接移动到最小号磁道,再向外扫描未扫描的磁道{coutcidao[j];}sum=2*cidao[m-1]+cidao[l]-n-2*cidao[0];}ave=(float)(sum)/(float)(m);coutendl;cout平均寻道长度:aveendl;}voidmain(){inta;intc;//菜单项intcidao[maxnumber];inti=0,count;charstr[100];cout请输入磁道序列(0结束):endl;A:cinstr;//对输入数据进行有效性判断a=decide(str);if(a==0){12cout输入数据的类型错误,请重新输入!endl;gotoA;//输入错误,跳转到A,重新输入}elsecidao[i]=trans(str,a);i++;while(cidao[i-1]!=0){cinstr;//对输入数据进行有效性判断a=decide(str);if(a==0)cout输入数据的类型错误,请重新输入!endl;else{cidao[i]=trans(str,a);i++;}}count=i-1;//要访问的磁道数cout你输入的磁道序列为:;for(i=0;icount;i++){coutcidao[i];//输出磁道序列}coutendl;while(1){coutendl;cout********************************endl;cout**endl;cout*