灯火互联
管理员
管理员
  • 注册日期2011-07-27
  • 发帖数41778
  • QQ
  • 火币41290枚
  • 粉丝1086
  • 关注100
  • 终身成就奖
  • 最爱沙发
  • 忠实会员
  • 灌水天才奖
  • 贴图大师奖
  • 原创先锋奖
  • 特殊贡献奖
  • 宣传大使奖
  • 优秀斑竹奖
  • 社区明星
阅读:3719回复:0

操作系统-磁盘调度算法:先来先服务,最短寻道时间优先,scan算法

楼主#
更多 发布于:2012-09-08 09:47

1.先来先服务
[java]
public class FCFS {

    /**
     * 磁盘调度:先来先服务
     */
    private static int startPosition = 100 ;//磁头开始位置  
    private static int totalMoving = 0;
    private static List<Integer> visitList = new ArrayList<Integer>();//访问磁道列表  
    public static void main(String[] args) {
        System.out.println("------磁盘调度:先来先服务算法模拟---------");
        input();
        running();
        display();  www.atcpu.com
    }
    //接收用户输入列表  
    public static void input(){
        System.out.print("请输入磁道访问列表,以空格分开:");
        Scanner sc = new Scanner(System.in);
        String input = sc.nextLine();
        String[] inputList = input.split("\\s");
        try{
            for(String in : inputList){
                visitList.add(Integer.valueOf(in));
            }
        }
        catch(Exception e){
            System.out.println("输入的必须是数字,请重新开始!!!");
            System.exit(1);
        }
    }
    
    //运行  
    public static void running(){
        Iterator<Integer> it = visitList.listIterator();
        int thisPosition = 0;
        while(it.hasNext()){
            thisPosition = it.next();
            totalMoving += Math.abs(startPosition-thisPosition);
            startPosition = thisPosition;
            System.out.println("当前访问磁道号:"+thisPosition);
        }
    }
    public static void display(){
        System.out.println("平均寻道时间是:"+(double)totalMoving/visitList.size());
    }

}
public class FCFS {
/**
  * 磁盘调度:先来先服务
  */
private static int startPosition = 100 ;//磁头开始位置
private static int totalMoving = 0;
private static List<Integer> visitList = new ArrayList<Integer>();//访问磁道列表
public static void main(String[] args) {
  System.out.println("------磁盘调度:先来先服务算法模拟---------");
  input();
  running();
  display();
}
//接收用户输入列表
public static void input(){
  System.out.print("请输入磁道访问列表,以空格分开:");
  Scanner sc = new Scanner(System.in);
  String input = sc.nextLine();
  String[] inputList = input.split("\\s");
  try{
   for(String in : inputList){
    visitList.add(Integer.valueOf(in));
   }
  }
  catch(Exception e){
   System.out.println("输入的必须是数字,请重新开始!!!");
   System.exit(1);
  }
}

//运行
public static void running(){
  Iterator<Integer> it = visitList.listIterator();
  int thisPosition = 0;
  while(it.hasNext()){
   thisPosition = it.next();
   totalMoving += Math.abs(startPosition-thisPosition);
   startPosition = thisPosition;
   System.out.println("当前访问磁道号:"+thisPosition);
  }
}
public static void display(){
  System.out.println("平均寻道时间是:"+(double)totalMoving/visitList.size());
}
}


2.最短寻道时间优先
[java]
public class SSTF {

    /**
     *磁盘调度:最短寻道时间优先
     */
    private static int startPosition = 100 ;//磁头开始位置  
    private static int totalMoving = 0;
    private static List<Integer> visitList = new LinkedList<Integer>();//访问磁道列表  
    private static int size;
    public static void main(String[] args) {
        System.out.println("------磁盘调度:最短寻道时间优先算法模拟---------");
        input();
        running();
        display();

    }
    
    //接收用户输入列表  
    public static void input(){
        System.out.print("请输入磁道访问列表,以空格分开:");
        Scanner sc = new Scanner(System.in);
        String input = sc.nextLine();
        String[] inputList = input.split("\\s");
        try{
            for(String in : inputList){
                visitList.add(Integer.valueOf(in));
            }
            size = visitList.size();
        }
        catch(Exception e){
            System.out.println("输入的必须是数字,请重新开始!!!");
            System.exit(1);
        }
    }
    
    //运行  
    public static void running(){
        int visitNumber = 0;
        for(int i=0,size = visitList.size();i<size;i++){
            visitNumber = searchMinimum(startPosition);
            System.out.println("当前访问磁道:"+visitNumber);
        }
    }
    //寻找与当前磁头最近的磁道号  
    public static int searchMinimum(int startPosition){
        int min = Integer.MAX_VALUE,index = 0,i = 0,thisPosition = 0,computering=0;
        Iterator<Integer> it = visitList.iterator();
        while(it.hasNext()){
            int in = it.next();
            computering = Math.abs(startPosition-in);//判断是否小于最小值  
            if(min>computering){
                index = i;
                min = computering;
            }
            i++;
        }
        thisPosition = visitList.remove(index);//设置当前磁头,访问后移除  
        totalMoving += Math.abs(startPosition-thisPosition);
        
        SSTF.startPosition = thisPosition;
        
        return thisPosition;
    }
    public static void display(){
        System.out.println("平均寻道时间是:"+(double)totalMoving/size);
    }

}
public class SSTF {
/**
  *磁盘调度:最短寻道时间优先
  */
private static int startPosition = 100 ;//磁头开始位置
private static int totalMoving = 0;
private static List<Integer> visitList = new LinkedList<Integer>();//访问磁道列表
private static int size;
public static void main(String[] args) {
  System.out.println("------磁盘调度:最短寻道时间优先算法模拟---------");
  input();
  running();
  display();
}

//接收用户输入列表
public static void input(){
  System.out.print("请输入磁道访问列表,以空格分开:");
  Scanner sc = new Scanner(System.in);
  String input = sc.nextLine();
  String[] inputList = input.split("\\s");
  try{
   for(String in : inputList){
    visitList.add(Integer.valueOf(in));
   }
   size = visitList.size();
  }
  catch(Exception e){
   System.out.println("输入的必须是数字,请重新开始!!!");
   System.exit(1);
  }
}

//运行
public static void running(){
  int visitNumber = 0;
  for(int i=0,size = visitList.size();i<size;i++){
   visitNumber = searchMinimum(startPosition);
   System.out.println("当前访问磁道:"+visitNumber);
  }
}
//寻找与当前磁头最近的磁道号
public static int searchMinimum(int startPosition){
  int min = Integer.MAX_VALUE,index = 0,i = 0,thisPosition = 0,computering=0;
  Iterator<Integer> it = visitList.iterator();
  while(it.hasNext()){
   int in = it.next();
   computering = Math.abs(startPosition-in);//判断是否小于最小值
   if(min>computering){
    index = i;
    min = computering;
   }
   i++;
  }
  thisPosition = visitList.remove(index);//设置当前磁头,访问后移除
  totalMoving += Math.abs(startPosition-thisPosition);
  
  SSTF.startPosition = thisPosition;
  
  return thisPosition;
}
public static void display(){
  System.out.println("平均寻道时间是:"+(double)totalMoving/size);
}
}


3.SCAN算法
[java]
public class SCAN {

    /**
     * 磁盘调度can算法
     */
    private static int startPosition = 100 ;//磁头开始位置  
    private static int totalMoving = 0;
    private static List<Integer> visitList = new ArrayList<Integer>();//访问磁道列表  
    private static int moveDirection = 0;//0:向外移动,1:向里移动  
    private static int size;
    public static void main(String[] args) {
        System.out.println("------磁盘调度can算法模拟---------");
        input();
        running();
        display();
    }
    
    //接收用户输入列表  
    public static void input(){
        System.out.print("请输入磁道访问列表,以空格分开:");
        Scanner sc = new Scanner(System.in);
        String input = sc.nextLine();
        String[] inputList = input.split("\\s");
        try{
            for(String in : inputList){
                visitList.add(Integer.valueOf(in));
            }
            size = visitList.size();
        }
        catch(Exception e){
            System.out.println("输入的必须是数字,请重新开始!!!");
            System.exit(1);
        }
    }
    
    //运行  
    public static void running(){
        int visitNumber = 0;
        for(int i=0,size = visitList.size();i<size;i++){
            visitNumber = searchMinimum(startPosition);
            System.out.println("当前访问磁道:"+visitNumber);
        }
    }
    //寻找与当前磁头最近并且和磁头的移动方向一致的磁道号  
    public static int searchMinimum(int startPosition){
        int min = Integer.MAX_VALUE,index = -1,i = 0,thisPosition = 0,computing=0;
        Iterator<Integer> it = visitList.iterator();
        while(it.hasNext()){
            int in = it.next();
            computing = Math.abs(startPosition-in);
            if((min>computing);;(moveDirection==0);;(in>startPosition)){//向外移动  
                index = i;
                min = computing;
            }
            else if((min>computing);;(moveDirection==1);;(in<startPosition)){//向里移动  
                index = i;
                min = computing;
            }
            if((index == -1);;(moveDirection == 0)){//若移动到尽头,则返回扫描  
                moveDirection = 1;
            }
            else if((index == -1);;(moveDirection == 1)){
                moveDirection = 0;
            }
            i++;
        }
        thisPosition = visitList.remove(index);//设置当前磁头,访问后移除  
        totalMoving += Math.abs(startPosition-thisPosition);
        
        SCAN.startPosition = thisPosition;
        
        return thisPosition;
    }
    public static void display(){
        System.out.println("平均寻道时间是:"+(double)totalMoving/size);
    }

}
public class SCAN {
/**
  * 磁盘调度can算法
  */
private static int startPosition = 100 ;//磁头开始位置
private static int totalMoving = 0;
private static List<Integer> visitList = new ArrayList<Integer>();//访问磁道列表
private static int moveDirection = 0;//0:向外移动,1:向里移动
private static int size;
public static void main(String[] args) {
  System.out.println("------磁盘调度can算法模拟---------");
  input();
  running();
  display();
}

//接收用户输入列表
public static void input(){
  System.out.print("请输入磁道访问列表,以空格分开:");
  Scanner sc = new Scanner(System.in);
  String input = sc.nextLine();
  String[] inputList = input.split("\\s");
  try{
   for(String in : inputList){
    visitList.add(Integer.valueOf(in));
   }
   size = visitList.size();
  }
  catch(Exception e){
   System.out.println("输入的必须是数字,请重新开始!!!");
   System.exit(1);
  }
}

//运行
public static void running(){
  int visitNumber = 0;
  for(int i=0,size = visitList.size();i<size;i++){
   visitNumber = searchMinimum(startPosition);
   System.out.println("当前访问磁道:"+visitNumber);
  }
}
//寻找与当前磁头最近并且和磁头的移动方向一致的磁道号
public static int searchMinimum(int startPosition){
  int min = Integer.MAX_VALUE,index = -1,i = 0,thisPosition = 0,computing=0;
  Iterator<Integer> it = visitList.iterator();
  while(it.hasNext()){
   int in = it.next();
   computing = Math.abs(startPosition-in);
   if((min>computing);;(moveDirection==0);;(in>startPosition)){//向外移动
    index = i;
    min = computing;
   }
   else if((min>computing);;(moveDirection==1);;(in<startPosition)){//向里移动
    index = i;
    min = computing;
   }
   if((index == -1);;(moveDirection == 0)){//若移动到尽头,则返回扫描
    moveDirection = 1;
   }
   else if((index == -1);;(moveDirection == 1)){
    moveDirection = 0;
   }
   i++;
  }
  thisPosition = visitList.remove(index);//设置当前磁头,访问后移除
  totalMoving += Math.abs(startPosition-thisPosition);
  
  SCAN.startPosition = thisPosition;
  
  return thisPosition;
}
public static void display(){
  System.out.println("平均寻道时间是:"+(double)totalMoving/size);
}
}

作者:mzlqh

喜欢0 评分0
游客

返回顶部