当前位置:首页>Linux>Linux Scheduler、CpuFreq、CpuIdle、Thermal管理一网打尽

Linux Scheduler、CpuFreq、CpuIdle、Thermal管理一网打尽

  • 2026-09-08 12:32:21
Linux Scheduler、CpuFreq、CpuIdle、Thermal管理一网打尽

一、概述

Linux 内核进程调度、CpuIdle、CpuFreq、Thermal管理四层逻辑,从上到下:

  1. 进程调度:CPU 忙,谁先跑(时间片、优先级)
  2. CPUFreq:CPU 忙,跑多快(P-state 调频调压)
  3. Thermal:太热了,怎么降速温控(功耗限制、节流)
  4. CPUIdle:CPU 闲,怎么睡(C-state 休眠)
其中,CPUFreq,Thermal和CPUIdle的架构相似:
在策略选择方面总结如下:
子系统
作用
主流 Governor / 策略
进程调度
选任务
CFS、SCHED_FIFO、RR、DEADLINE
CPUFreq(P-state)
运行调频
schedutil、ondemand、performance、powersave
Thermal 温控
过热限流
IPA(power_allocator)、step_wise、bang_bang
CPUIdle(C-state)
空闲休眠
menu、TEO、ladder、haltpoll
二、策略细节
2.1 进程调度器(Linux 主线程调度,SCHED_*)
调度策略
全称
核心机制
适用场景
特点
CFSSCHED_OTHER
Completely Fair Scheduler
Red-Black Tree 虚拟时钟 vruntime、按需时间片
普通用户进程、后台服务
默认、分时、公平抢占、延迟低
SCHED_RR
Round-Robin
实时、固定时间片轮转
软实时业务
优先级固定、时间片轮换
SCHED_FIFO
FIFO 实时
先来先执行,不主动释放就一直占 CPU
硬实时低吞吐任务
无时间片、高抢占
SCHED_BATCH
批量调度
CFS 改造、降低抢占、减少 tick
后台批量计算、编译
低交互、高吞吐
SCHED_IDLE
空闲调度
极低优先级 CFS
系统闲置后台任务
只有 CPU 空闲才跑
SCHED_DEADLINE
限期实时
EDF 最早截止时间优先
工业硬实时
精准带宽预留
2.2 CPUFreq Governor(运行时调频 P-state,忙时调速)
Governor
机制
调频触发
使用场景
performance
锁最高频率
不调频
高性能、压力测试
powersave
锁最低频率
不调频
待机省电
ondemand
采样负载、阈值陡升
周期性采样 CPU 占用
老内核传统方案,已淘汰
conservative
负载渐进升降频
缓慢调节
嵌入式、防止频率抖动
userspace
用户态手动设置
应用写入频率
定制调试
schedutil
CFS 调度器直接提供利用率
每 tick 实时计算
Linux4.7+ 通用默认
,桌面 / 服务器 / ARM64

2.3 Thermal Governor(温控功耗节流,过热降频)

Governor
原理
控制对象
场景
step_wise
阶梯式逐档降频,开环控制
CPU/GPU 冷却设备
老旧平台、嵌入式
bang_bang
阈值开关控制 ON/OFF
风扇简单启停
PC 风扇温控
power_allocator(IPA)
PID 闭环功耗分配
多设备功耗分摊
ARM 手机、服务器、现代 SOC
fair_share
多设备均分降温压力
多 cooling device
多热源均衡散热
user_space
内核上报、用户态决策
全自定义
安卓厂商定制温控

2.4 CPUIdle Governor(空闲休眠 C-state,闲时睡眠)

Governor
核心逻辑
特点
适用平台
ladder
阶梯逐级加深休眠
简单老旧、逐档递进
老旧嵌入式、古董内核
menu
预测下一次 timer 间隔、择优选 C-state
经典、兼容性强
传统 x86 服务器默认
TEO
Timer Events Oriented,精准事件预测
延迟更低、算法更优
新版 Intel/AMD、ARM64、Android
haltpoll
虚拟机 poll 轮询规避 VMEXIT
减少虚拟机退出开销
KVM Guest 虚拟机专用

三、工作流程

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. 内核源码调用链路

  1. 调度入口schedule() → __schedule()
  • CFS 挑选 next task,计算 vruntime
  • 决定谁上 CPU
  1. 运行时调频 (cpufreq)
  • schedutil_freq_util():读取调度器 CPU 利用率
  • cpufreq core -> 底层 driver (intel_pstate、cpufreq-dt) 改写 P-state
  1. 温度限制 (thermal) 随时拦截
  • thermal core 轮询温度
  • 温度触 trip 点 → 直接下发 max_freq 限制给 cpufreq
  • 优先级高于普通调频策略
  1. 无任务进入 cpuidle
__schedule()    → idle_task()        → cpuidle_idle_call()            → governor select(menu/TEO)            → driver enter C-state(WFI/MWAIT)

最新文章

随机文章