Linux系统进程调度优化:优先级策略与切换机制深度实践


🔥草莓熊Lotso: 个人主页
❄️个人专栏: 《C++知识分享》 《Linux 入门到实践:零基础也能懂》
✨生活是默默的坚持,毅力是永久的享受!


🎬 博主简介:


文章目录

  • 前言:
  • [一. 进程优先级:CPU 资源的 "分配权重"](#一. 进程优先级:CPU 资源的 “分配权重”)
  • [二. 优先级的查看方式](#二. 优先级的查看方式)
  • [三. 优先级的调整方法补充(实战重点):](#三. 优先级的调整方法补充(实战重点):)
    • [3.1 创建进程时指定 nice 值(nice 命令)](#3.1 创建进程时指定 nice 值(nice 命令))
    • [3.2 调整已运行进程的 nice 值(renice 命令)](#3.2 调整已运行进程的 nice 值(renice 命令))
    • [3.3 top 命令交互式调整(可视化操作)](#3.3 top 命令交互式调整(可视化操作))
    • [3.4 系统函数调整(系统调用)](#3.4 系统函数调整(系统调用))
  • [四. 补充概念:竞争,独立,并行,并发](#四. 补充概念:竞争,独立,并行,并发)
  • [五. 进程切换:并发的底层实现](#五. 进程切换:并发的底层实现)
  • 结尾:

前言:

在 Linux 多任务环境中,进程优先级和切换是保障系统高效运行的核心机制。优先级决定了 CPU 资源的分配顺序,让关键任务优先获得执行机会;而进程切换则实现了 "单 CPU 并发多任务" 的核心逻辑,让多个进程看似 "同时" 运行。本文聚焦进程优先级与切换的核心知识点,从基础概念、实战操作到底层原理,层层递进帮你吃透这两个关键机制,学会在实际开发中优化进程资源分配、减少切换开销。


一. 进程优先级:CPU 资源的 "分配权重"

进程优先级是操作系统分配 CPU 时间片的核心依据,优先级越高,进程获得 CPU 执行的概率越大。Linux 中优先级的管理核心是PRI(静态优先级)和NI(nice 值),两者协同决定进程的实际执行优先级。

✅️ 核心概念:PRI 与 NI:

(1)PRI(Priority):静态优先级

  • 表示进程的基础优先级,值越小,优先级越高;
  • Linux 普通进程的 PRI 范围为 100~139,进程创建时由内核默认分配(默认值 120);
  • 用户无法直接修改 PRI,只能通过调整 NI 间接改变。

(2)NI(Nice 值):优先级修正值

  • 用于调整进程的实际优先级,取值范围为-20~19(共 40 个级别);
  • 实际优先级计算公式:PRI(new) = PRI(old) + NI;
  • 核心特性:
    • NI 为负数:PRI 降低,优先级升高(如 NI=-5 → PRI=115);
    • NI 为正数:PRI 升高,优先级降低(如 NI=10 → PRI=130);
    • NI=0:优先级保持默认,不做调整。

二. 优先级的查看方式

(1)ps 命令(静态查看)

bash 复制代码
# 查看当前终端进程的优先级信息
ps -al

输出关键信息解析

  • PRI:当前进程的静态优先级;
  • NI:当前进程的 nice 值;
  • PID:进程 ID(后续调整优先级需用到)。
  • UID:表明这个进程是谁(那个用户)启动的

(2)top 命令(动态查看)

bash 复制代码
top
  • 进入界面后,按 f 键可添加PRINI字段;
  • 实时观察进程优先级变化,适合监控高负载场景下的进程状态。

三. 优先级的调整方法补充(实战重点):

Linux 提供多种方式调整进程 nice 值,间接修改优先级,核心原则是 "只能调整 NI,无法直接改 PRI"

3.1 创建进程时指定 nice 值(nice 命令)

bash 复制代码
# 格式:nice -n [NI值] 命令
nice -n 5 ./myproc  # 以NI=5启动
nice -n -3 ./myproc  # 以NI=-3启动

3.2 调整已运行进程的 nice 值(renice 命令)

bash 复制代码
# 格式:renice [NI值] -p [进程PID]
renice 10 -p 5678  # 将PID=5678的进程NI改为10
renice -5 -p 5678  # 将PID=5678的进程NI改为-5

3.3 top 命令交互式调整(可视化操作)

  1. 执行 top 进入监控界面;
  2. r 键,输入要调整的进程 PID
  3. 输入目标 nice 值(如-10),回车确认;
  4. q 退出 top,调整立即生效。

3.4 系统函数调整(系统调用)

通过getprioritysetpriority函数在代码中动态调整:

cpp 复制代码
#include <sys/resource.h>
#include <stdio.h>

int main() {
    // 获取当前进程的nice值(PRIO_PROCESS表示进程级,0表示当前进程)
    int ni = getpriority(PRIO_PROCESS, 0);
    printf("初始nice值:%d\n", ni);

    // 设置当前进程nice值为-3
    setpriority(PRIO_PROCESS, 0, -3);
    printf("修改后nice值:%d\n", getpriority(PRIO_PROCESS, 0));
    return 0;
}

优先级调整的注意事项:

  • 权限限制 :普通用户只能将 NI 调大(降低优先级),root 用户可全范围(-20~19)调整;
  • 避免过度提升:高优先级进程会抢占更多 CPU,可能导致其他进程 "饥饿"(长期无法执行);

四. 补充概念:竞争,独立,并行,并发

  • 竞争性:系统进程数目众多,而 CPU 资源只有少量,甚至 1 个,所以进程之间是具有竞争属性的。为了高效的完成任务,更合理竞争相关资源,便具有了优先级
  • 独立性:多进程运行,需要独立各种资源,多进程运行期间互不干扰
  • 并行:多个进程在一个 CPU 下分别,同时进行运行,这称之为并行
  • 并发:多个进程在一个 CPU 下采用进程切换的方式,在一段时间之内,让多个进程都得以推进,称之为并发

五. 进程切换:并发的底层实现

进程切换(上下文切换)是指 CPU 从一个进程切换到另一个进程执行的过程,是 Linux 实现 "单 CPU 并发多任务" 的核心机制。

  • CPU上下文切换:其实际含义是任务切换,或者 CPU 寄存器切换。当多任务内核决定运行另外的任务时,它保存正在运行任务的当前状态,也就是 CPU 寄存器中的全部内容。这些内容被保存在任务自己的堆栈中,入栈工作完成后就把下一个将要运行的任务的当前状况从该任务的栈中重新装入 CPU 寄存器,并开始下一个任务的运行,这一过程就是 context switch

CPU 寄存器是进程执行的 "临时工作台",存储着进程当前的执行状态(程序计数器、寄存器值、栈指针等)。切换时需完成两步关键操作:

  • 保存上下文:将当前进程的寄存器数据、程序计数器、栈信息等,保存到该进程的task_struct(PCB,进程控制块)的任务状态段中;
  • 恢复上下文 :从下一个要执行的进程的task_struct中,读取之前保存的上下文数据,加载到 CPU 寄存器;
  • 切换执行:将程序计数器指向新进程的下一条指令,CPU 开始执行新进程。

涉及的知识点如下图所示

✅️ 注意:

  • 时间片:当代计算机都是分时操作系统,没有进程都有它合适的时间片(其实就是一个计数器)。时间片到达,进程就被操作系统从 CPU 中剥离下来

结尾:

html 复制代码
🍓 我是草莓熊 Lotso!若这篇技术干货帮你打通了学习中的卡点:
👀 【关注】跟我一起深耕技术领域,从基础到进阶,见证每一次成长
❤️ 【点赞】让优质内容被更多人看见,让知识传递更有力量
⭐ 【收藏】把核心知识点、实战技巧存好,需要时直接查、随时用
💬 【评论】分享你的经验或疑问(比如曾踩过的技术坑?),一起交流避坑
🗳️ 【投票】用你的选择助力社区内容方向,告诉大家哪个技术点最该重点拆解
技术之路难免有困惑,但同行的人会让前进更有方向~愿我们都能在自己专注的领域里,一步步靠近心中的技术目标!

结语:进程优先级和切换是 Linux 多任务调度的基础,理解它们的原理和操作,能帮你在实际开发中优化系统性能 ------ 让核心任务优先执行,减少不必要的切换开销。

✨把这些内容吃透超牛的!放松下吧✨ ʕ˘ᴥ˘ʔ づきらど

相关推荐
人工智能训练1 小时前
【极速部署】Ubuntu24.04+CUDA13.0 玩转 VLLM 0.15.0:预编译 Wheel 包 GPU 版安装全攻略
运维·前端·人工智能·python·ai编程·cuda·vllm
_F_y2 小时前
MySQL用C/C++连接
c语言·c++·mysql
源于花海2 小时前
迁移学习相关的期刊和会议
人工智能·机器学习·迁移学习·期刊会议
兩尛2 小时前
c++知识点2
开发语言·c++
xiaoye-duck3 小时前
C++ string 底层原理深度解析 + 模拟实现(下)——面试 / 开发都适用
开发语言·c++·stl
微露清风3 小时前
系统性学习Linux-第二讲-基础开发工具
linux·运维·学习
Azure_withyou3 小时前
Visual Studio中try catch()还未执行,throw后便报错
c++·visual studio
琉染云月3 小时前
【C++入门练习软件推荐】Visual Studio下载与安装(以Visual Studio2026为例)
c++·visual studio
不会代码的小猴3 小时前
Linux环境编程第六天笔记--system-V IPC
linux·笔记
阳光九叶草LXGZXJ3 小时前
达梦数据库-学习-48-DmDrs控制台命令(同步之Manager、CPT模块)
linux·运维·数据库·sql·学习