2.4.2 DL调度器 -核心代码

Deadline 调度器的实现在文件 kernel/sched/deadline.c 中,任务的相关参数、CBS需要使用到的各种状态信息都封装在 sched_dl_entity 中:

/* file: include/linux/sched.h */
struct sched_dl_entity {
    /*
      任务的参数,即前文提到的 runtime, deadline 与 period. 这几个参数通过系统调用
      sched_setattr 进行修改,在运行过程中保持不变。
    */
    u64 dl_runtime;  /* Maximum runtime for each instance   */
    u64 dl_deadline; /* Relative deadline of each instance  */
    u64 dl_period;   /* Separation of two instances (period) */

    u64 dl_bw;      /* dl_runtime / dl_period       */
    u64 dl_density; /* dl_runtime / dl_deadline     */

    /*
      即前文提到的 scheduling deadline 与 remaining runtime, CBS
      用来控制CPU的带宽分配。
    */
    s64 runtime;  /* Remaining runtime for this instance    */
    u64 deadline; /* Absolute deadline for this instance    */

    /* 标识该任务是否是 throttled 状态,如果是的话调度器需要在下一个 replenishment
     * time 时调整 runtime 与 deadline 属性。replenishment 操作通过定时器 dl_timer
     * 完成 */
    unsigned int dl_throttled : 1;
    /* 标识该任务是否在消耗完自己的 runtime 之前主动让出 CPU */
    unsigned int dl_yielded : 1;

    /*
      高精度定时器,例如用来为throttled任务做replenishment操作。
    */
    struct hrtimer dl_timer;
};

此处仅仅保留了前文中讨论到的几个重要字段。EDF算法要求调度器每次找到deadline最近的任务,为了提升效率,dl调度器使用红黑树(Red-black Tree)来组织任务,以任务的deadline作为key值。相关字段定义在运行队列 dl_rq 中:

因此 dl 调度类挑选下一个任务的逻辑是很直观的:

CBS机制的所有逻辑也都在deadline.c中,例如函数 update_dl_entity 用来对唤醒的任务进行校验,即完成上一节CBS算法中的第二步,其主体逻辑如下:

函数 sched_dl_overflow 对整个调度器的带宽是否溢出进行校验,例如创建Deadline任务或者修改其调度参数(runtime, deadline, period)时,系统的准入机制就需要调用该函数进行逻辑判断:

该文件中还包括很多其他逻辑,例如针对 SMP 架构的各种处理,此处不再一一讲解。

Last updated

Was this helpful?