我想让我的Core i7 CPU暂时进入睡眠状态,从批处理文件或可执行文件开始大约一毫秒左右.
我知道可以使用SetSuspendState引入睡眠,但我正在寻找一种解决方案,它不会让整个系统进入睡眠状态,而只是瞬间处理CPU.
CPU是Core i7 3632QM,OS是Windows 7和10.谢谢
根据你关于每隔30分钟击败某种关机的评论,听起来你需要整个CPU(所有核心)才能入睡.我们需要更多的细节来做更多的事情而不是猜测哪些睡眠状态将为你的目的服务,哪些不会.
根据评论,可能需要ACPI S3睡眠.Ross关于支持S1睡眠的硬件的评论并未提及S2(CPU实际上已关闭),因此甚至可能无法仅关闭CPU.
所以,最好的办法是寻找到编程做一个睡眠/觉醒周期,这是可能的,至少一些硬件.在Linux上,该rtcwake
命令有一个选项可以执行此操作.我假设它在启动睡眠之前将唤醒时间编程到BIOS的NVRAM中.(我认为只有少数常用的格式/位置用于存储它,因此很有可能在您的计算机上存储它.)
尝试谷歌搜索wake up laptop at a certain time
或找到相当于Windows的东西rtcwake
.我没有看任何热门歌曲,但看起来很有希望.
我不是这个系统电源状态管理的专家,但你可能需要系统进入ACPI睡眠状态.S3是通常的"挂起RAM"; 支持挂起的操作系统通常将此作为非休眠选项使用.
对于您的使用,可能会使用S1或S2(并且除此之外的任何东西,如CPU节能C状态 可能还不够,尤其是不是仅为每核的状态).
ACPI全局睡眠状态(来自维基百科).系统不需要实现所有级别.
S1,Power on Suspend(POS):刷新处理器高速缓存,并且CPU停止执行指令.保持CPU和RAM的电源.未指示必须保持打开状态的设备可能已关闭.
S2:CPU断电.脏缓存被刷新到RAM.
S3,通常称为待机,休眠或挂起到RAM(STR):RAM保持供电状态. (但硬盘驱动器和其他所有功能都关闭)
S4,休眠
我不会尝试编写Windows API函数调用来执行此操作.如果有一个程序要求Windows进入S1或S2状态(理想情况下是某种触发唤醒),我不会感到惊讶.
@RossRidge说HM70芯片组确实实现了S1睡眠(并暗示它不支持S2睡眠.)由于S1不会关闭CPU,它可能不会重置定时器.即使是假设的S2睡眠也可能无法解决问题,因为定时器可能在CPU外部和/或由BIOS管理.
存在用于对BIOS进行编程以在特定时间唤醒的软件.这是触发暂停的一种可能方式. 因此,有可能编写一个脚本,在将来将唤醒时间编程为2秒,然后启动睡眠.
@MargaretBloom评论说,"英特尔手册"第14章列举了所有的电源管理功能.(有关链接,请参阅x86标记wiki).此外,通过使用SMM,可能有完全不同的解决方法.
暂时进入睡眠状态,持续一毫秒
1ms约为300万个核心时钟周期.这对于计算机而言并非暂时性,特别是从asm编程的角度来看.
你绝对不想手动编写程序集来进入这些状态.而是使用操作系统现有的ACPI接口.这是每个人都从你的后续问题中贬低废话的一个重要原因.
除了每个核心的短距离睡觉mwait
,pause
和hlt
一个insn,操作系统需要知道发生了什么事情.有关更多信息pause
,请参阅此内容.无论如何都没有具体的指令来进入更深的睡眠状态; 通过写入MMIO空间中的设备寄存器来编程ACPI.
当所有内核同时进行HLT时,整个CPU可以机会性地关闭更多内容,直到下一个定时器或其他中断再次唤醒它(这或者至少与ACPI C状态有关,据我所知).但这在正常操作期间始终发生,因为现代操作系统在空闲的核心上运行HLT.你可以在这里做的唯一有趣的事情就是让CPU偶尔这样睡觉,即使系统正在运行一些CPU密集型进程.(例如,某些具有非空闲优先级的线程hlt
在循环中运行).由于HLT
是特权指令,因此需要内核线程或系统调用.您可能实际上无法提高系统空闲进程的优先级,因此它会从其他可运行进程中窃取时间.
这可能过于简单了:我最近没有查看内核空闲任务,看看它们是否仍然只是HLT
在他们希望当前内核休眠直到下一个中断时才运行.有一段时间(当CPU电源管理处于起步阶段时),空闲循环用于运行其他一些东西以进入低功耗C状态.但HLT
现在可以这样做.