当前位置: 首页 > news >正文

Linux进程优先级机制深度解析:从Nice值到实时调度

前言

        在Linux系统中,进程优先级决定了CPU资源的分配顺序,直接影响系统性能和关键任务的响应速度。无论是优化服务器负载、确保实时任务稳定运行,还是避免低优先级进程拖慢系统,合理调整进程优先级都是系统管理和性能调优的重要技能。

目录

一、进程优先级概述

1、基本概念

2、存在原因

二、查看进程优先级信息

1、PRI与NI的关系

2、PRI 与 NI 的区别

三、竞争、独立、并行、并发

1、进程相关核心概念

2、概念对比图

3、补充说明

四、通过top命令更改进程的nice值

步骤 1:启动 top

步骤 2:找到目标进程

步骤 3:进入 Nice 值修改模式

步骤 4:验证修改

五、两种不同的优先级系统

六、Nice优先级系统

1、Nice值范围

2、相关命令

nice 命令

renice 命令

七、验证NI和PRI的范围

1. 验证 NI(nice 值)的范围

实验方法

结论

2. 验证 PRI(进程优先级)的范围

实验方法

结论

3. 为什么范围是 -20 到 19?

4. 总结

八、实时优先级系统(了解即可,不掌握)

1、实时优先级范围

2、调度策略

3、相关命令

九、内核视角的优先级

十、调整优先级的注意事项

十一、实际应用示例(了解即可,不掌握)

示例1:启动一个低优先级的压缩任务

示例2:将正在运行的进程改为高优先级

示例3:设置实时音频处理进程


一、进程优先级概述

1、基本概念

        优先级是指获取资源的先后顺序。进程优先级则特指进程获得CPU资源分配的优先顺序,即进程的优先权(priority)。优先权较高的进程享有优先执行的权利。

2、存在原因

        优先级的产生源于资源的有限性。对于进程优先级而言,其存在的根本原因是CPU资源的稀缺性。由于单个CPU同一时间只能运行一个进程,而系统中往往存在多个并发进程,因此需要通过优先级机制来确定各进程获取CPU资源的先后顺序。


二、查看进程优先级信息

在Linux或Unix系统中,执行ps -l命令通常会显示如下信息:

ps -l <PID>

关键信息如下:

  • UID:执行者的身份标识,用于系统识别和权限管理

  • PID:进程的唯一标识符
  • PPID:父进程的标识符(即创建该进程的进程ID)
  • PRI:进程优先级,数值越小优先级越高
  • NI:进程的nice值

小知识:

  • 在Linux系统中,操作系统通过UID(用户标识符)来识别进程访问文件时的权限身份。
  • 每个进程都代表特定用户运行,系统会根据进程所属用户的UID来判断其访问权限,包括文件所有者、所属组或其他用户的权限类别。

1、PRI与NI的关系

  • PRI表示进程的CPU执行优先级,数值越小越优先执行
  • NI是进程优先级的修正值,影响最终的PRI值
  • 计算公式:PRI(new) = PRI(old) + NI
    • 当NI为负值时,PRI降低(优先级提高)
    • 在Linux系统中,PRI(old)默认值为80,即PRI = 80 + NI
  • NI的取值范围:-20到19(共40个级别)
  • 调整进程优先级实际上就是修改其nice值(NI)

2、PRI 与 NI 的区别

  • 需要明确的是,进程的 nice 值(NI)并不等同于进程优先级(PRI),它们是两个不同的概念。但 nice 值会影响进程优先级的调整。
  • 简单来说,nice 值是用于修正进程优先级的一个数值参数。

三、竞争、独立、并行、并发

1、进程相关核心概念

  1. 竞争性 (Competitive)

    • 定义:系统进程数量众多,而CPU资源有限(如单核CPU),因此进程之间需要竞争获取计算资源。

    • 延伸:为了优化资源分配,操作系统通过优先级调度算法管理竞争,确保关键任务优先执行。

    • 示例:高优先级进程(如系统服务)可抢占低优先级进程(如后台应用)的CPU时间。

  2. 独立性 (Independent)

    • 定义:每个进程拥有独立的虚拟地址空间和系统资源(如文件描述符、内存),多进程运行时互不干扰。

    • 延伸:独立性由操作系统通过内存隔离和资源保护机制实现,确保进程崩溃不会影响其他进程。

    • 例外:进程间通信(IPC)机制可打破独立性,如共享内存、管道等。

  3. 并行 (Parallelism)

    • 定义:多个进程在多核CPU/多处理器同时执行,每个进程独占一个计算核心。

    • 条件:要求硬件支持(CPU核心数≥进程数)。

    • 示例:4个进程在4核CPU上同时运行,每个核心处理一个进程。

  4. 并发 (Concurrency)

    • 定义:多个进程在单核CPU上通过时间片轮转、上下文切换等机制交替执行,宏观上表现为“同时推进”。

    • 关键:操作系统通过调度器(Scheduler)快速切换进程,用户感知为多任务并行(实际是伪并行)。

    • 对比:并发是逻辑上的“同时”,并行是物理上的同时。

2、概念对比图

特性竞争性独立性并行并发
核心资源争用隔离保护多核物理同时执行单核逻辑交替执行
依赖资源稀缺操作系统机制多CPU/多核硬件调度算法
表现优先级调度进程互不干扰真正同步快速切换的异步

3、补充说明

  • 并发与并行的关系:并发是更广义的概念,并行是并发的子集(硬件允许多任务真正同步时)。

  • 现代系统:通常并发与并行共存(如多核CPU上每个核心并发调度多个线程)。


四、通过top命令更改进程的nice值

步骤 1:启动 top

在终端输入:

top

你会看到一个动态刷新的进程列表,包含 PIDUSERNIPRI 等信息:

步骤 2:找到目标进程

  1. 在 top 界面中,可以使用按 Shift + P(按 CPU 使用率排序)或 Shift + M(按内存使用率排序)的方式,找到你要修改的进程。

  2. 记录进程的 PID(第一列)。

步骤 3:进入 Nice 值修改模式

  1. 在 top 运行时,按 r(代表 "renice")。

  2. 输入要调整的 PID,按回车。

    PID to renice [default: 0]: 1234  # 替换为目标 PID

  3. 输入新的 Nice 值(范围:-20 到 19),按回车。

    • 负值(如 -5):提高优先级(需 root 权限)。

    • 正值(如 10):降低优先级(普通用户可设置)。

    Renice PID 1234 to value: 5  # 示例:设置为 5

步骤 4:验证修改

  1. 修改后,在 top 界面中检查该进程的 NI 列是否已更新。

  2. 按 q 退出 top

        输入nice值后按“q”即可退出,如果我们这里输入的nice值为5,那么此时我们再用ps命令查看进程的优先级信息,即可发现进程的NI变成了5,PRI变成了85(80+NI):

注意: 若是想将NI值调为负值,也就是将进程的优先级调高,需要使用sudo top提升权限。


五、两种不同的优先级系统

        在Linux操作系统中,进程优先级决定了进程获取CPU资源的顺序和频率。优先级高的进程会获得更多的CPU时间,从而更快地执行。Linux使用两种不同的优先级系统:

  1. Nice值(NI):用户空间优先级,范围从-20(最高优先级)到19(最低优先级)

  2. 实时优先级:用于实时进程,范围从1(最低)到99(最高)


六、Nice优先级系统

1、Nice值范围

        采用时间片机制的分时操作系统需兼顾公平性,允许优先级动态调整,但必须严格控制优先级的变化幅度:

  • 默认值:0

  • 可调整范围:-20(最高优先级)到19(最低优先级)

  • 普通用户限制:只能调低优先级(增大nice值,0→19)

  • root用户:可以调高或调低优先级(-20→19)

2、相关命令

查看进程优先级信息:

ps -eo pid,ni,comm

或者我们也可以使用:

top # 然后按'r'键调整优先级

注意: 在Linux操作系统中,初始进程一般优先级PRI默认为80,NI默认为0。 

启动时设置优先级:

nice 命令

  • 用于以指定的优先级启动一个进程

  • 语法:nice -n [优先级值] [命令]

  • 优先级范围通常为 -20 (最高优先级) 到 19 (最低优先级)

  • 普通用户只能降低优先级(设为正值),只有root可以提升优先级(设为负值)

nice -n 10 ./test
启动程序,并设置 NI=10(较低优先级),然后验证优先级:

调整运行中进程的优先级:

renice 命令

  • 用于修改已运行进程的优先级

  • 语法:renice [优先级值] -p [进程ID]

  • 同样遵循-20到19的范围限制

renice 5 -p PID

注意: 若是想使用renice命令将NI值调为负值,也需要使用sudo renice命令提升权限。


七、验证NI和PRI的范围

        在 Linux 系统中,进程的优先级(PRI)和 nice 值(NI)的范围是 -20 到 19NI),而 PRI 的范围通常是 0 到 139(但用户可见的 PRI 范围是 60 到 99)。我们可以通过简单的实验来验证这些范围:

1. 验证 NI(nice 值)的范围

        Linux 允许的 nice 值范围是 -20(最高优先级)到 19(最低优先级)。普通用户只能降低优先级(NI ≥ 0),而 root 可以提升优先级(NI < 0)。

实验方法

  • 尝试用 nice 或 renice 设置超出范围的 NI 值:

    nice -n -21 [可执行程序]# 尝试设置 NI = -21(超出范围)
    nice -n 20 [可执行程序]# 尝试设置 NI = 20(超出范围)
  • 系统会返回错误:

结论
  • NI 的范围确实是 -20 到 19,超出范围会被拒绝。

2. 验证 PRI(进程优先级)的范围

        Linux 的 PRI 值由内核动态调整,但用户可见的 PRI 范围是 60(最高优先级)到 99(最低优先级)NI 会影响 PRI 的计算:

PRI=80+NIPRI=80+NI(80 是默认基准优先级)

实验方法

  • 查看默认进程的 PRI 和 NI

    ps -l

    输出示例:PRI = 80NI = 0(默认情况)。

  • 用 nice 启动一个低优先级进程

    nice -n 19 [可执行文件]# 设置 NI = 19(最低优先级)
    ps -l PID

    输出:

    • PRI = 9980 + 19 = 99)。

  • 用 renice 提高优先级(需要 root

    sudo renice -n -20 -p PID  # 设置 NI = -20(最高优先级)
    ps -l

    输出bad value,这里观察不了,其实上面对NI观察已经可以证明结论了。

结论
  • PRI 的计算公式是 PRI = 80 + NI,所以:

    • 当 NI = -20 时,PRI = 60(最高优先级)。

    • 当 NI = 19 时,PRI = 99(最低优先级)。

  • PRI 的可调整范围是 60–99(由 NI 决定)。

3. 为什么范围是 -20 到 19?

  • 这是 Linux 内核的默认设计:

    • NI 的范围 -20 到 19 提供了 40 个优先级级别(足够精细调整)。

    • PRI 的范围 60–99 是用户可见的优先级,而内核实际使用 0–139(其中 0–59 用于实时进程,60–99 用于普通进程)。

4. 总结

参数范围计算方式实验验证方法
NI-20 到 19直接设置nice -n -20 / nice -n 19
PRI60 到 99PRI = 80 + NIps -l 观察 NI 对 PRI 的影响

通过实验可以确认:

  1. NI 的范围是 -20 到 19,超出会报错。

  2. PRI 的范围是 60 到 99,由 PRI = 80 + NI 决定。


八、实时优先级系统(了解即可,不掌握)

实时优先级用于需要严格调度控制的进程,如音频处理、工业控制系统等。

1、实时优先级范围

  • SCHED_FIFOSCHED_RR策略:1(最低)到99(最高)

  • SCHED_OTHER(标准分时调度):不使用实时优先级

2、调度策略

策略描述
SCHED_OTHER标准分时调度(默认),使用nice值
SCHED_FIFO先进先出实时调度,高优先级进程会一直运行直到阻塞或退出
SCHED_RR轮转实时调度,同优先级进程按时间片轮转
SCHED_BATCH针对批处理作业的调度
SCHED_IDLE极低优先级,系统空闲时才运行

3、相关命令

查看进程调度策略和优先级:

chrt -p PID

设置实时优先级:

chrt -f -p 90 PID # 设置FIFO调度,优先级90
chrt -r -p 80 PID # 设置RR调度,优先级80

九、内核视角的优先级

在内核中,优先级通过以下方式表示:

  1. 静态优先级:由用户设置的nice值转换而来

  2. 动态优先级:内核根据进程行为调整的优先级

  3. 实时优先级:用于实时进程的特殊优先级

内核维护一个运行队列,将进程按优先级组织,调度器总是选择最高优先级的可运行进程。


十、调整优先级的注意事项

  1. 谨慎提高优先级:过高优先级可能导致系统资源被独占

  2. 实时进程风险:错误的实时进程可能导致系统无响应

  3. 权限限制:普通用户只能降低自身进程的优先级

  4. 系统监控:使用tophtop监控优先级调整效果


十一、实际应用示例(了解即可,不掌握)

示例1:启动一个低优先级的压缩任务

nice -n 19 tar -czf backup.tar.gz /data

示例2:将正在运行的进程改为高优先级

sudo renice -10 -p 1234

示例3:设置实时音频处理进程

chrt -f -p 99 $(pidof pulseaudio)

        理解Linux进程优先级对于系统性能调优和资源管理至关重要,特别是在多任务环境或资源受限的系统中。

http://www.lryc.cn/news/588029.html

相关文章:

  • 基于MATLAB的LSTM长短期记忆神经网络的时间序列数据预测方法应用
  • .NET ExpandoObject 技术原理解析
  • C#/.NET/.NET Core技术前沿周刊 | 第 46 期(2025年7.7-7.13)
  • 如何用深度学习实现图像风格迁移
  • 面试150 路径总和
  • 电脑升级Experience
  • WPF自定义日历选择控件
  • ZYNQ双核通信终极指南:FreeRTOS移植+OpenAMP双核通信+固化实战
  • spark广播表大小超过Spark默认的8GB限制
  • 大数据系列之:通过trino查询hive表
  • pyspark中map算子和flatmap算子
  • kettle从入门到精通 第103课 ETL之kettle kettle读取redis中的Hash数据
  • IOS开发者账号如何添加 uuid 原创
  • 图机器学习(1)——图论基础
  • [硬件电路-22]: 为什么模拟电路信号处理运算的精度不如数字信号处理运算?
  • flink 中配置hadoop 遇到问题解决
  • 基于MaxCompute MaxFrame 汽车自动驾驶数据预处理最佳实践
  • WST2078 N+P 双通道 MOSFET 在蓝牙耳机中的技术适配
  • FreeSWITCH fifo模块排队并动态播放排队位置
  • 12.如何判断字符串是否为空?
  • AI驱动的软件工程(下):AI辅助的质检与交付
  • SpringBoot 整合 MyBatis-Plus
  • 智源全面开源RoboBrain 2.0与RoboOS 2.0:刷新10项评测基准,多机协作加速群体智能
  • LangChain面试内容整理-知识点16:OpenAI API接口集成
  • docker-compose 安装Alist
  • rk3588ubuntu 系统移植AIC8800D Wi-Fi6/BT5.0芯片
  • FRP Ubuntu 服务端 + MacOS 客户端配置
  • mac安装nvm执行命令报错-解决方案
  • Ubuntu服务器安装Miniconda
  • 131. Java 泛型 - 目标类型与泛型推断