加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

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

发布时间:2020-12-13 23:28:03 所属栏目:Linux 来源:网络整理
导读:环境 – 嵌入式设备与 linux内核2.6.18 要求 – 3个线程(从一个进程创建,假设P1创建了T1,T2,T3) T1是linux优先级99(最高),T2是linux优先级50(中间),T3是linux优先级2(最低).没有为任何线程显式设置好的值. T1和T3都每秒增加一次变量. T1每5秒打印一次变量.这
环境 – 嵌入式设备与 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,因为它很好分享.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读