【Linux】进程优先级

Linux 进程优先级详解(2025 最新面试必备)

Linux 进程优先级决定 CPU 资源分配,是操作系统调度核心。面试中常被问到 nice、renice、优先级范围、实时进程、CPU 亲和性等。下面系统梳理所有知识点,一次性讲透。

1. 两个优先级概念(面试必区分)

概念取值范围含义谁能设置典型命令
nice 值(普通优先级)-20 ~ +19值越小,优先级越高(-20 最高,19 最低)普通用户可调高自己进程的 nice(降低自己优先级),root 可任意调整nice, renice
实时优先级(Real-Time Priority)1 ~ 99值越大,优先级越高(99 最高)必须 root + SCHED_FIFO / SCHED_RR 调度策略chrt

记住口诀:

  • nice 值:负贵正贱(-20 最“贵”,19 最“贱”)
  • 实时优先级:越大越狠(99 最强)

2. 查看进程优先级

# 查看 nice 值(NI 列)
ps -eo pid,ppid,user,nice,pri,comm,cmd | grep java

# 查看实时优先级(需要 chrt)
chrt -p <pid>

# 综合查看(top/htop 交互式)
top                 # 按 Shift+P 按 PRI 排序,按 Shift+N 按 NI 排序
htop                # F2 → Columns → 加 NI 和 PRI 列

top 中两列含义:

  • PRI:最终调度优先级(内核内部值),普通进程通常是 0~139
  • NI:用户态 nice 值(-20~19)

3. 修改进程优先级(高频面试操作)

# 1. 启动时直接指定 nice(推荐)
nice -n 10 java -jar app.jar        # nice=10(降低优先级)
nice -n -15 ./stress --cpu 8        # nice=-15(提高,需要 root)

# 2. 运行中调整 nice
renice 15 -p 12345                  # 把 pid=12345 的 nice 改成 15
renice -10 -u tom                   # 把用户 tom 的所有进程 nice 调高

# 3. 修改实时进程优先级(必须 root)
chrt -r -p 50 12345                 # 设置为实时 RR 策略,优先级 50
chrt -f -p 99 12345                 # 设置为 FIFO 实时,优先级 99(极危险!)

调度策略对照表(chrt 使用):

策略命令说明
SCHED_OTHER(默认)chrt -o普通分时调度,受 nice 影响
SCHED_FIFOchrt -f实时先到先得,可抢占
SCHED_RRchrt -r实时轮转(同优先级内时间片轮转)
SCHED_BATCHchrt -b批量处理,nice 影响更大
SCHED_IDLEchrt -i极低优先级,CPU 空闲时才跑

4. 真实调度优先级计算公式(面试可写)

最终优先级(PRI) = 120 + nice 值 + 20(普通进程)

  • nice = -20 → PRI = 100(最高)
  • nice = 0 → PRI = 120
  • nice = 19 → PRI = 139(最低)

实时进程 PRI = 实时优先级(1~99),永远高于普通进程!

5. 典型面试题 & 标准答案

  1. 普通用户能把进程 nice 调成 -20 吗?
    不能。普通用户只能调高 nice 值(降低自己优先级),不能调负值。
    只能 root 用 renice -n -20 -p pidnice -n -20 启动。
  2. nice 值 -20 和 19 实际性能差距有多大?
    理论上相差 39 级,CPU 分配比例约 1:10~1:20(取决于 CFS 调度器权重表),实际差距非常明显。
  3. 如何让一个关键 Java 服务永远不被抢占 CPU?
   chrt -f -p 50 $(pgrep java)    # 实时优先级 50
   taskset -c 0-3 <pid>           # 再绑定到专用核心
  1. 生产环境能随便用实时进程吗?
    绝对不行!实时进程会饿死普通进程,导致系统卡死(软锁死)。除非音频、工业控制等硬实时场景。
  2. 如何防止重要后台任务被“饿死”?
  • 给它一个较低的 nice 值(比如 -5)
  • 使用 ionice 提升 IO 优先级
  • 用 cgroup 限制其他进程资源
# 提升 IO 优先级(防止被高 IO 任务拖死)
ionice -c 1 -n 0 -p 12345        # 实时 IO 优先级(最高)
ionice -c 2 -n 0 mysqld          # Best-effort 最高级

6. 一句话总结(背下来面试必加分)

“Linux 进程优先级分普通(nice -20~19,值越小越高)和实时(1~99,值越大越高)两套体系。普通用户只能调高自己进程的 nice,实时进程必须 root 且极度危险。生产环境调优首选 nice + ionice + cgroup,慎用实时调度。”

掌握以上内容,京东、阿里、字节、华为等大厂 Linux 进程优先级相关问题基本无压力!

文章已创建 2732

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部