Linux 的进程调度(Process Scheduling)决定了哪个进程在什么时间、使用哪个 CPU 运行,目标是:
下面从 整体架构 → 调度类 → 调度策略 → 调度时机 → CFS 原理 → 实时调度 → 多核 逐步说明。
Linux 调度是**分层 + 调度类(scheduler class)**的设计:
任务
└─ 调度类(scheduler class)
├─ stop_sched_class (最高优先级,用于 CPU 停止)
├─ dl_sched_class (SCHED_DEADLINE)
├─ rt_sched_class (SCHED_FIFO / SCHED_RR)
├─ fair_sched_class (SCHED_NORMAL / SCHED_BATCH,CFS)
└─ idle_sched_class (空闲任务)
调度器按优先级从高到低选择调度类:
高优先级调度类有任务 → 绝不会跑低优先级调度类
用户态通过 sched_setscheduler() 设置:
| 调度类 | 策略 | 说明 |
|---|---|---|
| 实时 | SCHED_FIFO |
先进先出,无时间片 |
| 实时 | SCHED_RR |
时间片轮转 |
| 普通 | SCHED_NORMAL |
普通进程(CFS) |
| 普通 | SCHED_BATCH |
批处理,少交互 |
| 普通 | SCHED_IDLE |
极低优先级 |
| deadline | SCHED_DEADLINE |
硬实时,基于截止时间 |
schedule()sleep()、wait()、IO 阻塞tick)SCHED_NORMAL 使用 CFS(Completely Fair Scheduler)
让所有进程“公平”地消耗 CPU 时间
vruntimevruntime 排序调度时:
1. 选红黑树最左节点
2. 运行该进程
3. 更新 vruntime
4. 时间片用尽或抢占 → 重新调度
nice 范围:-20 ~ 190nice 越小 → 优先级越高 → 权重越大nice -n -10 ./app
renice -n 5 -p 1234
⚠️ 实时进程优先级 高于所有普通进程
基于 EAR(Earliest Deadline First)
参数:
runtime // 运行时间
deadline // 截止时间
period // 周期
适用于:
taskset)taskset -c 0,1 ./app
ps -eo pid,comm,pri,ni,stat,rtprio
top
htop
cat /proc/<pid>/sched
Linux 进程调度通过分层调度类 + CFS 公平调度 + 实时调度支持,在公平性和实时性之间取得平衡,由时钟中断、阻塞和唤醒触发调度。
如果你愿意,我可以进一步讲: