Linux – 当优先级较高的任务繁忙时,不会调度优先级较低的线程

环境 – 嵌入式设备与 linux内核2.6.18

要求 – 3个线程(从一个进程创建,假设P1创建了T1,T2,T3)

T1是linux优先级99(最高),T2是linux优先级50(中间),T3是linux优先级2(最低).没有为任何线程显式设置好的值.

T1和T3都每秒增加一次变量. T1每5秒打印一次变量.这很顺利.
[有问题的地方]当T2进入无限循环“for(;;);”时,T1的计数正常增加,但T3的计数根本没有增加.
意味着T3从未有时间在CPU中运行.

这段时间我一直在想Linux的CFS保证所有优先级都会得到适当的份额(基于权重).但是这证明了任何进入CPU而没有休眠的线程,阻止所有其他低优先级线程运行.

Plz回答如果有人知道为什么CFS调度程序以这种方式运行并且是否有办法纠正这个问题?

最佳答案 实时调度类总是先占任何较低的调度类.也就是说,具有SCHED_RR的线程(如果它已准备好运行)将始终抢占具有SCHED_OTHER的线程.这些类只应用于执行(通常很短的)紧急任务,这些任务是满足其他线程需求,硬件需求(例如从串口或网卡缓冲区读取)或出于安全目的(如编写审计或记录条目,或提交数据库事务).例如,用户模式设备驱动程序可能会使用这些优先级,因为它们必须完成其工作才能运行其他线程.

类似地,在SCHED_RR中,如果准备就绪,则优先级较高的进程将始终运行,这解释了您所看到的内容.

关键是:设置是关于CPU的优先访问,而不是共享对CPU的访问.优先级越高,总是如此.这就是优先考虑的意义.

(为了防止病态情况,实时进程默认限制为使用95%的CPU时间.这在健康的系统中永远不会发生.)

如果您只是希望线程拥有更多的一般资源份额,则应使用SCHED_OTHER并使用nice(2)或setpriority(2)将nice(2)值设置为负数.

> http://man7.org/linux/man-pages/man2/setpriority.2.html

很好(2)是关于共享CPU,因为它很好分享.

点赞