这一版的磁盘调度,作者只分析了磁盘通道号,之后作者会加入对最晚完成时间的分析。
首先理解一下,什么是磁盘调度,磁盘调度的意思是,所有的进程都是在磁盘中得某个同道号中享受资源的,那么就会存在一个问题,我们是按什么顺序来执行这些进程呢,
一种是按照最晚完成时间的前后来安排,这种可以使得任务能够顺序的执行。但是任务完成的时间会大大的增加。
有一种就是按照磁盘的通道号的大小来操作,这样的话,能够更快速的完成任务,但是可能其中有些进程会因为超过最晚完成时间而导致进程的失效。
还有一种就是两种都比较兼顾的算法就是,电梯调度算法,这种算法既考虑到了磁盘通道号,也考虑到了最晚完成时间,这种算法首先是按照最晚完成时间进行排序,排序完了之后,再将最晚完成时间进行划分区间,比如说在时间区间内,有几个进程都可以顺利的完成,那样的话,在这种基础上,就可再对这几个进程进行磁盘通道号进行排序,这样的话又能在规定的时间内完成,又能够保证完成的时间尽量少。所以非常适合实现。
这里作者先做了电梯调度算法的一部分,源代码中会详细讲解。
下面贴源代码
第一个是纯粹是通过机器自动选择操作的方式
import java.util.Comparator; import java.util.PriorityQueue; import java.util.Queue; import java.util.Random; import java.util.Scanner; public class 磁盘调度 { public static void main(String[] args) { Scanner sc=new Scanner(System.in); Random ran=new Random(); System.out.println("输入随机产生的进程数的范围");//初始化 System.out.print("最小是:"); int n=sc.nextInt(); System.out.print("最大是:"); int m=sc.nextInt(); int n1=ran.nextInt(m-n+1)+n; System.out.println("输入磁盘号的范围"); System.out.print("最小是:"); int nn=sc.nextInt(); System.out.print("最大是:"); int mm=sc.nextInt(); Queue<node>queue=new PriorityQueue<node>(compare); node []node1=new node[n1]; for(int i=0;i<n1;i++) { node1[i]=new node(); node1[i].name=i+1; node1[i].number=ran.nextInt(mm-nn+1)+nn; queue.add(node1[i]); } System.out.println("初始化已经完成!!"); int length=queue.size(); double count=ran.nextDouble(); if(count<0.5)//磁盘调度 { length--; System.out.println("进行磁盘调度操作!!"); node node2=queue.poll(); System.out.println(node2.name+"--"+node2.number+"已经执行结束!!"); } else //压入新的进程 { length++; System.out.println("进行压入新的进程操作!!"); node node2=new node(); System.out.println("输入压入的进程的进程号,类型为int类型"); node2.name=sc.nextInt(); System.out.println("输入压入的进程的磁盘通道号,注意范围是"+nn+"----"+mm); node2.number=sc.nextInt(); queue.add(node2); System.out.println("已经压入"); } System.out.println("是否继续,输入Y或者N"); String str=sc.next(); while(!str.equals("Y")&&!str.equals("N")) { System.out.println("你输入的操作不存在,请重新输入!!"); str=sc.next(); } while(str.equals("Y")&&length>0) { count=ran.nextDouble(); if(count<0.5)//进行磁盘调度 { length--; System.out.println("进行磁盘调度操作!!"); node node2=queue.poll(); System.out.println(node2.name+"--"+node2.number+"已经执行结束!!"); } else//压入新的进程 { length++; System.out.println("进行压入新的进程操作!!"); node node2=new node(); System.out.println("输入压入的进程的进程号,类型为int类型"); node2.name=sc.nextInt(); System.out.println("输入压入的进程的磁盘通道号,注意范围是"+nn+"----"+mm); node2.number=sc.nextInt(); queue.add(node2); System.out.println("已经压入"); } System.out.println("是否继续,输入Y或者N"); str=sc.next(); while(!str.equals("Y")&&!str.equals("N")) { System.out.println("你输入的操作不存在,请重新输入!!"); str=sc.next(); } } if(length==0) { System.out.println("进程已经全部执行完毕!!!"); } } static Comparator<node>compare=new Comparator<node>() { @Override public int compare(node o1, node o2) { // TODO Auto-generated method stub return o1.number-o2.number; } }; static class node { int name;//进程名 //int limittime;//最晚完成时间 int number;//磁道通道号 public node() { // TODO Auto-generated constructor stub } } }
第二个是通过人自己选择操作的方式
import java.util.Comparator; import java.util.PriorityQueue; import java.util.Queue; import java.util.Random; import java.util.Scanner; public class 磁盘调度第二版 { public static void main(String[] args) { Scanner sc=new Scanner(System.in); Random ran=new Random(); System.out.println("输入随机产生的进程数的范围");//初始化 System.out.print("最小是:"); int n=sc.nextInt(); System.out.print("最大是:"); int m=sc.nextInt(); int n1=ran.nextInt(m-n+1)+n; System.out.println("输入磁盘号的范围"); System.out.print("最小是:"); int nn=sc.nextInt(); System.out.print("最大是:"); int mm=sc.nextInt(); Queue<node>queue=new PriorityQueue<node>(compare); node []node1=new node[n1]; for(int i=0;i<n1;i++) { node1[i]=new node(); node1[i].name=i+1; node1[i].number=ran.nextInt(mm-nn+1)+nn; queue.add(node1[i]); } System.out.println("初始化已经完成!!"); int length=queue.size(); //double count=ran.nextDouble(); System.out.println("是否继续,输入Y或者N"); String str=sc.next(); while(!str.equals("Y")&&!str.equals("N")) { System.out.println("你输入的操作不存在,请重新输入!!"); str=sc.next(); } if(str.equals("Y"))//磁盘调度 { length--; System.out.println("进行磁盘调度操作!!"); node node2=queue.poll(); System.out.println(node2.name+"--"+node2.number+"已经执行结束!!"); } else //压入新的进程 { length++; System.out.println("进行压入新的进程操作!!"); node node2=new node(); System.out.println("输入压入的进程的进程号,类型为int类型"); node2.name=sc.nextInt(); System.out.println("输入压入的进程的磁盘通道号,注意范围是"+nn+"----"+mm); node2.number=sc.nextInt(); queue.add(node2); System.out.println("已经压入"); } System.out.println("是否继续,输入Y或者N"); str=sc.next(); while(!str.equals("Y")&&!str.equals("N")) { System.out.println("你输入的操作不存在,请重新输入!!"); str=sc.next(); } while(length>0) { if(str.equals("Y"))//进行磁盘调度 { length--; System.out.println("进行磁盘调度操作!!"); node node2=queue.poll(); System.out.println(node2.name+"--"+node2.number+"已经执行结束!!"); } else//压入新的进程 { length++; System.out.println("进行压入新的进程操作!!"); node node2=new node(); System.out.println("输入压入的进程的进程号,类型为int类型"); node2.name=sc.nextInt(); System.out.println("输入压入的进程的磁盘通道号,注意范围是"+nn+"----"+mm); node2.number=sc.nextInt(); queue.add(node2); System.out.println("已经压入"); } System.out.println("是否继续,输入Y或者N"); str=sc.next(); while(!str.equals("Y")&&!str.equals("N")) { System.out.println("你输入的操作不存在,请重新输入!!"); str=sc.next(); } } if(length==0) { System.out.println("进程已经全部执行完毕!!!"); } } static Comparator<node>compare=new Comparator<node>() { @Override public int compare(node o1, node o2) { // TODO Auto-generated method stub return o1.number-o2.number; } }; static class node { int name;//进程名 //int limittime;//最晚完成时间 int number;//磁道通道号 public node() { // TODO Auto-generated constructor stub } } }
还是老样子,作者很菜,如有不足,不吝赐教!!!