简单模拟高响应优先调度算法

来源:互联网 发布:手机淘宝怎么投诉买家 编辑:程序博客网 时间:2024/05/17 20:32

高响应比优先调度算法

  在批处理系统中,用作作业调度的短作业优先算法是一个比较好的算法。其主要缺点是作业的运行得不到保证。如果我们能为每个作业引入前面所述的动态优先权机制,并使以速率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要很小才行。

0 0