我想写一个调度程序(用Java,这对我的问题并不重要)。每个任务都可以有一个优先级值(从 0.1 到 1.0 的浮点数)。该优先级值越高,任务应接收的处理时间就越长。调度程序在永久运行的循环中调用,每次迭代都有最长的处理时间(例如 10 毫秒)。
在一本书中,我发现了这个调度算法(伪代码):
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(这是错误的)。
此外,计划程序应识别任务所花费的时间是长于还是短于其接收的最长时间。例如,如果第一个任务收到的最大时间为 5 毫秒,但只花了 2 毫秒,则其余任务将获得更多时间。
我将如何实现这一点?
好的,我找到了解决方案。对于记录:上面的代码片段有效,但前提是您在 for
循环的每次迭代中更新totalPriority
值。实际上,您需要在调用task.process(availableTime)
后从totalPriority
中减去任务的优先级。这样,在每次循环迭代中始终正确计算availableTime
。