如何解决Linux进程调度优先级数字混乱的问题?详细实例分析

linux进程的调度优先级数字会在好几个地方出现:内核,用户,top命令。他们各自都有自己的表示法。我们用一个实际的例子来说明,下面在linux写一个最简单的程序:
编译它运行,把调度策略设置为sched_fifo,优先级设置为50:$ sudo chrt -f50./a.out这个时候我们在top命令里面观察a.out:
我们看到a.out的pr(优先级是)-51,cpu利用率100%。但是从内核的视角上面来看,又会用99减去用户在chrt里面设置的优先级:
上面的max_rt_prio的值为:
所以上述进程的优先级,在三个不同视角的值分别为:
用户 内核 top
50 49 -51
咋回事
linux的rt调度策略和普通进程在调度算法上面有差异,rt的sched_fifo和sched_rr采用的是一个bitmap:
每次从第0bit开始往后面搜索第一个有进程ready的bit,然后调度这个优先级上面的进程执行,所以在内核里面,prio数值越小,优先级越高。但是从用户态的api里面,则是数值越大,优先级越高。下面的代码,一个线程通过调用api把自己设置为sched_fifo,优先级50
这个上面的50,对应内核的49。如果我们把优先级设置为51:
这个51,对应内核bitmap上面的48。所以,你会发现,从用户的视角来看,数值变大,优先级变高。上面这2个视角,都不是top命令的视角。对于rt的进程而言,top的视角里面的pr= -1 -用户视角譬如,下面用户视角的88,
$ sudo chrt -f 88 ./a.out
对应内核视角的11,对应top视角的-89:
这实在让人有一点晕!!这里还有一个特例,就是用户视角的99(内核bitmap视角的0),显示为top命令的rt:
这说明一点,只有最高优先级的rt进程,才在top里面显示为rt。
普通的呢?
普通的讲nice的人相对来说比较简单,我们更关注它的nice值,-20~19之间,nice越低,优先级越高,权重越大,在cfs的红黑树左边的机会大。
你发现.nice为5的进程,在top命令显示pr是25。下面我们看nice是-5的:
它显示的是pr=15。由此大家可以发现规律,对于普通的采用cfs策略的normal进程,top里面的pr=20+nice
在一起
总结一下,4个例子
用户 内核 top
rt 50 49 (99-50) -51 (-1-50)
rt 99 0 rt
nice 5 25
nice -5 15
由此发现,在top里面,rt策略的pr都显示为负数;最高优先级的rt,显示为rt。top命令里面也是,数字越小,优先级越高。

训练神经网络的数据主要来自大陆测试车队?
MAX485和RS485发热停止工作的解决办法
基于单片机控制的高精密直流电流源的设计
CPLD实现DDS正弦信号发生器设计
优化嵌入式软件时可以遵循几个通用技巧盘点
如何解决Linux进程调度优先级数字混乱的问题?详细实例分析
各国家长对AI技术应用于孩子教育和医疗的接受程度如何?
Linux和物联网
关于两种无线传输技术WIHD和WIDI
汽车ECU诊断 DTC格式介绍
Jade Solutions用松下设备协助解决叉车调动问题
为什么电视厂商极少使用DP接口?
全球5G辐射问题再次引起争议有组织称5G是对人类最大的威胁
年出货量35亿颗MCU的瑞萨电子全面拥抱AI
加强监管下的数字货币交易所和以前有什么不一样
商用 LED 灯具的 0-10V 调光演变
AI视觉分析技术在校园监控中的应用
深度解析北京现代新胜达2.0T发动机技术
【解决方案】安科瑞变电所运维云平台在高速公路的应用
德州仪器如何致力于推动汽车电气化和高级驾驶辅助系统的发展