📜  截止单调CPU调度(1)

📅  最后修改于: 2023-12-03 15:09:58.809000             🧑  作者: Mango

截止单调CPU调度

简介

截止单调CPU调度算法是一种实时任务调度算法,用于处理单调负载的实时任务。它可以保证最小化任务响应时间,同时避免过度抢占和任务饥饿。

单调性是指任务的期限严格递增,即 $D_i < D_j$,其中 $i<j$。这意味着任务集合是“单调”的,因为调度它们的顺序不应该影响它们的执行时间。单调调度可以通过静态分配保证任务执行完成,从而保证实时任务的响应性能。

算法流程

截止单调CPU调度算法的流程如下:

  1. 将任务按照其期限 $D_i$ 从小到大排序
  2. 将第一个任务 $T_1$ 分配到CPU,并记录其结束时间 $ET_1$
  3. 遍历剩余的任务 $T_i$,按照如下规则分配CPU:
    • 如果 $ET_{i-1} < S_i$,即前一个任务结束时间小于当前任务的开始时间,则将任务 $T_i$ 分配到CPU,并记录其结束时间 $ET_i$
    • 如果 $ET_{i-1} \ge S_i$,即前一个任务结束时间大于或等于当前任务的开始时间,则将前一个任务抢占,并记录其结束时间 $ET_{i-1}$
  4. 如果所有任务都已经完成,则算法结束。否则,返回步骤3处理剩余的任务。
代码实现
def EDF(tasks):
    """截止单调CPU调度算法"""
    # 按照任务期限从小到大排序
    tasks = sorted(tasks, key=lambda x: x.deadline)

    # 分配第一个任务
    ET = tasks[0].start + tasks[0].exec_time

    # 分配剩余的任务
    for task in tasks[1:]:
        if ET < task.start:
            # 当前任务在前一个任务完成后开始
            ET = task.start + task.exec_time
        else:
            # 抢占前一个任务
            task.preemption_time = ET - task.start
            ET += task.exec_time

    return tasks
参考文献