操作系统-磁盘调度算法:先来先服务,最短寻道时间优先,scan算法
2013-05-26 13:01
453 查看
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); } }
相关文章推荐
- 操作系统-磁盘调度算法:先来先服务,最短寻道时间优先,scan算法
- 模拟最短寻道时间优先SSTF算法
- [2017/05/18]操作系统调度算法--最短剩余时间优先算法的模拟实现
- 操作系统 磁盘调度算法 先来先服务 最短寻道时间 扫描 循环扫描
- 操作系统中先来先服务、短作业优先、最高相应比优先三个进程数组实现的算法
- [操作系统] - No.3 磁盘调度算法:FCFS算法、SSTF算法、SCAN算法、 C-SCAN算法、 电梯算法等
- 【操作系统 - 1】先来先服务FCFS和短作业优先SJF进程调度算法
- 【操作系统 - 1】先来先服务FCFS和短作业优先SJF进程调度算法
- 假设系统按单值方式运行且采用最短作业优先算法,有J1,J2,J3,J4共4个作业同时到达,则以下哪几种情况下的平均周转时间为10分钟?
- 【操作系统 - 1】先来先服务FCFS和短作业优先SJF进程调度算法
- 【操作系统 - 1】先来先服务FCFS和短作业优先SJF进程调度算法
- 操作系统中和时间的有关的几个概念:吞吐率(流水线完成时间)、平均周转时间和平均带权周转时间、最高响应比优先
- Java模拟操作系统进程调度算法—先来先服务、短作业优先、高响比优先
- 【操作系统 - 1】先来先服务FCFS和短作业优先SJF进程调度算法
- 《操作系统》 先来先服务FCFS和短作业优先SJF进程调度算法相关计算及实验
- 【操作系统 - 1】先来先服务FCFS和短作业优先SJF进程调度算法
- 【操作系统 - 1】先来先服务FCFS和短作业优先SJF进程调度算法
- 操作系统实验之磁盘调度算法模拟(最短寻道时间优先SSTF 和 扫描算法SCAN)
- c# 磁盘调度算法:-最短寻道时间优先
- 【操作系统 - 1】先来先服务FCFS和短作业优先SJF进程调度算法