实时进程始终压倒普通进程,二者分属独立优先级体系:实时进程优先级1~99(数值越大越高),由rt_priority固定设定;普通进程静态优先级100~139(数值越大越低),由nice值动态影响。

实时进程和普通进程的调度优先级不是简单地“谁数字小谁优先”,而是分属两套独立、互不干扰的优先级体系,且实时进程始终压倒普通进程。
实时进程优先级:静态、绝对、抢占式
实时进程使用 SCHED_FIFO 或 SCHED_RR 调度策略,其调度优先级范围是 1~99(数值越大,优先级越高),由 rt_priority 字段表示。这个值在创建时设定,内核不会动态调整——它不看进程是否休眠、是否I/O密集,只认这个固定数字。
- 只要有一个优先级为 50 的实时进程就绪,哪怕当前正在运行的是优先级为 49 的实时进程,也会立即被抢占
- 相同优先级下:FIFO 模式会一直执行直到主动让出CPU或阻塞;RR 模式则按时间片轮转
- 实时进程永远不参与普通进程的公平调度队列,它们在独立的实时队列中被管理
普通进程优先级:动态、相对、公平导向
普通进程(SCHED_NORMAL)靠 nice 值(-20~19) 影响其调度权重,最终映射为静态优先级 100~139(数值越大,优先级越低)。内核通过 CFS 调度器维护红黑树,以虚拟运行时间 vr = 实际运行时间 / 权重 为依据,保障长期公平性。
- nice 值每减1,静态优先级减1(例如 nice=-5 → static_prio=115),获得CPU份额略增
- 交互式进程可能被临时提升优先级(如唤醒时),而长时间占用CPU的进程会被动态降权
- 即使普通进程优先级设为100(最高),它也无法抢占任何实时进程——哪怕那个实时进程优先级只有1
优先级层级关系:三类进程严格排序
Linux 实际按调度类划分执行权限,优先级高低顺序是:限期进程(Deadline)>实时进程(RT)>普通进程(CFS)。限期进程优先级为 -1,用于硬实时场景,极少手动设置;实时进程默认占据 1~99;普通进程固定落在 100~139 区间。
- 调度器总是先扫描 deadline 队列,再扫描 rt 队列,最后才考虑 cfs 队列
- 普通进程的
prio字段通常等于normal_prio(即 120 + nice),但遇到优先级继承(如锁竞争)时会被临时抬高 - 实时进程的
rt_priority和普通进程的static_prio存储在不同字段,互不影响,也不做数值比较
实际操作中的关键点
用户空间调整需区分类型:对普通进程用 nice 和 renice;对实时进程必须用 chrt 并配合 root 权限,且需明确指定策略(FIFO/RR)和优先级数值。
-
chrt -f 50 ./my_rt_app启动 FIFO 实时进程,优先级 50 -
renice -10 1234将 PID 1234 的普通进程 nice 值设为 -10(静态优先级变为 110) - 非特权用户无法设置实时优先级,也无权降低已运行进程的 nice 值(只能调高)











