【问题标题】:What's the best Task scheduling algorithm for some given tasks?对于某些给定任务,最好的任务调度算法是什么?
【发布时间】:2012-12-22 16:58:10
【问题描述】:

我们有不同长度的任务列表多个cpu核心和上下文切换时间。 我们希望在内核之间找到最佳的任务调度,以最大限度地提高处理器利用率。 我们怎么能找到这个? 如果我们从列表中选择最大的可用任务并将它们一一分配给当前准备好的核心,这不是最好的,还是您认为我们必须尝试所有命令才能找出哪个是最好的?

我必须补充一点,所有核心都在时间单元 0 准备就绪,并且任务应该同时工作。

【问题讨论】:

  • 这听起来很像an NP-complete problem
  • 您是在暗示所有任务都需要同时处理吗?因为如果不是,我看不出优化会如何影响结果(只要处理器可用,只需将任何任务分配给任何空闲处理器)。
  • @svick +1 解释
  • @rambocoder 假设您有 2 个 CPU,1 个任务需要 10 秒,2 个任务,每个任务需要 5 秒。如果您正确安排它们,您将在 10 秒内完成。但是,如果您不正确地安排它们,则可能需要 15 秒。我认为这足以找出比“将任何任务分配给任何空闲处理器”更好的算法。

标签: algorithm scheduling


【解决方案1】:

这里的想法是没有灵丹妙药,您必须考虑正在执行的任务类型,并尝试尽可能好地安排它们。

  • 受 CPU 限制的任务不使用太多通信 (I/O),因此需要持续执行,并且仅在必要时才中断 - 根据所使用的策略;

  • I/O 密集型任务在执行过程中可能会不断被搁置一旁,让其他进程继续工作,因为它会在很多时段处于sleeping,等待数据被检索到主内存;

  • 交互任务必须连续执行,但不需要不中断执行,因为它会产生中断,等待用户输入,但需要有高优先级,以免让用户注意到执行延迟。

考虑到这一点以及上下文切换成本,您必须评估您拥有的任务类型,从而为您的调度程序选择一个或多个策略。

编辑

我认为这是一个简单的概念性问题。考虑到您必须实施解决方案,您必须分析需求。

由于你有任务的长度和上下文切换时间,并且你必须保持核心繁忙,这成为一个优化问题,你必须在到达结束时保持最少数量的核心空闲进程,但您需要保持最少的上下文切换次数,这样您的整体执行时间不会增长太多。

正如 svick 所指出的,这听起来像是一个分区问题,它是 NP 完全的,您需要将一个数字序列划分为给定数量的列表,以便每个列表的总和等于每个其他。

在您的问题中,您可以放松目标,这样您就不再需要所有内核执行相同的时间,但您希望任意两个内核执行时间之间的差异尽可能小.

在 svick 提供的参考资料中,您可以看到一种动态编程方法,您可以将其映射到您的问题上。

【讨论】:

  • 感谢您的回复。不幸的是,我们没有被告知要执行的任务类型。我们唯一知道的是某个时间单位内每个任务的长度。也许我们必须将它们视为 CPU 密集型任务。你觉得我能怎么解决这个问题?我应该在java中实现这个。
  • @mahdisaeedi 我添加了一个编辑,但我没有解决您问题的算法。
猜你喜欢
  • 2012-06-12
  • 1970-01-01
  • 2020-09-18
  • 2014-09-27
  • 1970-01-01
  • 2020-01-09
  • 1970-01-01
  • 2014-01-04
  • 1970-01-01
相关资源
最近更新 更多