您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > 磁盘调度算法实验设计报告
西南大学《操作系统原理》实验报告1/18实验五磁盘调度算法班级:xxxxxxxxxxxx姓名:xxxxxxxx学号:xxxxxxxxxxxxxxxxxxxxx上级日期:2018年11月成绩:___________________________一、实验目的:通过磁盘调度算法设计一个磁盘调度模拟系统,从而使磁盘调度算法更加形象化,容易理解,使磁盘调度的特点更简单明了,加深对先来先服务算法、最短寻道时间优先算法、扫描算法以及循环扫描算法等磁盘调度算法的理解二、实验内容1、程序流程图模块调用关系图退出先来先服务算法最短寻道时间优先扫描算法循环扫描算法磁盘调度模拟系统西南大学《操作系统原理》实验报告2/18模块程序流程图FCFS算法(先来先服务)流程图输入磁道号求平均寻道长输出移动的平均磁道数按输入顺序将磁道序列输出开始结西南大学《操作系统原理》实验报告3/18SSTF(最短寻道时间优先算法)流程图求平均寻道长选择与当前磁道距离最近的磁道进行扫描移动到最小(大)号,改向外(内)移动扫描未扫描的磁道输出移动的平均磁道数输出排好序的磁道序列判断当前磁头在序列中的位结束开始输入磁道号使用冒泡法从小到大排序输入当前磁道西南大学《操作系统原理》实验报告4/18SCAN算法(扫描算法)流程图求平均寻道长选择移动臂移动方向,开始扫描移动到最小(大)号,改向外(内)移动扫描未扫描的磁道输出移动的平均磁道数输出排好序的磁道序列开始结束输入磁道号使用冒泡法从小到大排序输入当前磁道判断当前磁头在序列中的位西南大学《操作系统原理》实验报告5/18CSCAN算法(循环扫描算法)流程图求平均寻道长扫描到最大号后,直接移动到最小号从内向外扫描未扫描的磁道输出移动的平均磁道数输出排好序的磁道序列判断当前磁头在序列中的位规定移动臂单向反复的从内向外扫描开始结束输入磁道号使用冒泡法从小到大排序输入当前磁道西南大学《操作系统原理》实验报告6/182、程序源码1.#includestdio.h2.#includestdlib.h3.#includeiostream4.#includemath.h5.usingnamespacestd;6.#definemaxsize10007./*********************判断输入数据是否有效**************************/8.intdecide(charstr[])//判断输入数据是否有效9.{10.inti=0;11.while(str[i]!='\0')12.{13.if(str[i]'0'||str[i]'9')14.{15.return0;16.break;17.}18.i++;19.}20.returni;21.}22./******************将字符串转换成数字***********************/23.inttrans(charstr[],inta)//将字符串转换成数字24.{25.inti;26.intsum=0;27.for(i=0;ia;i++)28.{29.sum=sum+(int)((str[i]-'0')*pow(10,a-i-1));30.}31.returnsum;32.}33./*********************冒泡排序算法**************************/34.int*bubble(intcidao[],intm)35.{36.inti,j;37.inttemp;38.for(i=0;im;i++)//使用冒泡法按从小到大顺序排列39.for(j=i+1;jm;j++)40.{41.if(cidao[i]cidao[j])42.{西南大学《操作系统原理》实验报告7/1843.temp=cidao[i];44.cidao[i]=cidao[j];45.cidao[j]=temp;46.}47.}48.cout排序后的磁盘序列为:;49.for(i=0;im;i++)//输出排序结果50.{51.coutcidao[i];52.}53.coutendl;54.returncidao;55.}56./*********************先来先服务调度算法************************/57.voidFCFS(intcidao[],intm)//磁道号数组,个数为m58.{59.intnow;//当前磁道号60.intsum=0;//总寻道长度61.intj,i;62.inta;63.charstr[100];64.floatave;//平均寻道长度65.cout磁盘请求序列为:;66.for(i=0;im;i++)//按先来先服务的策略输出磁盘请求序列67.{68.coutcidao[i];69.}70.coutendl;71.cout请输入当前的磁道号:;72.B:cinstr;//对输入数据进行有效性判断73.a=decide(str);74.if(a==0)75.{76.cout输入数据的类型错误,请重新输入!endl;77.gotoB;78.}79.else80.now=trans(str,a);//输入当前磁道号81.sum+=abs(cidao[0]-now);82.cout磁盘扫描序列为:;83.for(i=0;im;i++)//输出磁盘扫描序列84.{85.coutcidao[i];86.}西南大学《操作系统原理》实验报告8/1887.for(i=0,j=1;jm;i++,j++)//求平均寻道长度88.{89.sum+=abs(cidao[j]-cidao[i]);90.ave=(float)(sum)/(float)(m);91.}92.coutendl;93.cout平均寻道长度:aveendl;94.}95./**********************最短寻道时间优先调度算法********************/96.voidSSTF(intcidao[],intm)97.{98.intk=1;99.intnow,l,r;100.inti,j,sum=0;101.inta;102.charstr[100];103.floatave;104.cidao=bubble(cidao,m);//调用冒泡排序算法排序105.cout请输入当前的磁道号:;106.C:cinstr;//对输入数据进行有效性判断107.a=decide(str);108.if(a==0)109.{110.cout输入数据的类型错误,请重新输入!endl;111.gotoC;112.}113.else114.now=trans(str,a);//输入当前磁道号115.if(cidao[m-1]=now)//若当前磁道号大于请求序列中最大者,则直接由外向内依次给予各请求服务116.{117.cout磁盘扫描序列为:;118.for(i=m-1;i=0;i--)119.coutcidao[i];120.sum=now-cidao[0];121.}122.if(cidao[0]=now)//若当前磁道号小于请求序列中最小者,则直接由内向外依次给予各请求服务123.{124.cout磁盘扫描序列为:;125.for(i=0;im;i++)126.coutcidao[i];127.sum=cidao[m-1]-now;128.}西南大学《操作系统原理》实验报告9/18129.if(nowcidao[0]&&nowcidao[m-1])//若当前磁道号大于请求序列中最小者且小于最大者130.{131.cout磁盘扫描序列为:;132.while(cidao[k]now)//确定当前磁道在已排的序列中的位置,后面的算法都用到了,可以直接复制后少量修改,节省时间。133.{134.k++;135.}136.l=k-1;137.r=k;138.while((l=0)&&(rm))//当前磁道在请求序列范围内139.{140.if((now-cidao[l])=(cidao[r]-now))//选择与当前磁道最近的请求给予服务141.{142.coutcidao[l];143.sum+=now-cidao[l];144.now=cidao[l];145.l=l-1;146.}147.else148.{149.coutcidao[r];150.sum+=cidao[r]-now;151.now=cidao[r];152.r=r+1;153.}154.}155.if(l==-1)//磁头移动到序列的最小号,返回外侧扫描仍未扫描的磁道156.{157.for(j=r;jm;j++)158.{159.coutcidao[j];160.}161.sum+=cidao[m-1]-cidao[0];162.}163.else//磁头移动到序列的最大号,返回内侧扫描仍未扫描的磁道164.{165.for(j=l;j=0;j--)166.{167.coutcidao[j];168.}169.sum+=cidao[m-1]-cidao[0];西南大学《操作系统原理》实验报告10/18170.}171.}172.ave=(float)(sum)/(float)(m);173.coutendl;174.cout平均寻道长度:aveendl;175.}176.177.178./*************************扫描调度算法*************************/179.voidSCAN(intcidao[],intm)//先要给出当前磁道号和移动臂的移动方向180.{181.intk=1;182.intnow,l,r,d;183.inti,j,sum=0;184.inta;185.charstr[100];186.floatave;187.cidao=bubble(cidao,m);//调用冒泡排序算法排序188.cout请输入当前的磁道号:;189.D:cinstr;//对输入数据进行有效性判断190.a=decide(str);191.if(a==0)192.{193.cout输入数据的类型错误,请重新输入!endl;194.gotoD;195.}196.else197.now=trans(str,a);//输入当前磁道号198.if(cidao[m-1]=now)//若当前磁道号大于请求序列中最大者,则直接由外向内依次给予各请求服务,此情况同最短寻道优先199.{200.cout磁盘扫描序列为:;201.for(i=m-1;i=0;i--)202.coutcidao[i];203.sum=now-cidao[0];204.}205.if(cidao[0]=now)//若当前磁道号小于请求序列中最小者,则直接由内向外依次给予各请求服务,此情况同最短寻道优先206.{207.cout磁盘扫描序列为:;208.for(i=0;im;i++)209.coutcidao[i];210.sum=cidao[m-1]-now;211.}西南大学《操作系统原理》实验报告11/18212.if(nowcidao[0]&&nowcidao[m-1])//若当前磁道号大于请求序列中最小者且小于最大者213.{214.while(cidao[k]now)215.{216.k++;217.}218.l=k-1;219.r=k;220.cout请输入当前移动臂的移动的方向(1表示向外,0表示向内):;221.cind;222.if(d==0)//选择移动臂方向向内,则先向内扫描223.{224.cout磁盘扫描序列为:;225.for(j
本文标题:磁盘调度算法实验设计报告
链接地址:https://www.777doc.com/doc-5840695 .html