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

来源:互联网 发布:samsung打印服务软件 编辑:程序博客网 时间:2024/05/21 22:57

1.先来先服务

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.最短寻道时间优先

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算法

public class SCAN {/** * 磁盘调度:scan算法 */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("------磁盘调度:scan算法模拟---------");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);}}


 

 

原创粉丝点击