宋宝华: 关于Linux进程优先级数字混乱的彻底澄清

有点晕

Linux进程的调度优先级数字会在好几个地方出现:内核,用户,top命令。他们各自都有自己的表示法。我们用一个实际的例子来说明,下面在Linux写一个最简单的程序:

宋宝华: 关于Linux进程优先级数字混乱的彻底澄清_第1张图片

编译它运行,把调度策略设置为SCHED_FIFO,优先级设置为 50$ sudo chrt -f 50 ./a.out这个时候我们在top命令里面观察a.out:

宋宝华: 关于Linux进程优先级数字混乱的彻底澄清_第2张图片

我们看到a.out的PR(优先级是)-51,CPU利用率100%。
但是从内核的视角上面来看,又会用99减去用户在chrt里面设置的优先级:

宋宝华: 关于Linux进程优先级数字混乱的彻底澄清_第3张图片


上面的MAX_RT_PRIO的值为:

640?wx_fmt=png

所以上述进程的优先级,在三个不同视角的值分别为:

用户

内核

Top

50

49

-51

咋回事

Linux的RT调度策略和普通进程在调度算法上面有差异,RT的SCHED_FIFO和SCHED_RR采用的是一个bitmap:

宋宝华: 关于Linux进程优先级数字混乱的彻底澄清_第4张图片

每次从第0bit开始往后面搜索第一个有进程ready的bit,然后调度这个优先级上面的进程执行,所以在内核里面, prio数值越小,优先级越高
但是从用户态的API里面,则是数值越大,优先级越高。下面的代码,一个线程通过调用API把自己设置为SCHED_FIFO,优先级50

宋宝华: 关于Linux进程优先级数字混乱的彻底澄清_第5张图片

这个上面的50,对应内核的49。如果我们把优先级设置为51:

宋宝华: 关于Linux进程优先级数字混乱的彻底澄清_第6张图片

这个51,对应内核bitmap上面的48。所以,你会发现,从用户的视角来看,数值变大,优先级变高。上面这2个视角,都不是top命令的视角。对于RT的进程而言,TOP的视角里面的 PR= -1 -用户视角譬如,下面用户视角的 88

$ sudo chrt -f 88 ./a.out

对应内核视角的 11,对应top视角的 -89

宋宝华: 关于Linux进程优先级数字混乱的彻底澄清_第7张图片

这实在让人有一点晕!!
这里还有一个特例,就是用户视角的99(内核bitmap视角的0),显示为top命令的RT:

宋宝华: 关于Linux进程优先级数字混乱的彻底澄清_第8张图片

这说明一点,只有最高优先级的RT进程,才在top里面显示为rt。

普通的呢?

普通的讲nice的人相对来说比较简单,我们更关注它的nice值,-20~19之间,nice越低,优先级越高,权重越大,在CFS的红黑树左边的机会大。

宋宝华: 关于Linux进程优先级数字混乱的彻底澄清_第9张图片

你发现.nice为5的进程,在top命令显示PR是25。下面我们看nice是-5的:

宋宝华: 关于Linux进程优先级数字混乱的彻底澄清_第10张图片

它显示的是PR=15。由此大家可以发现规律,对于普通的采用CFS策略的NORMAL进程,top里面的 PR=20+NICE

在一起

总结一下,4个例子

用户

内核

Top

RT 50

49 (99-50)

-51 (-1-50)

RT 99

rt

NICE 5


25

NICE -5


15

由此发现,在top里面,RT策略的PR都显示为负数;最高优先级的RT,显示为rt。top命令里面也是,数字越小,优先级越高。

(打赏的童鞋请在打赏的时候留言让在下知道是谁并感恩)

640?wx_fmt=png



查看"Linux阅码场"精华技术文章请移步:

Linux阅码场原创精华文章汇总


扫描二维码关注"Linux阅码场" 

640?wx_fmt=png

你可能感兴趣的:(宋宝华: 关于Linux进程优先级数字混乱的彻底澄清)