温馨提示×

linux进程调度怎么工作

小樊
41
2026-09-03 11:27:04
栏目: 智能运维

Linux 的进程调度(Process Scheduling)负责决定哪个进程在哪个 CPU 上运行、运行多久。下面从整体到细节讲清楚它是怎么工作的。


一、基本概念

1. 进程状态

Linux 中进程常见状态:

  • 运行(R):正在 CPU 或就绪队列中
  • 睡眠(S/D):等待资源(可中断 / 不可中断)
  • 停止(T)
  • 僵尸(Z)

只有 R 状态的进程会被调度。


2. 调度目标

  • 公平(CFS)
  • 低延迟(交互程序)
  • 高吞吐(批处理)
  • 实时性(RT 任务)

二、调度器演进

版本 调度器
2.4 O(n) 调度器
2.6 早期 O(1) 调度器
2.6.23+ CFS(Completely Fair Scheduler)
实时 RT / Deadline 调度类

三、核心模型:调度类(Scheduler Classes)

Linux 使用调度类分层

stop > deadline > rt > fair(CFS) > idle

每个 CPU 有独立运行队列(rq)。


四、CFS(完全公平调度,最核心)

1. 核心思想

让每个进程“公平”地使用 CPU 时间

不是时间片固定,而是:

  • 记录每个进程“虚拟运行时间” vruntime
  • vruntime 小,谁先跑

2. 红黑树(RB Tree)

  • 运行队列是一棵红黑树
  • 键值是 vruntime
  • 最左节点 = 下一个要运行的进程

3. 调度流程

  1. 时钟中断 / 系统调用
  2. 更新当前进程 vruntime
  3. 判断是否需抢占
  4. 选择 vruntime 最小的进程
  5. 上下文切换

4. 优先级与权重

  • nice 值:-20 ~ 19
  • 默认 nice = 0
  • nice 越小 → 权重越大 → 获得 CPU 越多

五、时间片怎么算?

CFS 没有固定时间片,而是:

  • 根据 进程数量
  • 根据 CPU 带宽(sched_latency)

例如:

  • 4 个进程 → 每个约 1/4 CPU 时间
  • 交互进程可短暂抢占

六、抢占(Preemption)

1. 自愿抢占

  • schedule()
  • 系统调用、IO 等待

2. 非自愿抢占

  • 时钟中断
  • need_resched 标志

七、实时调度(RT)

1. SCHED_FIFO

  • 同优先级不抢占
  • 一直跑直到退出 / 阻塞

2. SCHED_RR

  • 时间片轮转

3. SCHED_DEADLINE

  • 基于“最坏执行时间 + 周期”

八、多核调度

  • 每个 CPU 一个 rq
  • 支持:
    • 负载均衡
    • 任务迁移
    • NUMA 感知

九、简单示例

# 查看进程调度策略
chrt -p <pid>

# 设置实时优先级
chrt -f 50 <cmd>

# 调整 nice
nice -n -5 ./app

十、一句话总结

Linux 进程调度通过 CFS + 调度类 + 红黑树 + 抢占机制,在公平、延迟和实时性之间动态平衡。

如果你愿意,我也可以:

  • 画调度流程图
  • 讲内核源码路径
  • 对比 Windows / RTOS 调度
  • 结合具体场景(服务器 / 嵌入式)讲

你想深入哪一块?

0