【发布时间】:2015-01-04 22:10:17
【问题描述】:
我想编写一个调度程序(在 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 毫秒,那么其余任务将获得更多时间。
我将如何实现这个?
【问题讨论】:
-
我不明白你的问题,首先你说你的语言是java,不重要,最后你想知道如何实现? java重要不重要?
-
@AliAmiri:我已经用上面的代码描述了这个问题。我在问如何解决这些问题。但没关系,我已经找到了解决方案。将其发布为下面的答案。
标签: algorithm scheduling