一、概述
Linux 内核进程调度、CpuIdle、CpuFreq、Thermal管理四层逻辑,从上到下:
- 进程调度:CPU 忙,谁先跑(时间片、优先级)
- CPUFreq:CPU 忙,跑多快(P-state 调频调压)
- Thermal:太热了,怎么降速温控(功耗限制、节流)
- CPUIdle:CPU 闲,怎么睡(C-state 休眠)
其中,CPUFreq,Thermal和CPUIdle的架构相似: | | |
|---|
| | CFS、SCHED_FIFO、RR、DEADLINE |
| | schedutil、ondemand、performance、powersave |
| | IPA(power_allocator)、step_wise、bang_bang |
| | |
2.1 进程调度器(Linux 主线程调度,SCHED_*) | | | | |
|---|
CFSSCHED_OTHER | Completely Fair Scheduler | Red-Black Tree 虚拟时钟 vruntime、按需时间片 | | |
| SCHED_RR | | | | |
| SCHED_FIFO | | | | |
| SCHED_BATCH | | | | |
| SCHED_IDLE | | | | |
| SCHED_DEADLINE | | | | |
2.2 CPUFreq Governor(运行时调频 P-state,忙时调速) | | | |
|---|
| performance | | | |
| powersave | | | |
| ondemand | | | |
| conservative | | | |
| userspace | | | |
| schedutil | | | Linux4.7+ 通用默认 |
2.3 Thermal Governor(温控功耗节流,过热降频)
| | | |
|---|
| step_wise | | | |
| bang_bang | | | |
| power_allocator(IPA) | | | |
| fair_share | | | |
| user_space | | | |
2.4 CPUIdle Governor(空闲休眠 C-state,闲时睡眠)
| | | |
|---|
| ladder | | | |
| menu | 预测下一次 timer 间隔、择优选 C-state | | |
| TEO | Timer Events Oriented,精准事件预测 | | 新版 Intel/AMD、ARM64、Android |
| haltpoll | | | |
三、工作流程
3.1 从上到下逻辑流程图
【硬件中断/定时器】 ↓┌─────────────────────────────────────┐│ 1. 进程调度层 Scheduler ││ CFS / SCHED_FIFO / RR / DEADLINE ││ 核心:选择下一个运行的task │└───────┬─────────────────────────────┘ │ ↓ 有任务可运行 │┌─────────────────────────────────────┐│ 2. CPUFreq 运行时调频 (P-state) ││ Governor: schedutil / ondemand… ││ 根据CPU利用率 设置运行频率电压 │└───────┬─────────────────────────────┘ │ ↓ 执行用户态/内核态任务 │┌─────────────────────────────────────┐│ 3. Thermal 温控子系统 (全局兜底) ││ Governor: IPA / step_wise ... ││ 温度超标 → 强制下压CPUFreq、节流 │└───────┬─────────────────────────────┘ │ └─无任务可运行 → 进入Idle路径 ↓┌─────────────────────────────────────┐│ 4. CPUIdle 空闲休眠 (C-state) ││ 调度器idle thread ││ Governor: menu / TEO / haltpoll ││ 选择休眠深度 → WFI / MWAIT 硬件休眠 │└───────┬─────────────────────────────┘ │ ↓ 中断到来唤醒CPU回到最上层【进程调度】
3.2. 内核源码调用链路
- 调度入口
schedule() → __schedule()
- CFS 挑选 next task,计算 vruntime
schedutil_freq_util():读取调度器 CPU 利用率- cpufreq core -> 底层 driver (intel_pstate、cpufreq-dt) 改写 P-state
- 温度触 trip 点 → 直接下发 max_freq 限制给 cpufreq
__schedule() → idle_task() → cpuidle_idle_call() → governor select(menu/TEO) → driver enter C-state(WFI/MWAIT)