环境 - 使用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而没有休眠的线程,阻止所有其他低优先级线程运行。
如果有人知道为什么CFS调度程序会以这种方式运行并且是否有办法纠正这个问题,那么Plz会回答这个问题吗?
答案 0 :(得分:1)
实时调度类总是先占任何较低的调度类。也就是说,SCHED_RR
的帖子(如果已准备好运行)将始终抢先使用SCHED_OTHER
的帖子。这些类只应用于执行(通常很短的)紧急任务,这些任务是满足其他线程需求,硬件需求(例如从串口或网卡缓冲区读取)或出于安全目的(如编写审计或记录条目,或提交数据库事务)。例如,用户模式设备驱动程序可能会使用这些优先级,因为它们必须完成其工作才能运行其他线程。
同样在SCHED_RR
范围内,如果准备就绪,优先级较高的流程将始终运行,这解释了您所看到的内容。
关键是:设置是关于优先访问CPU ,它与共享CPU访问权限无关。优先级越高,总是如此。这就是优先的意思。
(为了防止病态情况,实时进程默认限制为使用95%的CPU时间。这在健康的系统中永远不会发生。)
如果您只是希望自己的广告资源拥有更强大的份额,则应使用SCHED_OTHER
并使用{{nice(2)
将值设置为负数1}}或nice(2)
。
setpriority(2)
是关于共享CPU ,因为它很适合分享。