zoukankan      html  css  js  c++  java
  • 电梯调度算法---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
    }
    


    测试:



    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    965. 单值二叉树
    面试题 04.09. 二叉搜索树序列
    99. 恢复二叉搜索树
    98. 验证二叉搜索树
    centos6版本下的Python2.6升级到2.7
    操作MySQL-数据库的安装及Pycharm模块的导入
    操作微信-itchat库的安装
    2018中科大hackergame
    png图片IDAT块异常
    2018网鼎杯misc
  • 原文地址:https://www.cnblogs.com/dingxiaoyue/p/4931789.html
Copyright © 2011-2022 走看看