温馨提示×

linux进程调度是什么

小樊
42
2026-10-18 06:04:31
栏目: 智能运维

Linux 进程调度(Process Scheduling) 是指 Linux 内核决定哪个进程在什么时候、使用哪个 CPU 核心运行 的机制。它的核心目标是:公平、高效、及时地分配 CPU 时间。

下面从几个层面给你讲清楚。


一、为什么需要进程调度?

计算机通常 CPU 数量远少于进程数量,比如:

  • 4 核 CPU
  • 同时运行几百个进程

所以需要:

  • 让多个进程“看起来”同时运行(时间片轮转)
  • 保证重要任务优先执行
  • 避免某个进程霸占 CPU

二、进程调度的基本概念

1. 进程状态

Linux 中常见进程状态:

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

只有 可运行进程 才会参与调度。


2. 时间片(Time Slice)

  • 每个进程运行一小段时间(时间片)
  • 时间片用完或主动让出 CPU → 发生 上下文切换

3. 上下文切换(Context Switch)

保存当前进程状态(寄存器、程序计数器等),加载下一个进程状态。


三、Linux 调度器的发展

1. O(n) 调度器(早期)

  • 遍历所有进程
  • 效率低

2. O(1) 调度器

  • 常量时间调度
  • 引入优先级队列

3. CFS(Completely Fair Scheduler,完全公平调度器)✅

目前主流(2.6.23+)

核心思想:

  • 每个进程有一个 虚拟运行时间(vruntime)
  • 调度器总是选择 vruntime 最小 的进程
  • 保证“公平”

四、CFS 调度核心机制

1. 优先级与权重

  • 普通进程:nice 值(-20 ~ 19)
  • nice 越小 → 权重越大 → 获得 CPU 越多

2. 红黑树

  • 可运行进程按 vruntime 排序
  • 最左节点 = 下一个运行进程

3. 调度类(Scheduling Class)

Linux 支持多种调度策略:

调度类 说明
SCHED_NORMAL 普通进程(CFS)
SCHED_BATCH 批处理
SCHED_IDLE 极低优先级
SCHED_FIFO 实时,先到先运行
SCHED_RR 实时,轮转

五、调度触发时机

  1. 时间片用完(时钟中断)
  2. 进程主动睡眠(如 sleep、read)
  3. 更高优先级进程就绪
  4. 进程退出

六、简单示例

# 查看进程调度策略
ps -eo pid,comm,pri,ni,stat

# 修改进程优先级
nice -n -5 ./app
renice -n 5 -p 1234

七、一句话总结

Linux 进程调度就是内核按照调度策略,在多个进程中公平、实时、高效地分配 CPU 使用权的机制,现代 Linux 主要使用 CFS 调度器。

如果你愿意,我也可以讲:

  • CFS 的源码级流程
  • 实时进程调度
  • 多核 CPU 调度(负载均衡)
  • 容器(Docker)中的调度

你想深入哪一块?

0 踩