






















在 Linux 内核调度器中,sched_prio_to_weight 是一个非常关键的数组,用于把「静态优先级(nice 值)」映射为调度权重(weight)。
调度器(CFS:Completely Fair Scheduler)不是直接比较 nice 值,而是通过权重控制各任务获得的 CPU 时间比例。
sched_prio_to_weight 的定义位置代码位置(以常见版本为例):
// kernel/sched/core.c 或 kernel/sched/fair.c
const int sched_prio_to_weight[40] = {
/* -20 */ 88761, 71755, 56483, 46273, 36291,
/* -15 */ 29154, 23254, 18705, 14949, 11916,
/* -10 */ 9548, 7620, 6100, 4904, 3906,
/* -5 */ 3121, 2501, 1991, 1586, 1277,
/* 0 */ 1024, 820, 655, 526, 423,
/* 5 */ 335, 272, 215, 172, 137,
/* 10 */ 110, 87, 70, 56, 45,
/* 15 */ 36, 29, 23, 18, 15,
};
其中索引为 prio - MAX_RT_PRIO,对应 nice 值范围 [-20, +19]。
Linux 的 nice 值范围是 -20 ~ +19:
调度器通过以下公式近似计算各任务的运行时间份额:

任务的虚拟运行时间增量:

这意味着:
每相邻两个 nice 值之间的 weight 比例大约为 1.25 倍(也就是每增加 1 个 nice,权重乘以 0.8 左右)。
换句话说:

即:
这样可以保证:
虽然内核中使用表格查表,但有一个经验公式近似表达:

举例:
| nice | weight(近似) | 实际表中值 |
|---|---|---|
非常接近。
假设两个任务:
则 CPU 时间分配比:

即 A 得到约 75%,B 得到约 25% CPU 时间。
除了 sched_prio_to_weight 外,还有:
const u32 sched_prio_to_wmult[40];
它存放的是 2^32 / weight 的结果,用于加速计算(避免除法)。
| Nice | 权重 (Weight) | 相对比 (相对 nice=0) | CPU 时间占比 |
|---|---|---|---|
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。