器→工具, 工具软件

Windows和MacOS的睡眠和休眠

钱魏Way · · 702 次浏览
!文章内容如有错误或排版问题,请提交反馈,非常感谢!

平时下班的时候会将笔记本直接塞书包里。有时候到家拿出来发现非常的烫,给我的感觉是盒盖后电脑还一直在运行,于是花时间研究了下 Windows 下的睡眠和休眠机制。

官网上 Windows 的睡眠和休眠状态介绍

睡眠

睡眠使用非常少的电源,你的电脑启动速度更快,你可以立即返回到你离开的地方。不必担心因电池耗尽而丢失工作,因为如果电量不足,Windows 自动保存所有工作并关闭电脑。当你离开电脑一小段时间(如休息一下)时,请使用”睡眠”。

对于许多电脑(尤其是笔记本电脑和平板电脑),当你合上显示屏或按下电源按钮后,电脑就会进入睡眠状态。

  • 若要将电脑设置为在关闭盖或按电源按钮时进入睡眠状态:
  • 在任务栏上选择”搜索”, 键入控制面板,然后从结果中选择它。
  • 选择”系统和安全”。
  • 在”电源选项”部分中,选择”更改电源按钮功能”。
  • 选择”更改当前不可用的设置”。
  • 根据希望”睡眠”工作方式选择选项:
    • 对于笔记本电脑,展开”当我关闭电池”列中的盖时的列表,然后选择”睡眠”。如果需要,对”插入” 列重复上述步骤。
    • 对于台式机、平板电脑或笔记本电脑,展开”按电源”列中的”按电源”按钮时的列表,然后选择”睡眠”。如果需要,对”插入” 列重复上述步骤。
  • 选择”保存更改”。

准备好将电脑置于睡眠状态后,只需按台式机、平板电脑或笔记本电脑上的电源按钮,或关闭笔记本电脑的盖子即可。

在大多数电脑上,都可以通过按电脑的电源按钮来恢复工作。但是,并非所有电脑都相同。你可能能够通过按键盘上的任何键、单击鼠标按钮或打开笔记本电脑上的盖子来唤醒它。请查看电脑随附的文档或者转到制造商网站。

休眠

此选项专为笔记本电脑设计,可能并不适用于所有电脑。(例如,具有 InstantGo 的电脑没有休眠选项。)休眠选项所耗的电量少于睡眠选项,当你再次启动电脑时,你可以返回到之前离开的位置(尽管没有睡眠选项快)。

如果你知道你将在很长一段时间不会使用笔记本电脑或平板电脑,并且在那段时间不可能给电池充电,那么请使用休眠选项。首先,检查你的电脑是否提供此选项,如果提供,请将其打开。

若要设置你的电脑,以便其休眠:

  • 在任务栏上选择”搜索”, 键入控制面板,然后从结果中选择它。
  • 选择”系统和安全”。
  • 在”电源选项”部分中,选择”更改电源按钮功能”。
  • 选择”更改当前不可用的设置”。
  • 在”关闭设置”部分中,选择”休眠”。
  • 选择”保存更改”。

现在你能够使用以下几种不同的方式使电脑进入休眠状态:

  • 选择”开始”,然后选择 “Power > 休眠”。
  • 按键盘 Windows 徽标键+X,然后选择”关闭”或注销”>休眠”。

阅读完以上一大段的文字,发现看了等于没看,完全不了解中间的逻辑,于是再搜索了的 MacOS 的睡眠机制。

MacOS 的睡眠机制

MacOS 的睡眠机制是一种省电模式,用于让计算机在不需要使用时休眠以节省能源。当 MacOS 进入睡眠状态时,它会自动将所有活动暂停,并将内存中的数据保存到硬盘上,以便在唤醒电脑时可以恢复之前的状态。以下是 MacOS 的睡眠机制:

  • 睡眠模式。在睡眠模式下,MacOS 会自动将内存中的数据写入硬盘并关闭电源以节省能源。在这个状态下,MacOS 还会定期唤醒电脑进行维护操作。
  • 休眠模式。如果你的 Mac 电脑长时间处于睡眠状态,它会自动进入休眠模式。这种模式类似于睡眠模式,但是也会将内存中的数据写入硬盘,并且完全关闭电源,以保持电池寿命。在这种情况下,电脑将不再消耗任何电力。
  • 深度睡眠模式。深度睡眠模式是一种更加省电的模式,在这种模式下,Mac 电脑将完全关闭电源,包括 RAM 和所有外围设备。电脑不再消耗任何电力。当你唤醒电脑时,它将使用保存在硬盘上的数据来恢复之前的状态。

在 MacOS 中,你可以通过 Apple 菜单中的“系统偏好设置”来调整睡眠设置。你可以选择何时启用睡眠模式、休眠模式或深度睡眠模式,以及何时激活这些模式。

选取苹果菜单>“系统偏好设置”,然后点按“节能”。

执行以下一项操作:

  • 设定电脑或显示器在进入睡眠状态前需要等待的时间:拖移“电脑进入睡眠”和“显示器进入睡眠”滑块,或者“此时间段后关闭显示器”滑块。
  • 防止 Mac 自动进入睡眠:选择“防止电脑在显示器关闭时自动进入睡眠状态”。
  • 使硬盘进入睡眠:请选择“如果可能,使硬盘进入睡眠”。

需要说明的是:macOS 默认的睡眠,会关闭屏幕,但会维持用于内存(RAM)的供电。这样一来,一旦打开盖子,macOS 就能立即恢复。若是电池电量低于某个预设阈值,则会将内存中的数据转储到硬盘,而后彻底断电。

经查,

macOS 的睡眠有两种状态

  • 不断电,数据存储在内存中,可以快速恢复。我们称这种状态为睡眠(Sleep)
  • 断电,数据存储在硬盘中,恢复得较慢。我们称这种状态为休眠(Hibernate/Stand-by)

睡眠和休眠可以组合出三种模式,由 hibernatemode 控制

  • hibernatemode=0,这是桌面设备的默认值。系统只睡眠,不休眠,不将数据存储在硬盘中。
  • hibernatemode=3,这是移动设备的默认值。系统默认睡眠,在一定时间后或电量低于阈值将数据存储在硬盘中,而后休眠。这是所谓的安全睡眠(Safe-Sleep)。
  • hibernatemode=25。只休眠,不睡眠。

无论是安全睡眠模式还是休眠模式,从磁盘上恢复时,都会需要一定的时间(经测试,大约 3 秒钟)屏幕才会被点亮。

对于 hibernatemode=3,即安全睡眠模式,又有几个参数来控制细节。

  • 当剩余电量大于 highstandbythreshold(默认 50%)时,在 standbydelayhigh 秒(默认 86,400,即一整天)后进入休眠。
  • 当剩余电量小于 highstandbythreshold 时,在 standbydelaylow 秒(默认 10,800,即三小时)后进入休眠。

探索原理:睡眠休眠关机背后的技术

ACPI(Advanced Configuration and Power Interface,高级配置和电源接口)是一种电源管理协议,旨在为计算机操作系统和硬件设备提供统一的接口,以实现高效的电源管理功能。

ACPI 协议最初由英特尔、微软和东芝等公司共同开发,旨在取代旧的电源管理标准,如 AT(Advanced Technology)和 ATX(Advanced Technology Extended)。

ACPI 的主要目标是实现以下功能:

  • 电源管理:ACPI 允许操作系统有效地管理计算机的电源。它提供了一套标准接口,使操作系统能够控制和管理计算机的电源状态,包括休眠、睡眠、待机等模式。
  • 硬件配置:ACPI 提供了一种机制,允许操作系统检测和配置计算机中的硬件设备。通过 ACPI,操作系统可以获取关于设备的信息,例如传感器数据、电池状态等,并进行必要的配置和管理。
  • 系统事件处理:ACPI 定义了一套事件模型,用于处理系统中发生的各种事件,例如按键、电源状态变化、温度变化等。操作系统可以根据这些事件来采取相应的措施,如启动特定的操作或触发相应的通知。
  • 性能管理:ACPI 还支持性能管理功能,例如动态频率调整和功耗管理。通过调整硬件设备的工作频率和功耗,ACPI 可以优化系统的性能和能源效率。

ACPI使用一种称为ACPI表的数据结构来描述系统的电源和配置信息。这些表位于计算机的BIOS(基本输入/输出系统)中,并由操作系统在引导过程中读取和解释。操作系统使用ACPI表来了解硬件配置和电源管理相关的信息,并根据需要进行相应的操作。

总之,ACPI是一种重要的电源管理协议,为操作系统和硬件设备提供了统一的接口,以实现高效的电源管理和硬件配置。它提供了一种标准化的方法,使得不同厂商的计算机和操作系统能够在电源管理方面达到兼容和互操作性。

ACPI (Advanced Configuration and Power Interface) 高级配置与电源接口,自从1997年英特尔、微软、东芝一起制定这项标准以来,一路更新到目前的ACPI 6.3。ACPI提供了OS可用的硬件抽象和接口(method)。在此之前,高级电源管理(APM, Advanced Power Management)将电源管理几乎完全交给BIOS,呆板而限制很多。简单理解,ACPI是笔记本电脑硬件和操作系统之间的一座桥梁,帮助操作系统了解计算机硬件的状态,实现操作系统对机器硬件的控制,以实现各种软硬件之间的控制。通过ACPI协议,我们可以用电脑软件控制开关机/键盘功能/风扇转速/功耗等一系列设置。简单理解,ACPI主要包括两个部分:

  • 告诉系统目前硬件状态的表单 Tables
  • 提供操作系统调用接口 method 的的AML程序代码

PC机在出现的前十几年,关注的主要是提高性能,而不是节省电力。在笔记本这种便携式设备出现后,才开始考虑如何省电,以延长电池的供电时间,这样各种省电状态被发明了出来,ACPI标准囊获了这些发明,其中包括系统级的S1、S3、S4;CPU级的C0/C1/C2/C3; 设备级别的D0/D1/D3等等。

ACPI内系统电源管理的【睡眠状态S0-S5】:

  • S0(G0)正常(开机)
    • 机器正常运转
  • S1——Standby(睡眠1)
    • 系统处于低电源供应状态,CPU停止工作,屏幕不输出画面、内存硬盘待命、电源灯闪烁
    • 此时移动滑鼠、按键盘任何按键,均可唤醒电脑
  • S2——Power Standby(睡眠2)
    • 和S1几乎是一样的状况,区别是此时CPU已经关闭
    • 此时移动滑鼠、按键盘任何按键,均可唤醒电脑
  • S3——Suspend to RAM(暂停到内存)(睡眠3)(通常情况)
    • CPU/GPU/硬盘/风扇都停止工作
    • 内存通电,信息保存在内存中
    • 此时移动滑鼠、按键盘任何按键,均可唤醒电脑(会比待机慢一些)
  • S4——Suspend to Disk(暂停到硬盘)(休眠)
    • 全部器件CPU/GPU/硬盘/风扇/内存/硬盘都停止工作
    • 会把内存里的信息复制一份,保存在硬盘中
    • 此时移动滑鼠、按键盘任何按键,均可唤醒电脑(会比待机慢一些)
    • 此时,相当于重新开机,不过内存读取的是之前保留下来的内存数据,休眠前的内存越多,休眠状态启动越慢
  • S5——Shutdown(关机)
    • 断电
    • 下次开机,重新加载操作系统

可通过以下命令查看电脑支持的睡眠模式:

(base) PS C:\Users\biaod> powercfg /a
此系统上有以下睡眠状态:
待机(S0低电量待机) 连接的网络
休眠

此系统上没有以下睡眠状态:
待机(S1)
系统固件不支持此待机状态。
当支持S0低电量待机时,禁用此待机状态。

待机(S2)
系统固件不支持此待机状态。
当支持S0低电量待机时,禁用此待机状态。

待机(S3)
当支持S0低电量待机时,禁用此待机状态。

混合睡眠
待机(S3)不可用。
虚拟机监控程序不支持此待机状态。

快速启动
当前系统策略禁用此动作。

从上面的显示中,展示了睡眠状态中存在的“待机(S0低电量待机) 连接的网络”是上面?

让人迷惑的Modern Standby

S0ix 也叫 S0 低电量待机(S0 Low Power Idle)。微软叫做“现代待机”(modern standby)。这个状态下处理器处于低功耗运行,且可以保持网络连接。

“现代待机”(Modern Standby),它实际上有了十年左右的历史,一路走来,十分艰难。伴随着它坎坷命运的是它的名字,在最初,它叫做 Instant-on,Windows 8 上市的时候叫做 Connected Standby,后改名叫做 InstantGo,在 Windows 10 为了包容性,改名 Modern Standby(现代待机),包含 Connected Standby 和 Disconnected Standby 两种模式。对于 CPU 和 BIOS 固件工程师来说,它的名字叫做 S0ix,而对于设备厂商和固件来讲,它又和 RTD3(Runtime D3)紧密相关。

Apple 的 iPhone 开启了移动互联网的时代,iPhone 推出时的一大特征是锁屏时可以收到推送信息等。看到移动设备大卖,Windows 和 Intel 这两兄弟也想分一杯羹,也要向智能手机进发。当时的想法是可以把 Wintel 巨量的用户无缝导入 Windows Phone 市场。CPU 的性能当然没有问题,但一个摆在眼前的难题是功耗。为此阉割了指令集和流水线,定制出 Atom 系列 CPU,但问题并没有完全解决。

iPhone 几乎没有任何人会关闭电话,按下电源键也只是关闭屏幕而已,重要的短信和推送的消息都会收到并提醒,人们想用手机时按一下键,屏幕立刻亮了起来,无需等待。如果谁指望胃口被养叼了的用户能够忍受某新手机,按下电源键就完全变木头,想用的时候要一秒钟以后才有反应,那一定是疯了。S3 睡眠不能满足客户,但仅仅关闭屏幕,让 CPU 进入 C2 或者 C3,功耗又比 ARM 阵营高的多,此路也不通。

最深的 C State 只是让 CPU 内核部分进入了功耗几乎为 0 的状态,而 CPU 的 uncore/SA/North Complex 部分则继续工作(近期的 UFS 改善了这点),更糟的是 PCH (South Complex) 和主板上其他的芯片也无怨无悔的全力工作并贡献自己的功耗。

ARM 阵营的大部分手机待机功耗只有数毫瓦,而 Wintel 新样机的待机功耗高达到数百毫瓦。如何填补其中的巨大黑洞,成为了微软和英特尔工程师必须解决的问题。

为了匹敌 ARM 阵营的特性,Wintel 一起提出了 Instant On/Off(Connected Standby)的技术。顾名思义,这项技术要求按下电源键立刻屏幕点亮、系统可用,同时要求系统在待机状态(Standby)模式下,网络通信等必要设备必须能够唤醒设备,以保持通信通知等畅通。系统 0 秒启动和保持可用,要求必须是 S0 的开机状态,同时又要求待机功耗在数毫瓦,大致是 S3 的功耗,这种奇怪的组合就是所谓 S0ix。

为了达成这个目标,从硬件到软件做了极大的改动,付出了非常多的努力。我们都知道,只是把 Clock Gating 住,可以降低功耗,但要达成 0 功耗,必须关闭电力输入,就是要 Power Gating。而关闭电力,就意味着芯片里面的状态机全部复位了,粗浅的理解就是寄存器等全部清 0 了,要恢复可用,必须重新初始化寄存器,这就是 S3 回来的时候,BIOS 在那个 1 秒钟主要干的事情。而现在又要求不能有这个 1 秒钟,所以寄存器内容或者说状态机状态就不能丢失,怎么做到呢?

只有靠芯片自己记住自己的状态了。芯片内部电源管理模块会按照步骤,一步步关闭芯片内部区域(S0 -> S0i1 -> S0i2 -> S0i3),并把寄存器/状态保存在内部的 nvram 中,并切断这些区域的供电,让其功耗接近 0;在恢复的时候,则反着来,一步步恢复寄存器。相当于做了个快照,一会再恢复回来。由于这个过程是硬件完成的,速度很快。

对芯片外部的设备来说,不需要通知的设备要进入 D3cold 状态,功耗为 0。这一般由 BIOS 报告 ACPI,操作 GPIO 来关闭设备的 Power rail。对于需要唤醒的设备,必须支持一种叫做 Runtime D3(RTD3)的状态,把信息 offload 到该设备处理,并在必须时才唤醒 CPU 和其他处于低功耗的设备。

微软最近几年比较迷惑的操作就是强推 S0ix 待机模式,目的大概是想把电脑变成类似手机和平板的东西,能够实时收到消息推送(这一看就知道是微软在 Windows 8 时代提出的错误理念,事实上现在大多数人都有手机,实时收到新消息推送的功能完全被手机替代了)。强推 S0ix 是微软的一大错误决定,x86 处理器即使在低功耗模式下,耗电也不容忽视,所以 S0ix 待机模式下可观察到的掉电是会存在的。然而更大的问题是唤醒,S0ix 状态下,系统不仅会被用户输入唤醒,还可能会被定时器甚至网络包唤醒。其次很多东西也可能阻止系统进入低功耗模式。如果上面的东西出现了一些问题,一个可能的结果就是电脑一直没有进入睡眠状态。当然,这样的异常在新的硬件和 Windows 版本中会越来越少的出现。而反观 S3,CPU 这个耗电大户完全停止工作,基本上不会有耗电问题。内存数据保留让电脑能够相对 S4 较快的唤醒,是一个很理想的睡眠模式。

新版 Windows 可以用下面的命令强行开启 S3:

reg add HKLM\System\CurrentControlSet\Control\Power /v PlatformAoAcOverride /t REG_DWORD /d 0

恢复 S0 待机:

reg delete "HKLM\System\CurrentControlSet\Control\Power" /v PlatformAoAcOverride

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注