高响应比优先调度算法
在批处理系统中,用作作业调度的短作业优先算法是一个比较好的算法。其主要缺点是作业的运行得不到保证。如果我们能为每个作业引入前面所述的动态优先权机制,并使以速率a增加,则长作业在等待一定的时间后,必须有机会分配到处理机。该优先权的变化可描述为:
优先权=(等待时间+要求服务时间)/要求服务时间
由于等待时间加上要求服务时间,就是系统对该作业的响应时间,故该优先权又相当于响应比Rp=等待时间加要求服务时间/要求服务时间=响应时间/要求服务时间
由上式可以看出:
(1)如果作业的等待时间相同,则要求服务的时间愈短,其优先权愈高,因而该算法有利于短作业;
(2)当要求服务的时间相同时,作业的优先权决定于其等待时间,因而实现了先来先服务;
(3)对于长作业,当其等待时间足够长时,其优先权便可升到很高,从而也可获得处理机
public class Task {
public int start;
public int length;
public Task(int start, int length) {
super();
this.start = start;
this.length = length;
}
public String toString(){
return start+" "+length;
}
}
public class HRRN {
double P=0.0001;
ArrayList<Task> array=new ArrayList<Task>();
public Task find(int start,ArrayList<Task> array){
Task returntask =null;
double maxparameter =0;
for(Task task:array){
if(task.start<=start){
double temp=(start-task.start)+P/task.length+1;
if(temp>maxparameter){
maxparameter=temp;
returntask=task;
}
}
}
array.remove(returntask);
return returntask;
}
public void createTask(){
Scanner sc = new Scanner (new BufferedInputStream(System.in));
int m=sc.nextInt();
for(int i=0;i<m;i++ ){
Task task=new Task(sc.nextInt(),sc.nextInt());
array.add(task);
}
}
public void Print(){
int start=1;
while(array.size()!=0){
Task task=find(start,array);
System.out.println(task);
start=start+task.length;
}
}
public static void main(String [] args){
HRRN hrrn=new HRRN();
hrrn.createTask();
hrrn.Print();
}
}
在这里为了使:在开始的时候:task1(1,4),task2(1,3),task3(1,5)使得在调度时,使task2先调度,所以,在计算动态优先权时,添加了一个参数p使得,在如果作业的等待时间都为0的时候,服务时间最短的先执行;所以这个P要很小才行。