您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > 操作系统-磁盘调度算法-java版
实验六磁盘调度算法1、实验目的通过这次实验,加深对磁盘调度算法的理解,进一步掌握先来先服务FCFS、最短寻道时间优先SSTF、SCAN和循环SCAN算法的实现方法。2、试验内容问题描述:设计程序模拟先来先服务FCFS、最短寻道时间优先SSTF、SCAN和循环SCAN算法的工作过程。假设有n个磁道号所组成的磁道访问序列,给定开始磁道号m和磁头移动的方向(正向或者反向),分别利用不同的磁盘调度算法访问磁道序列,给出每一次访问的磁头移动距离,计算每种算法的平均寻道长度。3、程序要求:1)利用先来先服务FCFS、最短寻道时间优先SSTF、SCAN和循环SCAN算法模拟磁道访问过程。2)模拟四种算法的磁道访问过程,给出每个磁道访问的磁头移动距离。3)输入:磁道个数n和磁道访问序列,开始磁道号m和磁头移动方向(对SCAN和循环SCAN算法有效),算法选择1-FCFS,2-SSTF,3-SCAN,4-循环SCAN。4)输出:每种算法的平均寻道长度。4、需求分析(1)输入的形式和输入值的范围算法选择要访问的磁道数磁道当前磁道号输入当前移动臂的移动的方向(第三个算法)(2)输出的形式每种算法的平均寻道长度(3)测试用例先来先服务FCFS最短寻道时间优先SCAN算法CSCAN5、调试分析通过对这次操作系统实验,使我懂得了操作系统磁盘调度的四种算法:先来先服务算法(FCFS)、最短寻道时间优先算法(SSTF)、扫描算法(SCAN)和循环扫描算法(CSCAN)。加深了我对这门课程的理解。锻炼了自己在考虑全局也不是细节的能力。通过这次实验,再一次熟悉并深入掌握了程序设计语言和算法设计。6、测试结果(1)使用FCFS算法输入输出(2)使用SSTF算法输入输出(3)使用SCAN算法(向增长方向)输入输出(4)使用SCAN算法(向减少方向)输入输出(5)使用CSCAN算法输入输出7、附录(java)packageexperiment;importjava.io.BufferedInputStream;importjava.io.FileInputStream;importjava.io.FileNotFoundException;importjava.util.Scanner;publicclassF_Disc_Dispatch{privatestaticintmaxsize=100;//要访问的磁道数privatestaticintcount;//磁道privatestaticintcidao[]=newint[maxsize];//当前磁道号privatestaticintnow;//总寻道长度privatestaticintsum=0;//平均寻道长度privatestaticdoubleAverageDistance;//当前移动臂的移动的方向(1(true)表示向外,0(false)表示向内)privatestaticbooleandirection;//算法选择//1-使用FCFS算法//2-使用SSTF算法//3-使用SCAN算法//4-使用CSCAN算法privatestaticintoption=0;//for循环用到变量privatestaticinti;privatestaticintj;privatestaticintk;privatestaticScannerstdin;publicstaticvoidmain(String[]args)throwsFileNotFoundException{//输入数据input();//inta;switch(option){case1://使用FCFS算法FCFS();break;case2://使用SSTF算法SSTF();break;case3://使用SCAN算法SCAN();break;case4://使用CSCAN算法CSCAN();break;}}//输入数据publicstaticvoidinput()throwsFileNotFoundException{BufferedInputStreamin=newBufferedInputStream(newFileInputStream(./file/06));System.setIn(in);stdin=newScanner(System.in);//算法选择//1-使用FCFS算法//2-使用SSTF算法//3-使用SCAN算法//4-使用CSCAN算法option=stdin.nextInt();//要访问的磁道数count=stdin.nextInt();//磁道for(i=0;icount;i++){cidao[i]=stdin.nextInt();}//当前磁道号now=stdin.nextInt();if(option==3){//输入当前移动臂的移动的方向(1表示向外,0表示向内):try{intg=stdin.nextInt();if(g==1){direction=true;}else{direction=false;}}catch(Exceptione){//TODO:handleexceptionSystem.out.println(direction没有正确输入);return;}}stdin.close();}/*********************先来先服务调度算法**************************/publicstaticvoidFCFS(){sum+=Math.abs(cidao[0]-now);System.out.print(磁盘扫描序列为:);for(i=0;icount;i++)//输出磁盘扫描序列{System.out.print(cidao[i]+);}for(i=0,j=1;jcount;i++,j++)//求平均寻道长度{sum+=Math.abs(cidao[j]-cidao[i]);AverageDistance=(float)(sum)/(float)(count);}System.out.println();System.out.println(平均寻道长度:+AverageDistance);}/**********************最短寻道时间优先调度算法********************/publicstaticvoidSSTF(){k=1;intl,r;bubble();//调用冒泡排序算法排序if(cidao[count-1]=now)//若当前磁道号大于请求序列中最大者,则直接由外向内依次给予各请求服务{System.out.print(磁盘扫描序列为:);for(i=count-1;i=0;i--){System.out.print(cidao[i]+);}sum=now-cidao[0];}if(cidao[0]=now)//若当前磁道号小于请求序列中最小者,则直接由内向外依次给予各请求服务{System.out.print(磁盘扫描序列为:);for(i=0;icount;i++){System.out.print(cidao[i]+);}sum=cidao[count-1]-now;}if(nowcidao[0]&&nowcidao[count-1])//若当前磁道号大于请求序列中最小者且小于最大者{System.out.print(磁盘扫描序列为:);while(cidao[k]now)//确定当前磁道在已排的序列中的位置,后面的算法都用到了,可以直接复制后少量修改,节省时间。{k++;}l=k-1;r=k;while((l=0)&&(rcount))//当前磁道在请求序列范围内{if((now-cidao[l])=(cidao[r]-now))//选择与当前磁道最近的请求给予服务{System.out.print(cidao[l]+);sum+=now-cidao[l];now=cidao[l];l=l-1;}else{System.out.print(cidao[r]+);sum+=cidao[r]-now;now=cidao[r];r=r+1;}}if(l==-1)//磁头移动到序列的最小号,返回外侧扫描仍未扫描的磁道{for(j=r;jcount;j++){System.out.print(cidao[j]+);}sum+=cidao[count-1]-cidao[0];}else//磁头移动到序列的最大号,返回内侧扫描仍未扫描的磁道{for(j=l;j=0;j--){System.out.print(cidao[j]+);}sum+=cidao[count-1]-cidao[0];}}AverageDistance=(float)(sum)/(float)(count);System.out.println();System.out.println(平均寻道长度:+AverageDistance);}/*****************************扫描调度算法*******************************/publicstaticvoidSCAN()//先要给出当前磁道号和移动臂的移动方向{k=1;intl,r;bubble();//调用冒泡排序算法排序if(cidao[count-1]=now)//若当前磁道号大于请求序列中最大者,则直接由外向内依次给予各请求服务,此情况同最短寻道优先{System.out.print(磁盘扫描序列为:);for(i=count-1;i=0;i--){System.out.print(cidao[i]+);}sum=now-cidao[0];}if(cidao[0]=now)//若当前磁道号小于请求序列中最小者,则直接由内向外依次给予各请求服务,此情况同最短寻道优先{System.out.print(磁盘扫描序列为:);for(i=0;icount;i++)System.out.print(cidao[i]+);sum=cidao[count-1]-now;}if(nowcidao[0]&&nowcidao[count-1])//若当前磁道号大于请求序列中最小者且小于最大者{while(cidao[k]now){k++;}l=k-1;r=k;if(direction==false)//选择移动臂方向向内,则先向内扫描{System.out.print(磁盘扫描序列为:);for(j=l;j=0;j--){System.out.print(cidao[j]+);//输出向内扫描的序列}for(j=r;jcount;j++)//磁头移动到最小号,则改变方向向外扫描未扫描的磁道{System.out.print(cidao[j]+);//输出向外扫描的序列}sum=now-2*cidao[0]+cidao[count-1];}else//选择移动臂方向向外,则先向外扫描{System.out.print(磁盘扫描序列为:);for(j=r;jcount;j++){System.out.print(cidao[j]+);//输出向外扫描的序列}for(j=l;j=0;j--)//磁头移动到最大号,则改变方向向内扫描未扫描的磁道{System.out.print(cidao[j]+);}sum=-now-cidao[0]+2*cidao[count-1];}}AverageDistance=(float)(sum)/(float)(count);System.out.println();System.out.println(平均寻道长度:+AverageDistance);}/************************循环扫描调度算法*****************************/publicstaticvoidCSCAN(){k=1;intl,r;bubble();//调
本文标题:操作系统-磁盘调度算法-java版
链接地址:https://www.777doc.com/doc-2074616 .html