千家信息网

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

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,本篇内容主要讲解"如何理解Linux之进程优先级PR和NI",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"如何理解Linux之进程优先级PR和NI"吧!JD
千家信息网最后更新 2026年11月02日如何理解Linux之进程优先级PR和NI

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

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

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

                  图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 --helpShow or change the real-time scheduling attributes of a process.Set policy: chrt [options]   [...] chrt [options] --pid  Get policy: chrt [options] -p 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   runtime parameter for DEADLINE -P, --sched-period    period parameter for DEADLINE -D, --sched-deadline  deadline parameter for DEADLINEOther 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 versionFor 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,即系统总是调度虚拟时间比较小的进程

图2

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

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

List-2

mjduan@dmj:/mnt/sdb1/doc/minedoc$ jps26960 Main12642 Jps27090 Main890 RemoteJdbcServer31980 Launchermjduan@dmj:/mnt/sdb1/doc/minedoc$ chrt -p 27090pid 27090's current scheduling policy: SCHED_OTHERpid 27090's current scheduling priority: 0mjduan@dmj:/mnt/sdb1/doc/minedoc$ chrt -p 890pid 890's current scheduling policy: SCHED_OTHERpid 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 3000000mjduan@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"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

进程 优先级 调度 时间 实时 策略 算法 系统 队列 最小 情况 内核 实际 时候 是非 有时候 多核 复杂 最高 操作系统 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 广东万易互联网科技有限公司惠州分公司 伟宏互联网科技 上海睿民互联网科技有限公司 中国互联网科技发展 远拓互联网科技 银优互联网科技有限公司 科技大学互联网专业好不好 深圳互联网科技怎么样 小米互联网科技园设置 随着互联网科技发展 昭通云南众福互联网科技有限公司 辽宁互联网新科技 互联网科技研发水平 互联网科技的全部知识 科技互联网的核心竞争力 互联网领先科技宣传片 济南小医互联网科技有限公司招聘 普陀区互联网教育科技管理办法 广东猫王互联网科技有限公司电话 科技美学互联网 艺术 互联网科技工作委员会 互联网金融 金融科技 上海喔噻互联网科技 华中科技有哪些互联网大佬 阿里巴巴算科技企业还是互联网 科技互联网的核心竞争力 上海互联网科技公司ppt 风投北京互联网科技 互联网科技包装股份有限公司上市 恒生科技互联网指数十大成分股
0