优先级计算

内核为每个线程维护一个优先级值(有时称为调度优先级)。 优先级值 是一个正整数且与关联线程的重要性的变化方向相反。 也就是说,较小的优先级值表示一个相对重要的线程。 当调度程序寻找线程进行分派时,它选择具有较小优先级值的可分派线程。

计算优先级值的公式是:
priority value = base priority + nice penalty + (CPU penalty based on recent CPU usage)

每当发生计时器中断(每 10 毫秒)时,如果给定线程仍在 CPU 控制下,那么该线程的最近 CPU 使用情况值都将递增 1。 最近的 CPU 使用率值在 ps 命令输出中显示为 C 列。 最近 CPU 使用情况的最大值为 120。

缺省算法通过将最近的 CPU 使用率除以 2 来计算 CPU 损失。 因此, CPU-点对最近 CPU-使用率为 0.5。 这个比值由一个叫做 R(缺省为 16)的值控制。 公式如下:
CPU_penalty = C * R/32
每秒一次,缺省算法会将每个线程的最近 CPU 使用率值除以 2。 因此,最近 CPU 使用率衰减因子为 0.5。 这个比值由一个叫做 D(缺省为 16)的值控制。 公式如下:
C = C * D/32

计算优先级值的算法使用进程的 nice 值来确定进程中各线程的优先级。 随着 CPU 的时间单位的增加,nice 对优先级的影响减小。 使用 schedo -r -d 可以通过为 R 和 D 设置新值来提供对优先级计算的额外控制。 请参阅 schedo 命令 以获取更多信息。

以下列等式开始:
p_nice = base priority + nice value
现在使用下列公式:
If p_nice > 60,
   then x_nice = (p_nice * 2) - 60,
   else x_nice = p_nice.
如果 nice 值大于 20,它的影响是当它小于等于 20 时的两倍。 新的优先级计算(忽略整型截断)如下:
priority value = x_nice + [(x_nice + 4)/64 * C*(R/32)]