我正在查看 Linux 电源管理文件,我对 C 和 S 状态感到困惑。
- C 状态在 中定义
/sys/devices/system/cpux/cpuidle/
。据我了解,它们用于根据空闲级别将 CPU 置于不同的睡眠状态。 - S 状态接口处于状态
/sys/power/state
,我可以看到不同的睡眠状态,如冻结、待机、内存等。如果我阅读他们的描述,他们正在尝试完成与 C 状态尝试做的相同的事情。
这引出了我的问题:它们之间有什么区别?如果我想防止我的系统进入空闲状态,我应该设置哪些参数。我设置了 C 状态的禁用参数,/sys/devices/system/cpux/cpuidle/
但我仍然可以观察到我的手机进入空闲状态(用于systrace
观察)。
答案1
S 状态是全球 ACPI 状态:它们描述了整个系统的电源状态。这种类型的状态更改通常是用户请求的或至少是用户可配置的(例如超时、低电量待机等)。
C 状态是处理器状态:它们描述了单个 CPU 包(甚至核心)的电源状态。这种类型的状态更改通常是自动的,并且不会影响系统的整体状态:CPU 可以进入睡眠状态并重新唤醒,而不涉及系统的其余部分。
我不确定禁用 C 状态转换在大多数情况下(尤其是在手机上)是否有用;您可能正在禁用 S 状态转换。 “空闲”状态是在软件中实现而不是官方的 ACPI 状态,因此您找不到对此的硬件控制。 S 状态转换是由软件控制的,因此例如在 systemd 控制的系统上,你会禁用那里的睡眠;我不知道如何禁用手机上的睡眠状态。
答案2
如果你有冻结、待机等功能,这些几乎都是手动命令。笔记本电脑(可以)连接到盖子的关闭,这最终也是一种自愿行为。
echo mem > /sys/power/state
这就是我如何立即将我的系统(迷你电脑,无盖)连接至 S3。瓦特从 3.5 变为 1.2。 (断电后功耗仍为 0.7W)使用默认 xorg 超时软睡眠时功耗为 2.5W。这必须是 S1 或 S2。
]# cat /sys/power/mem_sleep
s2idle [deep]
这是为了控制你想要什么样的睡眠。
但是发行版/内核必须支持您的硬件,而这并不那么容易。一旦我的发行版上有了“echo mem”,我很快就不再玩了。 (我不知道手机)。我什至选择了那个发行版,因为这样的东西效果很好。
如果支持的话,S 状态就像用户命令,而不仅仅是随着时间或低能量发生的事情。
C 状态主要是 G0“工作”状态的 CPU 内部事物。多核CPU小心翼翼地放置一些核心到某种 C 状态,因此可以立即重新激活。 Wiki 链接中的定义有点暂定。看到“C10”提示,这不是Haswell的特长。这就是“现代”CPU 将低能耗和高性能结合起来的方式。
“suspend-to-ram” 就是一个很好的例子:CPU 会深度休眠,系统完全关闭,除了特殊的最小 RAM keepalive 状态。如果 CPU 需要一瞬间才能恢复,那就没问题了。
但是,如果一个或多个内核由于系统负载较低(空闲,但正在运行的系统)而自动进入某种睡眠状态,则必须非常快速地重新激活它们。