强制 Intel Core i7 CPU 暂时休眠?

Force Intel Core i7 CPU to sleep momentarily?

我想让我的 Core i7 CPU 从批处理文件或可执行文件中暂时进入睡眠状态一毫秒左右。

我知道 SetSuspendState 可以诱导睡眠,但我正在寻找一种不会让整个系统进入睡眠状态的解决方案,而只是 CPU暂时。

CPU是酷睿i7 3632QM,OS是Windows7和10。 谢谢

根据您关于每 30 分钟克服某种关机的评论,听起来您需要整个 CPU(所有核心)休眠 。我们需要更多的细节来做更多的事情,而不是猜测哪些睡眠状态可以满足您的目的,哪些不会。

根据评论,可能需要 ACPI S3 睡眠。罗斯关于支持 S1 睡眠的硬件的评论没有提到 S2(CPU 实际上断电),所以可能甚至不可能断电 只是 CPU.

所以最好的办法是研究 以编程方式执行 sleep/wake 循环 ,这 至少在某些情况下是可能的硬件。在 Linux 上,rtcwake command 有一个选项可以做到这一点。我假设它在启动睡眠之前将唤醒时间编程到 BIOS 的 NVRAM 中。 (我认为只有几个常用的 formats/locations 用于存储它,所以很有可能它可以在您的计算机上使用。)

尝试 google 搜索 wake up laptop at a certain time 或其他搜索 Windows 等同于 rtcwake 的内容。我没有看任何热门歌曲,但它们看起来很有希望。


我不是系统电源状态管理方面的专家,但您可能需要系统进入 an ACPI sleep state。 S3是通常的"suspend to RAM"; OS支持挂起的系统通常将其用作非休眠选项。

为了您的使用,也许 S1 或 S2 会做(以及比这少的任何东西,比如 CPU power-saving C-states 可能 不会 就足够了,尤其是不是那些仅每个核心)。

ACPI global sleep states (from Wikipedia)。系统不需要实现所有级别。

  • S1,Power on Suspend (POS):处理器缓存被刷新,CPU(s) 停止执行指令。 CPU(s) 和 RAM 的电源保持不变。未指示必须保持开启状态的设备可能会关闭电源。
  • S2: CPU 关机。脏缓存被刷新到 RAM。
  • S3,通常称为待机、睡眠或暂停到 RAM (STR):RAM 保持供电。 (但是硬盘驱动器和其他所有东西都断电了)
  • S4,休眠

我不会尝试编写 Windows API 函数调用来执行此操作。如果有程序请求 Windows 进入 S1 或 S2 状态(最好是某种触发唤醒),我不会感到惊讶。

@RossRidge 说 HM70 芯片组确实实现了 S1 睡眠(并暗示它不支持 S2 睡眠。)由于 S1 不会关闭 CPU,它可能不会重置定时器.即使是假设的 S2 睡眠也可能无法解决问题,因为计时器可能在 BIOS.

管理的 CPU and/or 外部

存在可对 BIOS 进行编程以在特定时间唤醒的软件。这是触发退出挂起的一种可能方式。 因此可以编写一个脚本,在未来 2 秒内编程唤醒时间,然后启动睡眠。


@MargaretBloom 评论说英特尔手册第 14 章列举了所有电源管理功能。 (参见 tag wiki for links). Also that a totally different workaround may be possible, by using SMM.


回复:你的 your followup question 被否决了:

enter sleep state just momentarily, for one millisecond

1ms大约是300万个内核时钟周期。这对计算机来说不是瞬间的,尤其是从 asm 编程的角度来看。

你肯定不想手写汇编来进入这些状态。相反,请使用 OS 的现有 ACPI 接口。这是每个人都反对 your followup question.

废话的很大一部分原因

除了来自 mwait, pause, and hlt insns, the OS needs to know what's going on. For more about pause, 的短每核睡眠之外。无论如何,没有具体的说明可以进入更深的睡眠;您通过写入 MMIO space.

中的设备寄存器来编程 ACPI

当所有内核同时被 HLT 时,整个 CPU 可以机会性地关闭更多的东西,直到下一个定时器或其他中断再次唤醒它(这或至少与 ACPI C 有关-状态,据我了解)。但这在正常操作期间一直发生,因为现代 OSes 运行 HLT 在空闲的核心上。您在这里可以做的唯一有趣的事情是偶尔让 CPU 像这样休眠,即使系统正在 运行 宁一些 CPU 密集型进程。 (例如,一些具有非空闲优先级的线程在循环中 运行 hlt)。由于 HLT 是特权指令,因此这需要内核线程或系统调用。您可能实际上无法提高系统空闲进程的优先级,因此它会从其他 运行 可用进程中窃取时间。

这可能过于简单化了:我最近没有查看内核空闲任务,看看它们是否仍然只是 运行 HLT 当它们希望当前内核休眠直到下一个中​​断时。有一段时间(当 CPU 电源管理处于起步阶段时)空闲循环用于 运行 其他一些东西以进入低功耗 C 状态。但是 HLT 现在可以这样做了。