用户空间
首先是用户空间与内核空间的区别。在用户空间中,Linux针对不同的调度类有不同的优先级策略:
RT类型进程
优先级范围为 【1,99】,数值越大,优先级越高。
Normal类型进程(Fair类型)
即大家熟知的fair类型的进程,也是Linux系统中最多的进程。其优先级一般叫做 NICE值,范围为 【-20,19】,nice值越小,优先级越高。
内核空间
在内核空间中,会有 rt_priority、static_prio、normal_prio、prio,最后都会与 prio 有一个对应关系,调度算法计算时也是使用的 prio 变量。其对应关系如图所示。
RT类型进程
其 rt_priority 与用户层相同,但是其 normal_prio 和 prio 是相反的,计算方法为:
MAX_RT_PRIO - 1 - sched_prio
其中 MAX_RT_PRIO = 100,因此就出现了图中的优先级对应关系。与用户空间相反,这里的数值越小,其优先级越高。其调度策略也是优先调度优先级高的进程。
FAIR类型进程
优先级根据 nice 值计算得到:
prio = 120 + nice
对应到数值上,优先级即为 【100,139】。但是其调度策略不是完全按照其数值大小来调度的。在 kernel 6.6 之前为 CFS 算法,kernel 6.6 及以后是 EEVDF 算法,这里就不多赘述了。
Deadline类型进程
图中还有一个优先级为 -1 的优先级,这个是为 Deadline 调度类型的进程准备的,没有什么特别的意义,因为 Deadline 的进程调度算法是根据另外的 deadline 参数计算的。
本文基于Linux内核源码分析整理,如有疏漏欢迎指正。
图片参考自蜗窝科技文章 《进程优先级》,并做了修改与补充,感谢蜗窝科技!