请珍惜小编劳动成果,该文章为小编原创。转载请注明出处。


扫描(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
}


測试:

电梯调度算法---SCAN算法_i++