正如几篇(有些旧的)文章所解释的,Linux空闲任务(PID=0,每个 CPU 一个)在没有其他任务要运行时运行。为了让调度程序执行此操作,空闲任务必须为其保留最低优先级。链接的 LWN 文章中的那个旧Documentation/ftrace.txt
文章明确表示
prio“140”是为空闲任务保留的,它是最低优先级线程(pid 0)。
这是有道理的,但是在 Linux 4.9 下
# perf record -e sched:sched_switch sleep 1
# perf script
sleep 6526 [000] 362661.310842: sched:sched_switch: sleep:6526 [120] S ==> swapper/0:0 [120]
报告优先级为 120 swapper/0
(在右括号中),与上述相矛盾。
现在的 Linux 调度器是如何处理空闲任务的?提交更改ftrace.txt
(87d80de28, 294ae4011) 没有帮助。
我从 Linux Kernel Mailing List 上的 Till Smejkal那里得到了一个很好的回答:
但是,根据我的理解,尽管不受 CFS 管理,但任务可以具有优先级:实时任务 (
SCHED_FIFO
和SCHED_RR
) 属于rt_sched_class
并且肯定具有有意义的优先级(根据 POSIX 的要求):但现在的重点是调度类的优先级,这是通过以下
const struct sched_class
结构实现的,这些结构按以下顺序通过它们的.next
指针链接:此链表经过 (
kernel/sched/sched.h
)正如上面引用中提到的,
pick_next_task()
inkernel/sched/core.c
向每个类询问一个可运行的任务,如下所示:所有这一切意味着空闲任务碰巧有一个优先级值(一些默认值),但在调度决策期间从未参考过它,因为它们是
idle_sched_class
.上面留下了改变优先级值的问题,但现在这主要是具有历史意义的(上面的代码引用来自 Linux 4.16)。