迫使英特尔酷睿i7 CPU暂时入睡?

时间:2016-01-02 10:22:25

标签: windows cpu sleep acpi

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

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

CPU是Core i7 3632QM,操作系统是Windows 7和10。 感谢

1 个答案:

答案 0 :(得分:7)

根据您关于每30分钟击败某种关闭的评论,听起来您需要整个CPU(所有核心)才能睡眠。我们需要更多的细节来做更多的事情,而不仅仅是猜测哪些睡眠状态能够满足你的目的,哪些能够胜任。

根据评论,可能需要ACPI S3睡眠。 Ross关于支持S1睡眠的硬件的评论并没有提到S2(CPU实际上已经断电),所以它可能甚至无法关闭只是 CPU。

所以你最好的办法是调查以编程方式执行睡眠/唤醒周期 至少在某些硬件上是可能的。在Linux上,rtcwake command可以选择执行此操作。我假设它在启动睡眠之前将唤醒时间编程到BIOS的NVRAM中。 (我认为只有少数常用的格式/位置用于存储它,因此很有可能在您的计算机上存储它。)

尝试使用Google搜索wake up laptop at a certain time 或其他内容来查找等效于rtcwake的Windows。我没看过任何一首歌,但看起来很有希望。

我不是这个系统电源状态管理的专家,但您可能需要系统输入an ACPI sleep state。 S3是通常的"暂停到RAM&#34 ;;支持挂起的操作系统通常将此作为非休眠选项使用。

对于你的使用,也许S1或S2会做(并且任何比这更小的东西,比如CPU power-saving C-states可能赢得就足够了,尤其不是那些只是芯)。

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

  • S1 ,开机挂起(POS):刷新处理器缓存,CPU停止执行指令。保持CPU和RAM的电源。未指示必须保持打开状态的设备可能已关闭。
  • S2 :CPU已关闭电源。脏缓存被刷新到RAM。
  • S3 ,通常称为待机,睡眠或挂起到RAM(STR):RAM保持通电状态。 (但硬盘驱动器和其他所有功能都断电)
  • S4 ,hibernate

我不会尝试编写Windows API函数调用来执行此操作。如果有一个程序要求Windows进入S1或S2状态(理想情况下会有某种触发唤醒),我不会感到惊讶。

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

存在将BIOS编程为在特定时间唤醒的软件。这是触发暂停的一种可能方式。因此,有可能编写一个脚本,在将来将唤醒时​​间编程为2秒,然后启动睡眠。

@MargaretBloom评论说,“英特尔手册”第14章列举了所有电源管理功能。 (有关链接,请参阅标记wiki)。此外,使用SMM可能会有完全不同的解决方法。

re:你的your followup question被遗忘:

  

暂时进入睡眠状态,持续1毫秒

1ms约为300万个核心时钟周期。对于计算机来说,这不是暂时的,特别是从asm编程的角度来看。

你绝对不想手工编写汇编来进入这些状态。而是使用您的操作系统现有的ACPI接口。这是因为每个人都对your followup question中的废话进行了低估。

除了来自mwaitpausehlt insns的短核心休眠时,操作系统需要知道发生了什么。有关pausesee this的更多信息。无论如何都没有具体的指令来进入更深的睡眠状态;您可以通过写入MMIO空间中的设备寄存器来编程ACPI。

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

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