何时休眠
当CPU没事可做的时候,软件层面采用的做法通常是:执行一个idle任务,这个idle任务是系统中优先级最低的,里面一般就是一个无限循环。但它还是会消耗能量,这实在有点不划算,对于移动设备更是浪费宝贵的电池资源,但是idle任务又必须执行,系统不能处在一个没有任何任务运行的状态。
功耗模式 - 睡眠深度
为此,CPU的设计者在硬件层面提供了不同的运行模式,以Intel的芯片为例(同时也是ACPI 的spec定义),包括了P-state和C-state。
在C-state的划分中,C0为正常工作模式,其他的"C1 ~ Cn"为休眠模式,这样CPU在无事可做时,就不用靠执行一些useless的指令来维持运行(软件idle),idle时进入休眠模式即可(称为"cpuidle",或硬件/physical idle,对应的内核配置选项是"CONFIG_CPU_IDLE")。
有的休眠态是关闭部分时钟/电源(浅睡),有的是全部关闭(深睡),以供软件根据不同的场景选择。
休眠模式是存在代价的:进入和退出需要花费时间,退出恢复到正常状态的latency会影响对任务的响应,而且,进入和退出的过程本身也会损失一定的功耗(实际的"Entry"和"Exit"的功耗甚至可能短暂超过正常运行时的功耗)。

"n"值越大,睡眠程度越深,功耗节省越多,但恢复时间也越长。如果睡眠时间比较短,功耗没节省多少,时延又长,就很不合算。

基本概念
在Linux中,描述C-state的是"cpuidle_state"结构体。一个SMP系统有多个CPU,一个CPU有多种休眠态,这形成了一个二维的矩阵,"cpuidle_state"就是此矩阵的纵向元素。
struct cpuidle_state {
// 在sysfs中可见
char name[16];
char desc[32];
int power_usage; /* 以mW计 */
unsigned int exit_latency; /* 以us计 */
unsigned int target_residency; /* 以us计 */int (*enter) (...);
};
文章转载自术道经纬,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




