进程优先级
获取某种资源的先后顺序,排队的本质就是确认优先级。
一、基本概念
cpu资源分配的先后顺序,就是指进程的优先权(priority)。- 优先权高的进程有优先执行权利。配置进程优先权对多任务环境的linux很有用,可以改善系统性能。
- 还可以把进程运行到指定的CPU上,这样一来,把不重要的进程安排到某个CPU,可以大大改善系统整
体性能。
二、为什么要有优先级?
1. 保障系统核心功能的稳定性
操作系统的核心进程(如内核进程、内存管理、硬件驱动) 是整个系统运行的基础,一旦它们被抢占资源或延迟执行,可能导致系统卡顿、崩溃甚至死机。
- 例 1:Windows 的 “System” 进程(管理硬件交互)、Linux 的 “systemd” 进程(初始化系统),优先级远高于普通应用 —— 即使你同时开着游戏、视频,这些核心进程也能优先获得 CPU 时间,确保硬件正常响应。
- 例 2:杀毒软件的 “实时防护进程”,需要优先监控文件操作(如防止病毒写入),若优先级过低,可能出现 “病毒已感染文件,防护进程才开始扫描” 的滞后问题,威胁系统安全。
简言之:优先级是 “保护系统底线” 的机制,确保关键进程不被 “非关键进程” 挤占资源。
2. 满足实时任务的响应需求
很多场景下,部分进程需要毫秒级甚至微秒级的响应(即 “实时性需求”),延迟会直接导致功能失效或损失。
- 工业场景:工厂的 “设备控制进程”(如控制机械臂精准定位),若优先级低,机械臂可能延迟动作,导致产品报废或设备碰撞。
- 消费场景:视频会议的 “音频编码进程”,需要优先处理麦克风输入 —— 若被后台下载进程抢占 CPU,会出现 “你说话 1 秒后,对方才听到” 的卡顿,影响沟通体验。
这类 “实时进程” 必须通过高优先级,确保调度器 “优先调用”,避免因资源等待产生延迟。
3. 优化用户交互体验
用户使用电脑时,当前正在操作的 “前台进程”(如正在编辑的 Word、正在玩的游戏) 是用户感知最直接的,若它们优先级低,会出现 “点击按钮没反应”“游戏掉帧” 等问题,严重影响体验。
- 反例:若后台 “文件备份进程” 与前台 “游戏进程” 优先级相同,备份会占用大量 CPU 和磁盘 IO,导致游戏帧率从 60 帧骤降到 20 帧,用户无法正常游玩。
- 正例:主流操作系统(Windows/macOS/Linux)都默认 “前台窗口进程优先级 + 1”—— 当你从浏览器切换到 Excel 时,Excel 的优先级会临时提升,确保你输入文字、点击按钮时 “即时响应”,而浏览器则降为后台优先级,仅维持基础刷新(如网页视频播放)。
优先级通过 “向用户当前关注的进程倾斜资源”,让系统行为更符合 “用户预期”,提升交互流畅度。
4. 提升资源分配效率
系统中存在大量 “低价值进程”(如后台下载、日志记录、自动同步),它们对 “实时性” 和 “交互性” 需求极低,即使延迟几分钟执行,也不会影响用户或系统。
- 例:云盘的 “后台同步进程”(如同步本地照片到云端),可以在 CPU 空闲时(如你没操作电脑时)再执行 —— 若它优先级过高,会在你工作时占用带宽和 CPU,导致网页加载慢、文档保存卡。
- 调度逻辑:操作系统的 “调度器” 会根据优先级分配 CPU 时间片(即 “CPU 给进程的执行时间”):高优先级进程获得更多、更长的时间片,低优先级进程则在 “高优先级进程空闲时” 再执行,避免资源被 “低价值任务” 浪费。
简言之:优先级是 “优化资源利用率” 的工具,让有限的 CPU / 内存,优先分配给 “价值更高” 的进程。
总结:进程优先级的本质
进程优先级的核心是 “按‘重要性’和‘需求’分配资源” —— 它不是 “歧视低优先级进程”,而是在 “资源有限” 的前提下,平衡三大目标:
- 保障系统核心稳定(关键进程不崩溃);
- 满足实时任务需求(紧急进程不延迟);
- 优化用户交互体验(前台进程不卡顿)。
没有优先级的调度,会变成 “所有进程平等竞争资源” 的 “无序状态”:系统可能因核心进程被挤占而崩溃,实时任务因延迟失效,用户操作因前台进程被抢占而卡顿 —— 这正是操作系统必须设计优先级的根本原因。
三、如何进优先级的设置

运行编译运行代码:
#include <stdio.h>
#include <unistd.h>
int main
{
while(1)
{
printf("我是一个进程,我的pid:%d,ppid:%d\n",getpid(),getppid());
sleep(1);
}
return 0;
}

ps ajx | head -1 && ps ajx | grep myprocess


-l在非root用户下不能查看到本用户的运行进程,使用-la即可

图中的PRI表示优先级。NI表示优先级的nice数据。
最终优先级 = pri(默认) + nice值。
nice 属于优先级的修正数据。
图中的UID表示当前进程的用户ID。例如我们使用whoami可以查看当前用户.
使用ls -ln 可以把能显示为数字的显示数字:

所以操作系统标识用户用的是UID,对比用户也用的是UID.
ps可以查看进程是哪个用户启动的。

进程的优先级:竞争的是CPU的资源。
1、使用top修改优先级

当进程运行起来,我们使用另一个终端进行修改,输入top再按R:



使用ps -al查看:

NI值变为19。
nice值的最高是19,PRI的数值变高了,说明它的优先级变低了。
再次修改发现不允许了。

所以我们还要切换到超级用户下进行修改:
sudo top:

查看:

nice最低值是-20。
nice的取值范围[-20,19] --> 40种优先级
PRI是60,为什么不是99 - 40 == 79呢?
这说明最终的PRI === pri(default 80) + nice
每次修改重置了最终的PRI。
验证一下,我们修改nice为10:

果然是90。
而进程的优先级范围是[60,99]。
2、通过nice/renice或chrt命令设置
Linux 中进程优先级通过 “nice 值” 和 “实时优先级” 区分,操作主要依赖命令行(图形界面工具如htop也可辅助)。
- 普通优先级(非实时):用
nice和renice
-
核心概念:nice 值范围为 -20(最高)~ 19(最低),默认值为 0。值越小,优先级越高(与直观感受相反)。
-
启动进程时设置优先级:用
nice命令,格式:nice -n [nice值] 进程命令例:以较高优先级(nice 值 - 5)启动浏览器:nice -n -5 firefox # 需root权限(因为nice值<0时需要管理员权限) -
调整已运行进程的优先级:用
renice命令,格式:renice [新nice值] -p [进程ID]例:将进程 ID 为 1234 的程序优先级调低(nice 值 10):renice 10 -p 1234 # 普通用户只能调高自己进程的nice值(降低优先级),调低需root权限
-
- 实时优先级:用
chrt命令
实时进程优先级高于所有普通进程,适合工业控制、音频处理等要求微秒级响应的场景,范围为 1~99(值越大优先级越高)。
-
启动实时进程:格式:
chrt -f [实时优先级] 进程命令(-f表示 “FIFO 调度策略”,实时调度常用)例:以实时优先级 50 启动某控制程序:sudo chrt -f 50 ./control_program # 必须root权限 -
调整已运行进程为实时优先级:格式:
chrt -f -p [实时优先级] [进程ID]例:将进程 ID 5678 的实时优先级设为 30:sudo chrt -f -p 30 5678
图形工具辅助(Linux):
- 打开
htop(需先安装:sudo apt install htop),找到进程后按r键,输入新的 nice 值即可调整。
四、为什么优先级在可控的范围内?
优先级的 “可控范围” 不是 “限制灵活性”,而是操作系统的 “自我保护和资源公平分配的底线”—— 它通过以下目标实现平衡:
- 保护系统稳定:不允许任何进程独占核心资源,确保内核和关键服务正常运行;
- 保障基本公平:避免低优先级进程彻底饥饿,让后台任务能正常完成;
- 防范权限滥用:通过权限绑定,阻止恶意程序或误操作破坏系统;
- 优化调度效率:简化调度逻辑,确保操作系统响应快速、运行高效。
没有可控范围的优先级,会让多进程环境陷入 “无序竞争”—— 要么系统崩溃,要么部分进程永远无法运行,这与操作系统 “高效、稳定、公平” 的核心目标完全相悖。
相关概念
- (资源稀缺)竞争性: 系统进程数目众多,而CPU资源只有少量,甚至1个,所以进程之间是具有竞争属性的。为了高效完成任务,更合理竞争相关资源,便具有了优先级
- 独立性: 多进程运行,需要独享各种资源,多进程运行期间互不干扰
- 并行: 多个进程在多个CPU下分别,同时进行运行,这称之为并行
- 并发: 多个进程在一个CPU下采用进程切换的方式,在一段时间之内,让多个进程都得以推进,称之为并发
部分进程永远无法运行,这与操作系统 “高效、稳定、公平” 的核心目标完全相悖。
1421

被折叠的 条评论
为什么被折叠?



