电梯调度算法---SCAN算法
请珍惜小编劳动成果,该文章为小编原创,转载请注明出处。
扫描(SCAN)调度算法:总是从磁臂当前位置开始,沿磁臂的移动方向去选择离当前磁臂最近的那个柱面的访问者。如果沿磁臂的方向无请求访问时,就改变磁臂的移动方向。采用这种调度算法,需要为访问者设置两个队列,根据磁头的移动方向,能访问到的访问者由近及远排队,背离磁头移动方向的访问者也由近及远排为另一队。先按磁头移动方向队列调度访问者访问磁盘,当该方向没有访问者时,再改变方向,选择另一个访问者队列访问磁盘。
java代码实现:
import java.util.Scanner; public class SCAN { int visitAdd[]; int visitSub[]; int index=0; //存放下标,已排序序列中找到比它大的最小值的下标 public void scan(int data[],int begin,int direction){ int temp=0; //从小到大排序 for(int i=0;i<data.length;i++){ for(int j=i;j<data.length;j++){ if(data[i]>data[j]){ temp=data[i]; data[i]=data[j]; data[j]=temp; } } } for(int i=0;i<data.length;i++){ if(data[i]>begin){ //在已排序序列中找到比它大的最小值的下标 index=i; break; } } //比起始位置小的 visitSub=new int[index]; //比他小的共有index个 for(int i=0;i<index;i++){ visitSub[i]=data[i]; } //比起始位置大的 visitAdd=new int[data.length-index]; //比他大的共data.length-index个 for(int i=0;i<visitAdd.length;i++){ visitAdd[i]=data[i+index]; } //计算平均时间 int lengthAdd=0; int lengthSub=0; int length=0; for(int i=0;i<visitAdd.length-1;i++){ lengthAdd+=Math.abs(visitAdd[i]-visitAdd[i+1]); } for(int i=visitSub.length-1;i>0;i--){ lengthSub+=Math.abs(visitSub[i]-visitSub[i-1]); } length=lengthAdd+lengthSub+Math.abs(begin-visitAdd[0])+Math.abs(begin-visitSub[visitSub.length-1]); if(direction==0){ //找小的 for(int i=visitSub.length-1;i>=0;i--){ System.out.print(visitSub[i]+" "); } //回转 for(int i=0;i<visitAdd.length;i++){ System.out.print(visitAdd[i]+" "); } length+=Math.abs(visitSub[0]-begin); }else{ //找大的 for(int i=0;i<visitAdd.length;i++){ System.out.print(visitAdd[i]+" "); } //回转 for(int i=visitSub.length-1;i>=0;i--){ System.out.print(visitSub[i]+" "); } length+=Math.abs(visitAdd[visitAdd.length-1]-begin); } System.out.println("平均寻道长度为"+length/data.length); } public static void main(String[] args) { SCAN scan=new SCAN(); Scanner scanner=new Scanner(System.in); System.out.println("请输入数据个数"); int num=scanner.nextInt(); System.out.println("请一次输入数据,空格隔开"); int data[]=new int[num]; for(int i=0;i<num;i++){ data[i]=scanner.nextInt(); } System.out.println("请输入读写头起始位置"); int begin=scanner.nextInt(); System.out.println("请输入磁头移动方向 0:磁道减少方向 1:磁道增加方向 "); int direction=scanner.nextInt(); scan.scan(data, begin, direction); } //98 183 37 122 14 124 65 67 }
测试:
版权声明:本文为博主原创文章,未经博主允许不得转载。