吃透 Linux 进程(二):系统进程——从排队原理到内核实现,一篇讲透
很多人刚学 Linux 进程时都会被 PRI、NI、nice、优先级数字越小越高等概念绕晕。其实优先级一点都不抽象 ——它就是资源不够时谁先上的排队规则。这篇文章用最通俗的话把「是什么、为什么、怎么办、怎么改」全部讲清楚结合内核 task_struct、O (1) 调度思想让你彻底吃透 Linux 进程优先级。一、进程优先级到底是什么一句话进程优先级 系统资源的「先后顺序」你可以把它理解成食堂打饭谁排前面谁先打医院看病急诊优先普通号靠后CPU 调度谁优先级高谁先拿到时间片运行优先级 vs 权限一定要分清优先级谁先执行顺序问题权限能不能执行资格问题举个例子你和班长都能打饭有权限但班长优先级高他先打顺序。进程也一样有权运行 ≠ 马上就能运行。二、为什么要有优先级答案很现实资源太少进程太多必须排队。进程争抢的核心资源CPU最核心磁盘 I/O显示器、键盘、网卡等设备如果不排优先级重要任务被拖慢系统卡顿、响应慢后台任务抢前台资源界面卡死所以优先级 公平 重要性分级。三、Linux 内核怎么表示优先级内核管理进程靠的就是task_structPCB。优先级直接存在这个结构体里task_struct - 优先级属性 - 几个 int 变量记住一条铁律优先级数字越小优先级越高四、最核心PRI 与 NIniceLinux 优先级不是一个数而是两部分组合PRI进程基础优先级默认 80值越小优先级越高NInice优先级的修正值相当于「插队 / 让道」的调整数最终公式最终优先级 PRI(旧/默认) nicenice 越小甚至负数→ 最终 PRI 越小 → 优先级越高nice 越大 → 最终 PRI 越大 → 优先级越低nice 取值范围plaintextnice ∈ [-20, 19]一共 40 个级别。五、为什么是 [-2019]这不是随便定的和 Linux 2.6O (1) 调度算法强相关普通进程优先级100 ~ 139139 - 100 39刚好 40 个等级nice -20 对应优先级 100最高nice 19 对应优先级 139最低所以[-2019] 是为了对齐内核调度表不多不少刚好 40 档。六、UID谁启动了这个进程你在ps -l里会看到 UID它和优先级密切相关UID用户 ID标识「这个进程是谁启动的」Linux 一切皆文件文件有权限、属主、属组进程操作文件必须知道「我是谁」才能判断权限简单说UID 管能不能优先级管谁先。七、进程优先级到底在竞争什么明确一点进程优先级竞争的核心是 → CPU 时间片分时操作系统Linux每个进程分一小段时间片优先级高 → 更容易先分到、多分一点O (1) 调度保证尽量公平又能优先重要任务八、怎么修改进程优先级先说结论不建议频繁改普通用户也没有权限乱改。操作系统会限制你防止破坏系统公平性。方法 1命令行最常用top进入 top 后按r输入进程 PID再输入 nice 值即可。方法 2代码层面系统调用#include sys/time.h #include sys/resource.h int getpriority(int which, int who); int setpriority(int which, int who, int prio);九、为什么不能随便改优先级系统追求公平分时调度O (1)设计目标就是尽量公平你乱改会破坏平衡。权限限制普通用户不能把 nice 设为负数提高优先级只有 root 可以。防止恶意占用若随便提高优先级后台程序可以抢满 CPU系统直接卡死。十、和 O (1) 调度的关系拔高理解Linux 2.6 内核的O (1) 调度器完全围绕优先级设计每个 CPU 一个运行队列 runqueue分活动队列、过期队列用 bitmap 快速找最高优先级进程时间复杂度严格 O (1)不随进程变多而变慢优先级在这里的作用决定进程在队列里的位置决定时间片用完后重新排队的顺序保证高优先级任务低延迟十一、一张表总结名词含义规则优先级资源获取先后顺序数字越小越优先PRI基础优先级默认 80NInice优先级修正值[-2019]最终公式实际优先级PRI(new) PRI niceUID进程执行者 ID管权限不管顺序竞争目标进程抢什么CPU 时间片O (1) 调度如何实现优先级双队列 bitmap 指针交换十二、结尾一句话进程优先级就是资源不够时的排队规则。内核用 PRInice 计算用 O (1) 调度执行数字越小越优先普通用户别乱改。