首页 文章

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

提问于
浏览
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而没有休眠的线程,阻止所有其他低优先级线程运行 .

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

1 回答

  • 1

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

    同样地,在 SCHED_RR 中,如果准备就绪,则优先级更高的流程将运行,这解释了您所看到的内容 .

    关键是:设置大约是 priority access to the CPU ,它不是 sharing access to the CPU . 优先级越高,总是如此 . 这就是优先考虑的意义 .

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

    如果您只是希望线程具有更大的一般资源_1131125_,则应使用 SCHED_OTHER 并使用 nice(2)setpriority(2)nice(2) 值设置为负数 .

    nice(2) 约为 sharing the CPU 因为分享很好 .

相关问题