温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

如何理解Linux之进程优先级PR和NI

发布时间:2021-10-12 09:39:52 来源:亿速云 阅读:602 作者:iii 栏目:编程语言

本篇内容主要讲解“如何理解Linux之进程优先级PR和NI”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何理解Linux之进程优先级PR和NI”吧!

    JDK中线程有优先级,0-10,10表示优先级最大,而在Linux中则值最小表示优先级最高,优先级高的占用CPU的时间多。

    Linux中有PR和NI,在top命令的结果中就可以看到,如下图1是top的结果,可以看到NI和PR的列值:

如何理解Linux之进程优先级PR和NI

                  图1

    先来搞清楚PR(priority)和NI(nice)值的区别

nice值

    这是一个反应进程优先级状态的值,范围在-20到19,即总共有40个值,值最小,优先级最高,默认值是0

nice值虽然不是priority值,但是它可以影响进程优先级

    nice值越低的进程抢占CPU的能力越强,而nice值越高的进程抢占CPU的能力越弱

    在原来O1调度的Linux上,nice值也叫静态优先级,一旦设置了,除非手动renice修改值,否则不会改变;在priority值在O1调度的Linux上,值是会变的,所以也叫动态优先级。

    在linux上,renice  10  pid,这样就可以将pid的那个进程的优先级设置为10,renice设置值的时候只能设置为值更大的值,比如之前的值是5,之后的值设置为10是可以的,但是设置为-10是不可以的,会报没有权限的错误,除非使用root用户。 

实时操作系统

    实时操作系统需要保证相关的实时进程在较短的时间内响应,不会有较长的延时,并且要求最小的中断延时和进程切换延时。对于这样的需求,一般的进程调度算法,无论是O1还是CFS都是无法满足的,所以内核在设计的时候,将实时进程单独映射了100个优先级,这些优先级都要高于正常进程的优先级(nice值),而实时进程的调度算法也不同,它们采用更简单的调度算法来减少调度开销。

    由于实时进程,无论是O1还是CFS调度,都满足不了,所以给它们分配0-100的值优先级,使用简单的调度算法,来减少开销。

    实时进程和非实时进程的区分是通过优先级来区分的,0-99的都是实时进程,而100-139的都是非实时进程,NICE的-20~19对应着100~139,如果PR列中看到的是'rt',那么说明这个任务/进程是realtime进程,即实时进程,有时候会看到PR的值不是数值,而是rt的。

    如下List-1中所示,policy options部分,系统给进程5种调度策略,这5中调度策略是给俩中进程使用的,实时进程:SCHED_FIFO、SCHED_RR,而对于非实时进程则是:SCHED_OTHER、SCHED_OTHER、SCHED_IDLE。

    List-1

mjduan@dmj:/mnt/sdb1/doc/minedoc$ chrt --help
Show or change the real-time scheduling attributes of a process.

Set policy:
 chrt [options] <priority> <command> [<arg>...]
 chrt [options] --pid <priority> <pid>

Get policy:
 chrt [options] -p <pid>

Policy options:
 -b, --batch          set policy to SCHED_BATCH
 -d, --deadline       set policy to SCHED_DEADLINE
 -f, --fifo           set policy to SCHED_FIFO
 -i, --idle           set policy to SCHED_IDLE
 -o, --other          set policy to SCHED_OTHER
 -r, --rr             set policy to SCHED_RR (default)

Scheduling options:
 -R, --reset-on-fork       set SCHED_RESET_ON_FORK for FIFO or RR
 -T, --sched-runtime <ns>  runtime parameter for DEADLINE
 -P, --sched-period <ns>   period parameter for DEADLINE
 -D, --sched-deadline <ns> deadline parameter for DEADLINE

Other options:
 -a, --all-tasks      operate on all the tasks (threads) for a given pid
 -m, --max            show min and max valid priorities
 -p, --pid            operate on existing given pid
 -v, --verbose        display status information

 -h, --help           display this help
 -V, --version        display version

For more details see chrt(1).

    系统的整体调度策略:

  1.     如果系统中存在要执行的实时进程,那么执行实时进程

  2.     直到实时进程退出或者主动让出CPU时,才会调度执行非实时进程

sched_fifo: 是实时进程的调度策略之一,使用FIFO的策略,在优先级一样的情况下,谁先进入队列那么那个先被调度

sched_rr: 是实时进程调度策略之一,使用时间分片的策略,默认是100ms,这种策略简单,适合实时进程延时小的特点

    Linux上更麻烦的是非实时调度策略,linux上很多进程都是非实时进程,它们的主要调度算法是O1和CFS调度策略

O1调度策略

    是2.6内核版本引入的,到2.6.63就被替换为CFS了

    命名为O1是因为它算法的时间复杂度是O1,使用时间分片思路来,将cpu的时间分为一小段一小段,每个进程占用一段时间分片,对于多核的来说,对每个cpu进行这样时间分片即可。优先级是怎么处理的呢:优先级高的时间分片占用多,反之占用少

CFS完全公平调度

    O1对多核、多CPU支持的不好,性能不好,此外linux内核还要加上cgroup的功能,所以被替换为了CFS,Linux在2.6.23之后开始启用CFS作为对一般优先级(SCHED_OTHER)进程调度方法

    CFS调度策略会收集虚拟时间,然后构建红黑树red-block tree,虚拟时间就是红黑树的key,所以虚拟时间越短的会在红黑树的最左边,查询的时间复杂度是Log(N)。

    大致是这样的,会根据当前进程的优先级和执行时间,来生成一个虚拟时间,对每个进程都是如此,最后构建红黑树,红黑树中左边的进程表示虚拟时间值小,表示大部分时候在占用cpu,而右边的进程表示虚拟时间大,当一个虚拟时间小的进程在占用cpu时,如果此时一个虚拟时间大的进程变得可运行,那么这个虚拟时间大的就会抢占cpu,即系统总是调度虚拟时间比较小的进程

 如何理解Linux之进程优先级PR和NI

                                                              图2

    多核cpu情况下,CFS是怎么优化性能的,每个cpu会维护一个调度队列,避免使用全局队列而出现争抢的锁问题,但是每个cpu一个队列之后,就有可能出现负载不均衡,所以系统需要定期对各个cpu队列进行平衡

    如下List-2中,使用chrt命令查看进程的优先级是0,调度算法是CFS

    List-2

mjduan@dmj:/mnt/sdb1/doc/minedoc$ jps
26960 Main
12642 Jps
27090 Main
890 RemoteJdbcServer
31980 Launcher
mjduan@dmj:/mnt/sdb1/doc/minedoc$ chrt -p 27090
pid 27090's current scheduling policy: SCHED_OTHER
pid 27090's current scheduling priority: 0
mjduan@dmj:/mnt/sdb1/doc/minedoc$ chrt -p 890
pid 890's current scheduling policy: SCHED_OTHER
pid 890's current scheduling priority: 0
补充

    如果需要调度的进程个数为n,那么平均每个进程占用的CPU时间为sched_latency_ns/n。显然,每个进程实际占用的CPU时间会因为n的增大而减小。但是实现上不可能让它无限的变小,所以sched_min_granularity_ns的值也限定了每个进程可以获得的执行时间周期的最小值

    List-3

mjduan@dmj:/mnt/sdb1/doc/minedoc$ cat /proc/sys/kernel/sched_latency_ns 
3000000
mjduan@dmj:/mnt/sdb1/doc/minedoc$ cat /proc/sys/kernel/sched_min_granularity_ns 
300000
注意:

    对于普通进程而言,PR=nice+20,所以默认情况下,创建的进程nice值是0,而PR值是20,比如默认的情况下java应用的PR就是20.

    对于rt进程,即实时进程,PR=-1-用户视角,所以有时候看到PR值是-51的进程,那么它实际对应的优先级是50,有时候看到PR的值是rt而不是数值,这种对应的优先级是99

到此,相信大家对“如何理解Linux之进程优先级PR和NI”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI