优先级调度程序中的正确计时

时间:2015-01-04 01:00:17

标签: algorithm scheduling

我想编写一个调度程序(用Java编写,这对我的问题并不重要)。每个任务都可以有一个优先级值(浮点数从0.1到1.0)。优先级值越高,任务应该接收的处理时间越长。调度程序在循环中调用,循环运行,每次迭代都有最大处理时间(例如10 ms)。

在一本书中,我发现了这种调度算法(伪代码):

update(timeToRun):
    # totalPrio has been set to the sum of all task priorities
    lastTime = time()
    for each task in tasks:
        currentTime = time()
        timeToRun -= currentTime - lastTime
        availableTime = timeToRun * task.prio / totalPrio
        task.process(availableTime)
        lastTime = currentTime

所以,让我说我有两个任务,每个任务的优先级为0.5,因此totalPrio设置为1.0,两个任务都应该获得相同的处理时间。 update()函数的调用值为timeToRun 10。

如果第一个任务在5毫秒后确实停止了,那么第二个任务也应该收到5毫秒availableTime。但是,使用上面的算法并不起作用:timeToRun在第二次迭代中将为5,因此在第二次迭代中availableTime将被设置为2.5(这显然是错误的)。 / p>

此外,调度程序应识别任务是否比其收到的最长时间更长或更短。例如,如果第一个任务收到的​​最长时间为5毫秒,但只花了2毫秒,那么剩余的任务将获得更多的时间。

我该如何实现?

1 个答案:

答案 0 :(得分:0)

好的,我找到了解决方案。对于记录:上面的代码片段有效,但前提是您在totalPriority循环的每次迭代中更新for值。实际上,您需要在调用totalPriority后从task.process(availableTime)中减去任务的优先级。这样,availableTime总是在每次循环迭代中正确计算。