模拟实现磁盘调度算法:最短寻道时间优先(SSTF)和扫描(SCAN)算法。
实验步骤:
理解各调度算法的工作原理
对给出的任意的磁盘请求序列、计算平均寻道长度;要求可定制磁盘请求序列长度、磁头起始位置、磁头移动方向。
测试:假设磁盘访问序列:98,183,37,122,14,124,65,67;读写头起始位置:53,方向:磁道增加的方向。输入此类数据后,程序按照选定的算法,自动给出访问序列,并且算出经过的磁道总数。
最短寻道时间优先(SSTF)算法
package 磁盘调度算法; import java.util.List; import java.util.Scanner; //最短寻道时间优先 public class SSTF{ private int visit[]; private int nearIndex=0; public int[] sstf(int queue[],int start){ int nearNum=9999; visit=new int[queue.length]; for(int i=0;i<queue.length;i++){ for(int j=0;j<queue.length;j++){ if(queue[j]!=-1){ if(Math.abs(nearNum-start)>Math.abs(queue[j]-start)){ nearNum=queue[j]; nearIndex=j; } } } visit[i]=nearNum; queue[nearIndex]=-1; start=nearNum; nearNum=9999; } return visit; } public void print(int visit[],int start){ double sum=0; System.out.print("访问序列:"); for(int i=0;i<visit.length;i++){ System.out.print(visit[i]+" "); sum=Math.abs(visit[i]-start)+sum; start=visit[i]; } System.out.println(); System.out.println("经过的磁道总数:"+sum); System.out.println("平均寻道长度:"+sum/visit.length); } public static void main(String[] args){ Scanner sc=new Scanner(System.in); System.out.println("请输入磁盘请求序列长度:"); int a=sc.nextInt(); System.out.println("请输入磁盘请求访问序列:"); int[] queue=new int[a]; for(int i=0;i<a;i++){ queue[i]=sc.nextInt(); } SSTF sstf=new SSTF(); System.out.println("请输入读写头起始位置:"); int start=sc.nextInt(); sstf.print(sstf.sstf(queue, start),start); } }
实验结果:
扫描(SCAN)算法:
package 磁盘调度算法2; import java.util.List; import java.util.Scanner; public class SCAN{ private int visit[]; private int nearIndex=0; public int[] scan(int queue[],int start,int direction){ int nearNum=9999; int index=0; visit=new int[queue.length]; for(int i=0;i<queue.length;i++){ index=-1; for(int j=0;j<queue.length;j++){ if(queue[j]!=-1){ if((direction==1)&&(queue[j]>start)&&(Math.abs(nearNum-start)>Math.abs(queue[j]-start))){ nearNum=queue[j]; nearIndex=j; index=0; } else if((direction==0)&&(queue[j]<start)&&(Math.abs(nearNum-start)>Math.abs(queue[j]-start))){ nearNum=queue[j]; nearIndex=j; index=0; } } } if((direction==1)&&(index==-1)){ direction=0; i=i-1; } else if((direction==0)&&(index==-1)){ direction=1; i=i-1; } if(index==0){ visit[i]=nearNum; queue[nearIndex]=-1; start=nearNum; nearNum=9999; } } return visit; } public void print(int visit[],int start){ double sum=0; System.out.print("访问序列:"); for(int i=0;i<visit.length;i++){ System.out.print(visit[i]+" "); sum=Math.abs(visit[i]-start)+sum; start=visit[i]; } System.out.println(); System.out.println("经过的磁道总数:"+sum); System.out.println("平均寻道长度:"+sum/visit.length); } public static void main(String[] args){ Scanner sc=new Scanner(System.in); System.out.println("请输入磁盘请求序列长度:"); int a=sc.nextInt(); System.out.println("请输入磁盘请求访问序列:"); int[] queue=new int[a]; for(int i=0;i<a;i++){ queue[i]=sc.nextInt(); } SCAN scan=new SCAN(); System.out.println("请输入读写头起始位置:"); int start=sc.nextInt(); System.out.println("磁道增加的方向:(0向磁道号减少的方向移动,1向磁道号增加的方向移动)"); int direction=sc.nextInt(); scan.print(scan.scan(queue, start,direction),start); } }
实验结果:
扫描二维码关注公众号,回复:
1557514 查看本文章