在 Linux 实时进程优先级范围 1 到 99 中,我不清楚哪个是最高优先级,1 还是 99。
“了解 Linux 内核” (O’Reilly) 的第 7.2.2 节说 1 是最高优先级,考虑到正常进程的静态优先级从 100 到 139 是有道理的,其中 100 是最高优先级:
“每个实时进程都与一个实时优先级相关联,该优先级的取值范围从 1(最高优先级)到 99(最低优先级)。”
另一方面,sched_setscheduler 手册页(RHEL 6.1)声称 99 是最高的:
“根据实时策略之一(SCHED_FIFO、SCHED_RR)调度的进程的 sched_priority 值在 1(低)到 99(高)的范围内。”
哪个是最高实时优先级?
原文由 David Steinhauer 发布,翻译遵循 CC BY-SA 4.0 许可协议
我做了一个实验来确定这一点,如下:
进程 1:RT 优先级 = 40,CPU 亲和性 = CPU 0。此进程“旋转”10 秒,因此它不会让任何低优先级进程在 CPU 0 上运行。
process2:RT 优先级 = 39,CPU 亲和性 = CPU 0。此进程每 0.5 秒向 stdout 打印一条消息,其间处于休眠状态。它打印出每条消息的经过时间。
我正在运行带有 PREEMPT_RT 补丁的 2.6.33 内核。
为了运行实验,我在一个窗口中(以 root 身份)运行 process2,然后在另一个窗口中启动 process1(以 root 身份)。结果是 process1 似乎抢占了 process2,不允许它运行整整 10 秒。
在第二个实验中,我将 process2 的 RT 优先级更改为 41。在这种情况下,process2 不会 被 process1 抢占。
本实验表明
sched_setscheduler()
中 较大的 RT优先级值具有较高的优先级。这似乎与 Michael Foukarakis 从 sched.h 中指出的相矛盾,但实际上并非如此。在内核源代码的 sched.c 中,我们有:rt_mutex_getprio(p) 执行以下操作:
虽然 normal_prio() 碰巧做了以下事情:
换句话说,我们有(我自己的解释):
哇!这令人困惑!总结一下:
对于 p->prio,较小的值会抢占较大的值。
使用 p->rt_priority,较大的值会抢占较小的值。这是使用
sched_setscheduler()
设置的实时优先级。