4

环境 - 具有 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 调度程序会以这种方式运行,请回答,如果有办法纠正这个问题?

4

1 回答 1

1

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

同样,如果准备就绪,SCHED_RR优先级较高的进程将始终运行,这解释了您所看到的。

关键是:该设置是关于对 CPU 的优先访问,而不是关于共享对 CPU 的访问。更高的优先级总是获胜。这就是优先的意思。

(为了防止异常情况,默认情况下实时进程被限制为使用 95% 的 CPU 时间。这在健康的系统中绝不应该发生。)

如果您只是希望您的线程在一般资源中占有更大份额,您应该使用orSCHED_OTHER将您的nice(2)值设置为负数。nice(2)setpriority(2)

nice(2)是关于共享 CPU,因为它很好共享。

于 2016-01-22T13:38:13.917 回答