一、 进程优先级: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