【问题标题】:Proper Timing in Priority Scheduler优先调度程序中的正确时间
【发布时间】: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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2016-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多