我想编写一个调度程序(用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毫秒,那么剩余的任务将获得更多的时间。
我该如何实现?
答案 0 :(得分:0)
好的,我找到了解决方案。对于记录:上面的代码片段有效,但前提是您在totalPriority
循环的每次迭代中更新for
值。实际上,您需要在调用totalPriority
后从task.process(availableTime)
中减去任务的优先级。这样,availableTime
总是在每次循环迭代中正确计算。