3

随时可用的 PC 体验是这样「炼」成的,Windows 新版睡眠机制详解

 2 years ago
source link: https://sspai.com/post/72757
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

明明什么都没做,合盖睡眠的 Windows 笔电却热得烫人。

2020 年 1 月,NotebookCheck 将戴尔 XPS、华硕 ZenBook 等 Windows 笔记本电脑从 Windows「睡眠模式」唤醒后,发现 笔记本表面最高温度竟然达到 50℃,整机功耗更是高达 27 W。Windows 睡眠模式设计的目标就是安静、低功耗,但现在有如此异状,NotebookCheck 认为「取代了 S3 睡眠模式的微软新型待机是导致(这样结果的)罪魁祸首」。

1

那么,S3 睡眠模式代表着什么?它为何被新型待机(Modern Standby)取代?发热的合盖笔电和新型待机又有什么关联?

ACPI 与系统、设备电源状态

我们既想让硬件在干活时,卯足了劲干活;又想在无人操作时,降低功耗节约能源;而且对于笔记本或是平板电脑来说,在不接入外部电源时电池电力总是有限的,因此我们需要电源管理。我们日常接触到电脑的关机、开机也好,睡眠、休眠也罢,从宏观上看,都属于电脑的电源管理的范畴。

显然,这种系统性工程需要由操作系统、硬件制造商、OEM 等角色共同参与,一个大家共同遵守的规范性文件也自然必不可少。

90 年代中期,英特尔、微软、东芝等共同制定了帮助操作系统发现、配置计算机硬件和执行电源管理的规范——ACPI。该标准为系统、硬件组件等定义了不同的电源级别,其中,Sx 定义了系统整体的电源状态,而 Dx 则定义了主板上硬件设备的电源状态,文章开头提到的 S3 就隶属于 Sx 状态。

ACPI 规范 中,系统整体的电源状态(即 Sx 状态)从 S0 到 S5 共分六级。但在现实生活中,常见的系统电源状态只有如下四种:

  • S0:完全开启,CPU 等设备正常运作。也就是开机、从睡眠模式唤醒计算机本质上是系统电源状态切换为 S0 的过程;
  • S3:睡眠状态,亦称挂起到内存。此时,内存仍需供电,但处理器不处理指令,断电会丢失内存中的数据;S1 和 S2 则为 S0、S3 的中间状态;
  • S4:休眠状态,系统状态以及内存中的所有信息都被保存到磁盘,所以也被叫做挂起到磁盘,此时几乎所有设备断开电源;
  • S5:完全关闭。除电源按钮外所有设备断电,需要经过完整引导才能进入系统。

六个状态按数字从小到大,用电设备越来越少,功耗也依次降低,不过,将系统恢复到工作状态 S0 所需时间也逐渐增加:

1

许多条件会触发系统在 Sx 状态中的转换,比如说长时间无人操作后,系统会由 S0 变为 S3;睡眠状态的系统如果接收到了键盘鼠标的输入,则会切换到 S0……当然,作为普通用户的我们并不需要操心如何完成这些转换,我们只需要知道 Windows 中的负责此任务的组件是电源管理器,电源管理器最重要的两个任务是告知软件即将要被挂起到内存或者磁盘辅助切换各种硬件设备的电源状态

如果只是系统和软件被挂起,但我们的显示器、蓝牙、背光灯等设备仍处于开启状态,这时系统也很难说是省电的。因而,ACPI 也为 硬件设备 规定了不同的电源状态,以 D(Device)开头:

  • D0:类似于 S0,此时设备完全开启,正常工作;
  • D3: 此时设备处于关闭状态,不能工作。D3 下有两个子状态:D3hot 状态中,设备仍然连接着主电源,微量耗电,总线控制器能检测到设备;而 D3cold 则是完全断电,无法检测到设备;
  • D1-D2:这是 D0、D3 的中间状态,设备的部分功能正常,相对于 D0 而言,功耗更低。不像 D0 和 D3,设备的制造商可以不定义这两个状态。

以低功耗蓝牙设备为例,不同电源状态下的功耗、恢复到正常状态的延迟和 Sx 状态类似,参考数据如下表所示:

1表注:数据来自 微软文档维基百科

设备的电源状态由对应的驱动程序控制,驱动程序可以相对独立地控制设备状态。例如,我们在日常使用(S0)时,摄像头无需开启,那么此时的摄像头就会被调整为 D3 状态。但是,当电源管理器决定要切换系统状态时,它们必须接受调度,系统电源状态和设备电源状态有预设的映射关系,我们可以在 Windows 设备管理器 > 设备 > 属性 > 详细信息 > 电源数据看到:

1

如上图所示,我的显示器支持 D0 和 D3 两种状态,在系统为 S0 的情况下,最低可以达到 D0 状态,也就是说,可以处于 D0 - D3 任意一种状态;而在系统为 S3 的情况下,则最低可以处于 D3 状态,也就是必须关闭。硬件设备的制造商大多认为不需要在 S3 模式下保持功能正常,几乎所有设备被设定为 S3 对应 D3。

在 Windows 7 及之前,以及目前的部分 PC 中,进入睡眠模式实质上就是系统电源状态由 S0 切换为 S3,设备状态再根据映射关系,切换对应的 Dx 状态,这常常也被称为传统待机或是 S3 待机

以管理员权限打开终端,输入 powercfg /a,如果得到的结果中显示支持 Standby(S3),则说明你的设备为传统待机:

1来源

因此,在一台采用了传统待机模式的 PC 上,进入睡眠模式的步骤大致如下:

  1. 电源管理器决定切换系统状态为 S3;
  2. 告知应用在规定时间内完成最后的操作,之后将它们挂起到内存;
  3. 通知硬件设备配合系统状态切换,设备悉数从 D0 切换到 D3 状态。

至此,我们已经解决了 S3 睡眠模式是什么的问题,那么为什么微软抛弃它,选择所谓新型待机呢?

新需求与 Sx 状态的变体

虽然 ACPI 制定了电源管理的规范,但随着时间的推移,新的需求被发掘,人们开始在 Sx 状态的基础上做文章。

例如,Linux、Windows 会支持一种叫做混合睡眠(hybird sleep)的状态。这种情况下,机器状态既会被保存到磁盘,也会被保存到 RAM,是 S3 和 S4 状态的混合;Mac 也曾经宣传过这项特性。Arch Linux Wiki 解释了设置这种状态的目的:

如果电池没有耗尽,那么系统可以从 RAM 恢复。如果电池耗尽,系统可以从磁盘恢复,这比从 RAM 恢复慢,但至少机器的状态没有丢失。

在 S3 睡眠下,系统状态被保存到了 RAM 中,前面提到过 RAM 一旦断电,保存的内容就会消失;想要进入系统必须重新进行引导,而 S4 状态中用于保存系统状态的磁盘没有这种问题。所以将两者结合的混合睡眠,既解决了数据安全问题,也可以在没耗尽电量之前尽可能缩短唤醒的时间。

另外,比较知名的例子就是 Windows 中的「快速启动」功能。很多人可能都不知道,在开启「快速启动」的这项功能以后,Windows 的关机功能不再是真的关机了,电脑在你点下关机按钮以后并不会进入 S5 状态,而是进入了 S4 休眠状态。但休眠功能不是保存系统的全部状态吗?为什么 Windows 关机后还要输入密码,重新打开应用呢?

确实,传统的 S4 休眠会保存系统的全部状态,包括登录的用户、开启的应用,重启后,引导程序会直接将磁盘中的状态加载到内存中,这样就省去了重新加载内核、初始化硬件的功夫。Windows 10 开始菜单中,休眠选项默认是隐藏的,可以通过 电源选项 > 更改电源按钮的功能 > 关机设置 重新打开。

1

但微软的考量是,S4 休眠生成的文件比较大,Windows 上为可以使用总内存的 40%,我们能用 PowerShell 在 C 盘根目录看到这个休眠文件:

1

如图所示,这个休眠文件大约有 10 GB,这对一些磁盘容量较小的设备是一个不小的负担。另外如果设备使用的不是固态硬盘,如此大的文件加载时间可想而知也很慢。因此,开启「快速启动」以后,Windows 的关机功能确实是休眠,但在休眠之前,Windows 会退出所有应用并注销用户会话,再生成休眠文件;这时休眠文件就只占内存大小的 20% 了,「快速启动」体验自然也会变得更好。

以上两个例子说明,厂商并非一定要拘泥于 ACPI 的规范,如果有了新的需求,解决需求才是第一位的。那么,传统 S3 睡眠遇到了什么无法解决的需求呢?微软在其 硬件开发文档 中如此回答:

电源管理架构的目的是满足不断增长的用户需求,包括:

  • 客户要求他们的计算机随时可用,即使在关闭时也是如此……
  • 在插电或者使用电池时,客户都希望减少 PC 使用的电量

S3 睡眠也许能做到节能,但离随时可用差了不少。比如,我们希望电脑上的 IM 软件也和手机一样,可以及时接收消息,但 S3 状态处理器无法工作,就更不用提接收消息了;再比如,我们也希望电脑可以像手机一样按下指纹就能解锁,系统需要先花上大概 5 秒从 S3 切换到 S0,才能识别指纹进行解锁;又比如我们想使用 Windows 下的语音助手,如果系统处于 S3 睡眠状态,那么收音、网络设备都处于 D3 关闭状态,这时语音助手就没有办法响应,而让系统整个保持在 S0,这样整机功耗就无法控制了。

看到这里,读者可能会想:这不就是智能手机上的即开即用的使用体验吗?确实如此,新型待机正是期望将智能手机的即开即用体验带到 Windows 上。

新型待机

早在 Windows 8 时代,微软就认识到了 S3 睡眠模式的不足,那时,微软期望 PC 能够在睡眠模式下也能正常连接网络,所以微软推出了一个新式的睡眠模式并命名为连接待机(Connected Standby),即在保证系统和设备处于 S0 响应速度的基础上,又能有 S3 的功耗控制。而在 Windows 10 中重新更名为新型待机。

1图注:图片修改自 WinHEC Fall 2017

传统 S3 待机控制 CPU 功耗的方法很简单,断开 CPU/SoC 部分的供电即可,这时芯片里的寄存器全部清空变成了 0;但在唤醒时,需要重新初始化寄存器,这就是从 S3 恢复成 S0 时需要一点时间的原因,当然这个时间远比从 S4 恢复所需要的短得多。

但现在连这一点初始化的时间都不能要了,也就意味着需要 CPU/SoC「记住」之前寄存器的状态。因此,CPU/SoC 内部就需要有一枚专门的芯片按照下图的步骤,一步步把对应寄存器区域的状态保存在 CPU/SoC 内部的 nvram 中,再切断电源。这样就让设备实现了在 S0 响应速度的基础上,又能有 S3 的功耗控制。

1所需要功耗从上到下依次变小,且只有每层的任务都完成以后才会操作下一层的目标

首先,CPU/SoC 外部的所有设备都必须进入低功率模式, 也就是 Sx 对应的 Dx 为最低的设备电源状态。接下来,将网络和无线电设备置于低功率模式,在此期间,这些设备通常会使用很少的一部分电源以维护连接,并在必要时唤醒 CPU/SoC 。

在 CPU/SoC 外部的所有设备(包括通信设备)都断电后,CPU/SoC 的芯片组和非处理器核心也将进入低功率模式,这可以进一步节约能源;在这之后,就是处理核心 CPU 和 GPU 以及位于最后的一些其他电路了。如果中间有任何一个部件拒绝进入低功耗状态,那么整个链路就会中断,重新回到 S0。英特尔将这一系列状态称之为低功耗 S0 状态(low power S0 idle),代号为 S0ix,每让一层设备进入低功耗状态则为 S0ix 中的 x 加上一,因此在 CPU 和 GPU 停止工作以前的状态也常常被称作 S0i3 休眠状态。

所以,新型待机对 PC 上的芯片组等设备有一定的要求。以管理员权限运行终端命令 powercfg /a,若结果含有 Standby(S0 low power idle),则说明你的设备为新型待机。使用新型待机的设备,不支持 S1-S3 睡眠模式:

1

硬件设备的省电还不够,软件也有做相应的准备。这方面,新型待机和 S3 睡眠一样,都将运行的应用挂起到 RAM。和 S3 状态不一样的是,新型待机目的是在睡眠状态下仍能完成一些任务,因此,部分活动享有新型待机下的豁免权。

微软称这些应用活动为 激活器,前面提到过新型待机状态下,网络甚至是 CPU 都可能不工作,这些激活器的作用就是将这些设备短时间唤醒,执行某些指令。这些激活器全都是 Windows 内置的系统服务,例如负责接收 UWP 应用通知的 WNS、负责处理 Windows 更新的 WU、负责管理网络连接的 NCSI……它们的存在使 Windows S0ix 待机状态时也能收到通知,并可以处理后台维护任务。

以 UWP 后台任务为例,我们在 Windows 设置中的应用 > 应用和功能 > 设置中看到一项后台应用权限,这个权限控制的就是在待机时,应用执行后台任务的能力。默认的「电源已优化」选项意思是根据 PC 连接电源的情况,决定是否执行任务。

1

当激活器唤醒部分硬件设备时,新版 Windows 还会限制它们能够使用的资源量,例如 UWP 后台刷新任务只允许活动 5 秒,5 秒后则会被终止,硬件设备也会再次进入低功耗状态。需要注意的是,和 S3 睡眠模式不同,这些任务并不会导致系统被唤醒至完全工作状态,除了需要唤醒的少部分设备外,其他硬件仍处于低功耗状态,所有第三方应用、服务也仍被挂起。

除了被激活器唤醒的小部分时间中,新型待机 PC 的功耗和 S3 相当。如下图所示,运行 powercfg /spr 生成的电池报表显示,在 2022 年 4 月 16 日 2 - 11 时的新型待机过程中,软件(SW)、硬件(HW)100% 处于低功耗状态,笔记本电量消耗了 3%:

1

上面的报表还显示,在进入睡眠模式前,有一个关闭屏幕(Screen Off)阶段。这种设计很符合直觉,按下睡眠按钮后,PC 直接关闭屏幕,将应用挂起到 RAM、切换硬件设备状态都在用户无感知的息屏期间完成,这也是误触了睡眠功能后,立刻唤醒 PC 花费时间比正常情况稍长的原因。从关闭屏幕到睡眠的间隔对应着设置面板中的相关选项,一般建议将两个时间统一:

1

当然新型待机模式和传统待机一样,点击电源按钮,或者操作键盘鼠标,PC 就会切换为 S0 完全开启状态。因为系统本身就处于 S0,部分设备也不需要经历 D3 到 D0 的高延迟状态切换,所以新型待机的唤醒可以达到 1 秒以内,微软称之为「instant on」。Intel Evo™ 认证 主打的「即时唤醒」也正是得益于新型待机。

当然为了进一步增强 S0ix 的省电效果,新型待机还有一个机制叫做 自适应休眠:当新型待机期间耗电量超过 5%,系统会直接进入最深一级的 S0i5 状态,这个状态理论上功耗为 0 瓦。有这个机制的存在,有时候将笔记本合盖后,你会发现第二天再打开时就无法用键鼠唤醒了。如下表所示,由于某些软件活动,我的笔记本待机耗电达到了 5%(264),接着,PC 就直接进入了休眠模式(265),电量停止消耗。

1

综上所述,在一台采用新型待机的 PC 中,进入睡眠模式步骤如下:

  • 电源管理器决定进入 S0 低功耗模式;
  • 屏幕关闭;
  • 告知运行中的桌面应用和 UWP 在规定时间内完成最后的操作,之后将它们挂起到内存;
  • 通知硬件设备进入相应的低功耗模式;
  • 有通知或后台任务任务的需要时,激活器唤醒部分设备,执行操作;
  • 完成任务或者超过唤醒时限时,再次让设备进入低功耗模式。

我们的第二个问题也就迎刃而解了。让我们回到文章开头,新型待机又是怎么制造出了高达 50℃ 的合盖笔记本呢?

对新型待机的批评

事实上,新型待机推行以来,批评的声音此起彼伏,文章开头的新闻只是其中一例。这些批评一部分确实和新型待机有关,也有一部分则应当归咎于误操作。

虽然微软在宣传中将新型待机功耗和 S3 并称,但毫无疑问的是,由于传统待机状态下没有任何后台活动,设备也大都处于关闭状态,耗电量极小。

但新型待机状态下,一些设备可能并不会进入低功耗状态,甚至是拒绝进入低功耗状态;此外新型待机也有唤醒 SoC 处理指令的机制,所以,新型待机的耗电量必然不会比 S3 更好,但并没有到不能接受的程度,从前面的报表中可以看出,9 个小时的待机时间耗电量为 3%。

因此,一个非常普遍的观点是新型待机相较于传统待机耗电量更大,甚至有 Surface 用户称 睡眠模式下短时间内电量骤降 20%。的确,既要即时启动又要不耗电的黑魔法是不存在的,但 20% 实属夸张,如果机器电池状况良好,那么唯一可能的解释是 PC 根本没有进入睡眠模式。

那么,为什么 PC 会无法进入睡眠模式呢?答案很有可能是 Windows 的电源请求机制。

试想,我们正在观看一部 2 个小时的电影,PC 依旧死板地遵照设置,3 分钟无操作直接息屏睡眠,这样的体验实在很差。正是为了解决这些情况,应用可以发送电源请求,系统扫描到电源请求后不会发送切换状态的指令。电源请求可以使用 powercfg /requests 看到:

1

音视频应用之外,其他应用也有可能发送电源请求,它们会阻止闲置的 PC 睡眠,电量消耗自然会高。不过,当我们明确要求 PC 睡眠时,这些应用也会被停止,只需要将合盖/电源按钮的功能设置为睡眠,然后执行这些操作即可。

除了对耗电量的批评,还有人认为 新型待机只是假睡,因为他们发现,书包里的 PC 风扇仍在工作。本质上,这是不信任其激活和唤醒机制。

根据前面对新型待机原理的讲解,我们知道,和 S3 状态一样,除了豁免的少数应用活动,待机状态下传统应用、第三方系统服务都被挂起到内存,它们没有办法唤醒机器。最有可能将机器唤醒至 S0 完全开启状态的并非软件,而是外设。例如,如果 PC 外接了鼠标,并且在不关闭鼠标的情况下直接合盖放进背包,那么,鼠标只要受挤压轻微移动,PC 就会退出睡眠状态。这种情况并非新型待机独有,唯一的解决方案是装包之前,拔出或者关闭外设的电源。

还有一种情况,前面提到过,Windows 是可以在待机状态下执行更新操作的。根据 微软的设计,如果连接了网络,那么 Windows 可以在待机状态后台下载已有的更新,如果还连接了电源,那么 Windows 也能安装更新甚至重启设备。如果更新下载任务繁重,风扇确实可能会工作,由于此时为合盖状态,散热条件差,很可能造成热量堆积。要是厂商将待机模式下的风扇设计为完全不工作,那么此时可能会更热。

由网络连接引发的问题可以通过禁用新型待机的连接解决。部分设备上的设置面板提供了「允许待机时使用 Wifi」之类的选项,如果没有提供的话,则可以直接修改注册表:在 HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Power 新建名为 EnforceDisconnectedStandby 的 DWORD,值为 1。这样,就可以禁止待机时网络下载。其代价是我们无法在待机状态下收取邮件等需要联网的通知。

不过,文章开头的案例大概率并非由以上原因导致。NotebookCheck 并没有给出完整的测试数据和步骤,但能确定的是,根据该文章发布两天后的注释,文章中的测试机并没有安装最新驱动。而戴尔则早在文章发布 5 个月前释出了针对现代待机的修复补丁,Elevenforum 也有因驱动引发待机异常问题的讨论。理论上,新型待机工作需要硬件设备的紧密配合,如果驱动出错,那么待机温度异常也是有可能的。

总而言之,如果新型待机异常,可以通过管理员权限运行 powercfg /spr 获得待机的时间、软硬件活动、唤醒事件等信息,再从以下方向排查:

  • 驱动程序是否为最新;
  • 是否有应用阻止 PC 睡眠;
  • 是否连接了会唤醒 PC 的外设;
  • 是否在待机过程中进行了大量网络活动,如系统更新?

不管用户愿意与否,新型待机都会在更多的设备上应用。就我个人而言,用极少量的待机耗电,换取无需关机、随时可用的 PC 使用体验,这笔交易不算亏。然而,由于 PC 上缺少统一推送渠道,UWP 多年来普及缓慢,新型待机离智能手机一样的使用体验还有很长一段路要走。

封面:Recharge vector created by vectorjuice

> 下载 少数派 2.0 客户端、关注 少数派公众号,探索更多技术背后的故事 💸

> 实用、好用的 正版软件,少数派为你呈现 🚀


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK