介绍
我想实现一个动态多时间线队列。这里的上下文是一般的调度。
什么是时间线队列?
这仍然很简单:它是一个任务时间线,其中每个事件都有其开始和结束时间。任务被分组为作业。这组任务需要保持其顺序,但可以作为一个整体及时移动。例如它可以表示为:
--t1-- ---t2.1-----------t2.2-------
' ' ' ' '
20 30 40 70 120
我会将其实现为带有一些额外约束的堆队列。Pythonsched
模块在这个方向上有一些基本的方法。
定义多时间线队列
一个队列代表一个资源,一个任务需要一个资源。图形示例:
R1 --t1.1----- --t2.2----- -----t1.3--
/ \ /
R2 --t2.1-- ------t1.2-----
解释“动态”
当一项任务可以使用多种资源中的一种时,它变得很有趣。另一个限制是,可以在同一资源上运行的连续任务必须使用同一资源。
示例:如果(从上面)任务t1.3
可以在R1
or上运行R2
,则队列应如下所示:
R1 --t1.1----- --t2.2-----
/ \
R2 --t2.1-- ------t1.2----------t1.3--
功能(按优先顺序)
- FirstFreeSlot(duration, start)
start
:从有空闲时间的地方开始查找第一个空闲时隙duration
(详细说明见文末)。 - 通过考虑约束(主要是:任务的正确顺序、同一资源上的连续任务)和使用
FirstFreeSlot
. - 在特定时间放置工作并向后移动尾巴
- 删除作业
- 重新计算:删除后,测试是否可以更早地执行某些任务。
关键问题
关键是:我如何表示这些信息以有效地提供功能?实施取决于我;-)
更新:要考虑的另一点:典型的区间结构关注“X点是什么?” 但在这种情况下enqueue
,因此问题是“持续时间 D 的第一个空槽在哪里?” 重要得多。所以这个方向的段/区间树或其他东西可能不是正确的选择。
进一步用空闲时隙详细说明这一点:由于我们有多个资源和分组任务的限制,某些资源上可以有空闲时隙。简单示例:t1.1
在 R1 上运行 40,然后t1.2
在 R2 上运行。所以[0, 40]
R2 上有一个空白区间,可以由下一个作业填充。
更新 2 :在另一个 SO question 中有一个有趣的建议。如果有人可以将它移植到我的问题并表明它适用于这种情况(特别是针对多种资源进行详细说明),那么这可能是一个有效的答案。