我正在阅读“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;
}
}
在这里,它遍历每个调度类并检查要运行的任务。