Linux 学习笔记(十六):进程的调度与优先级——谁先抢到 CPU?

一、 进程优先级:PRI 与 NI

在 Linux 中,CPU 资源是宝贵的,进程之间具有竞争性。为了决定谁先执行,引入了优先级(PRI)。

  • PRI (Priority):进程被 CPU 执行的优先级,值越小,越早执行。

  • NI (Nice) :进程优先级的修正数值。取值范围是 -20 到 19。

    关系公式:PRI(new) = PRI(old) + NI 。

    Nice 值就像它的名字一样,值越大,越"友善",越容易把 CPU 让给别人;值越小(负数),越"霸道"。默认 NI 为 0。

二、 并行 (Parallel) 与 并发 (Concurrent)

  • 并发 :多个进程在一个 CPU 下交替运行。宏观上是同时,微观上是排队切换。

  • 并行 :多个进程在多个 CPU (核心)下同时独立运行。

    (可以想象成:一家咖啡店只有一台机器(并发),有两台机器(并行))。

三、 上下文切换 (Context Switch)

当 CPU 从一个进程切到另一个进程时,操作系统必须保存当前进程的寄存器状态(比如程序计数器),并存入它的 PCB(task_struct)中。下次再切回来时,再恢复这些数据。这一过程叫上下文切换。由于切换需要花费时间,所以频繁切换会降低系统性能。

四、 实战:查看与修改优先级

bash 复制代码
# 1. 启动一个后台测试进程
ping www.baidu.com > /dev/null &

# 2. 使用 ps -l 查看其 PRI 和 NI
ps -l

# 3. 使用 renice 调大 NI 值(降低优先级)
sudo renice 10 -p <PID>

# 4. 直接在启动时指定 nice 值 (需要 root 权限,这里设为 -5)
sudo nice -n -5 top

总结

进程调度是操作系统的核心功能之一。理解 NI 值的作用,不仅能帮我们在运维时优化系统性能(把不重要的后台任务 NI 调大),也是面试中经常考察的基本功。

自我实战操作

实战 1:查看优先级
bash 复制代码
# 1. 随便运行一个死循环程序,比如 top 或者一直 ping
ping www.baidu.com > /dev/null &

# 2. 找到它的 PID 和 PRI/NI
ps -l
# 观察输出:PID、PRI(通常是 80 或 60)、NI(通常是 0)
实战 2:修改优先级
bash 复制代码
# 1. 用 renice 命令给 PID 为 xxxx 的进程增加 10 的 nice 值
# (xxxx 换成你刚才 ping 的 PID)
sudo renice 10 -p xxxx

# 2. 再次查看,你会发现 NI 变成 10,PRI 变大了
ps -l
实战 3:直接启动一个高优先级进程(需要 root)
bash 复制代码
# 启动一个 top 进程,并且直接给它 nice 值 -5 (变霸道)
sudo nice -n -5 top
相关推荐
fengci.18 分钟前
CTF2MISC中等部分
开发语言·前端·学习
StarsGreen1 小时前
libva在intel平台上的前端流程简介
linux
YueTann2 小时前
mgtv5th-baseline学习
学习
蒸蒸yyyyzwd4 小时前
从后端面经学到的 3 个知识
笔记·学习
17岁的勇气4 小时前
Unity Shader unity文档学习笔记(二十二):shader变体
笔记·学习·unity
坤坤子吖4 小时前
Linux网络编程:自定义应用层协议与 JSON 序列化
linux·服务器·网络·c++·笔记·json
Felven6 小时前
华为鲲鹏920s芯片serdestool工具使用说明
linux·运维·服务器·华为·鲲鹏920·serdestool
路灯上の马陈6 小时前
Java 内部类 学习笔记
笔记·学习
莫晓燚6 小时前
mall 电商项目完整部署---实战
linux·运维·docker·容器
咋的啥名都用不了呢~6 小时前
Linux项目部署5(安装Nginx的插件)
linux