linux内核如何用权重值来调度进程?

linux内核如何用权重值来调度进程?

我正在阅读“Linux内核开发”,我不明白进程的权重值。在linux内核中,每个进程都有一个nice值,然后将nice值映射到权重。

  • 我认为权重是“处理器时间的比例”。这意味着进程分配的运行时间是:其权重/(所有进程的总权重)*(处理器时间)。如果上式结果为10%,但进程实际运行时间低于10%,则优先。正确的?
  • 我对 cfs 如何检查它感到困惑。 cfs 是否定期检查(例如 1 毫秒)并更新进程的运行时间,将实际运行时间/进程分配的运行时间与所选最小值的比例进行比较并运行它?顺便问一下,你能列出一些使用的功能吗?

答案1

set_load_weight检查linux内核源码中的函数。这里,计算调度实体(任务/任务组)的实际负载。该例程从不同的地方调用(例如 fork,或者当您从用户空间设置新的好值时等)。

if (update_load && p->sched_class == &fair_sched_class) {
    reweight_task(p, prio);
} else {
    load->weight = scale_load(sched_prio_to_weight[prio]);
    load->inv_weight = sched_prio_to_wmult[prio];
}

sched_prio_to_weight包含根据优先级的权重。

保存任务权重信息的结构是struct load_weight。 cfs 使用该结构来获取实体的负载并更新vruntime例程中任务的runtime() update_curr。 cfs 选择下一个要运行的任务pick_next_task。下面是代码片段。

for_each_class(class) {
        p = class->pick_next_task(rq, prev, rf);
        if (p) {
            if (unlikely(p == RETRY_TASK))
                goto again;
            return p;
        }
    }

在这里,它遍历每个调度类并检查要运行的任务。

相关内容