電腦可以像手機一樣不用關機?Windows 新版“睡眠模式”做了什麼
2020年1月,NotebookCheck 將戴爾XPS、華碩ZenBook 等Windows 筆記本電腦從Windows“睡眠模式”喚醒後, 發現筆記本表面最高溫度竟然達到50℃,整機功耗更是高達27 W。
Windows 睡眠模式設計的目標就是安靜、低功耗,但現在有如此異狀,NotebookCheck 認為“取代了S3睡眠模式的微軟新型待機是導致(這樣結果的)罪魁禍首”。
那麼,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 所需時間也逐漸增加:
許多條件會觸發系統在Sx 狀態中的轉換,比如說長時間無人操作後,系統會由S0變為S3;睡眠狀態的系統如果接收到了鍵盤鼠標的輸入,則會切換到S0……當然,作為普通用戶的我們並不需要操心如何完成這些轉換,我們只需要知道Windows 中的負責此任務的組件是電源管理器,電源管理器最重要的兩個任務是告知軟件即將要被掛起到內存或者磁盤和輔助切換各種硬件設備的電源狀態。
如果只是系統和軟件被掛起,但我們的顯示器、藍牙、背光燈等設備仍處於開啟狀態,這時系統也很難說是省電的。因而,ACPI 也為硬件設備規定了不同的電源狀態,以D(Device)開頭:
D0:類似於S0,此時設備完全開啟,正常工作;
D3: 此時設備處於關閉狀態,不能工作。D3下有兩個子狀態:D3hot 狀態中,設備仍然連接著主電源,微量耗電,總線控制器能檢測到設備;而D3cold則是完全斷電,無法檢測到設備;
D1-D2:這是D0、D3的中間狀態,設備的部分功能正常,相對於D0而言,功耗更低。不像D0和D3,設備的製造商可以不定義這兩個狀態。
以低功耗藍牙設備為例,不同電源狀態下的功耗、恢復到正常狀態的延遲和Sx 狀態類似,參考數據如下表所示:
表注:數據來自微軟文檔和維基百科
設備的電源狀態由對應的驅動程序控制,驅動程序可以相對獨立地控制設備狀態。例如,我們在日常使用(S0)時,攝像頭無需開啟,那麼此時的攝像頭就會被調整為D3 狀態。但是,當電源管理器決定要切換系統狀態時,它們必須接受調度,系統電源狀態和設備電源狀態有預設的映射關係,我們可以在Windows 設備管理器> 設備> 屬性> 詳細信息> 電源數據 看到:
如上圖所示,我的顯示器支持D0和D3兩種狀態,在系統為S0的情況下,最低可以達到D0狀態,也就是說,可以處於D0 – D3任意一種狀態;而在系統為S3的情況下,則最低可以處於D3狀態,也就是必須關閉。硬件設備的製造商大多認為不需要在S3模式下保持功能正常,幾乎所有設備被設定為S3對應D3。
在Windows 7及之前,以及目前的部分PC 中,進入睡眠模式實質上就是系統電源狀態由S0切換為S3,設備狀態再根據映射關係,切換對應的Dx 狀態,這常常也被稱為傳統待機或是S3待機。
以管理員權限打開終端,輸入powercfg /a,如果得到的結果中顯示支持Standby(S3),則說明你的設備為傳統待機:
來源:forum.gigabyte.us
因此,在一台採用了傳統待機模式的PC上,進入睡眠模式的步驟大致如下:
電源管理器決定切換系統狀態為S3;
告知應用在規定時間內完成最後的操作,之後將它們掛起到內存;
通知硬件設備配合系統狀態切換,設備悉數從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開始菜單中,休眠選項默認是隱藏的,可以通過 電源選項> 更改電源按鈕的功能> 關機設置 重新打開。
但微軟的考量是,S4休眠生成的文件比較大,Windows 上為可以使用總內存的40%,我們能用PowerShell 在C盤根目錄看到這個休眠文件:
如圖所示,這個休眠文件大約有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中重新更名為新型待機。
圖注:圖片修改自WinHEC Fall 2017
傳統S3待機控制CPU 功耗的方法很簡單,斷開CPU/SoC 部分的供電即可,這時芯片裡的寄存器全部清空變成了0;但在喚醒時,需要重新初始化寄存器,這就是從S3恢復成S0時需要一點時間的原因,當然這個時間遠比從S4恢復所需要的短得多。
但現在連這一點初始化的時間都不能要了,也就意味著需要CPU/SoC“記住”之前寄存器的狀態。因此,CPU/SoC 內部就需要有一枚專門的芯片按照下圖的步驟,一步步把對應寄存器區域的狀態保存在CPU/SoC 內部的nvram 中,再切斷電源。這樣就讓設備實現了在S0響應速度的基礎上,又能有S3的功耗控制。
所需要功耗從上到下依次變小,且只有每層的任務都完成以後才會操作下一層的目標
首先,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睡眠模式:
硬件設備的省電還不夠,軟件也有做相應的準備。這方面,新型待機和S3睡眠一樣,都將運行的應用掛起到RAM。和S3狀態不一樣的是,新型待機目的是在睡眠狀態下仍能完成一些任務,因此,部分活動享有新型待機下的豁免權。
微軟稱這些應用活動為激活器,前面提到過新型待機狀態下,網絡甚至是CPU 都可能不工作,這些激活器的作用就是將這些設備短時間喚醒,執行某些指令。這些激活器全都是Windows 內置的系統服務,例如負責接收UWP 應用通知的WNS、負責處理Windows 更新的WU、負責管理網絡連接的NCSI……它們的存在使Windows S0ix 待機狀態時也能收到通知,並可以處理後台維護任務。
以UWP 後台任務為例,我們在Windows 設置中的應用> 應用和功能> 設置中看到一項後台應用權限,這個權限控制的就是在待機時,應用執行後台任務的能力。默認的“電源已優化”選項意思是根據PC 連接電源的情況,決定是否執行任務。
當激活器喚醒部分硬件設備時,新版Windows 還會限制它們能夠使用的資源量,例如UWP 後台刷新任務只允許活動5秒,5秒後則會被終止,硬件設備也會再次進入低功耗狀態。需要注意的是,和S3睡眠模式不同,這些任務並不會導致系統被喚醒至完全工作狀態,除了需要喚醒的少部分設備外,其他硬件仍處於低功耗狀態,所有第三方應用、服務也仍被掛起。
除了被激活器喚醒的小部分時間中,新型待機PC 的功耗和S3 相當。如下圖所示,運行powercfg /spr生成的電池報表顯示,在2022年4月16日2-11時的新型待機過程中,軟件(SW)、硬件(HW)100% 處於低功耗狀態,筆記本電量消耗了3%:
上面的報表還顯示,在進入睡眠模式前,有一個關閉屏幕(Screen Off)階段。這種設計很符合直覺,按下睡眠按鈕後,PC直接關閉屏幕,將應用掛起到RAM、切換硬件設備狀態都在用戶無感知的息屏期間完成,這也是誤觸了睡眠功能後,立刻喚醒PC 花費時間比正常情況稍長的原因。從關閉屏幕到睡眠的間隔對應著設置面板中的相關選項,一般建議將兩個時間統一:
當然新型待機模式和傳統待機一樣,點擊電源按鈕,或者操作鍵盤鼠標,PC 就會切換為S0完全開啟狀態。因為系統本身就處於S0,部分設備也不需要經歷D3到D0 的高延遲狀態切換,所以新型待機的喚醒可以達到1秒以內,微軟稱之為“instant on”。Intel Evo™ 認證主打的“即時喚醒”也正是得益於新型待機。
當然為了進一步增強S0ix 的省電效果,新型待機還有一個機制叫做自適應休眠:當新型待機期間耗電量超過5%,系統會直接進入最深一級的S0i5狀態,這個狀態理論上功耗為0瓦。有這個機制的存在,有時候將筆記本合蓋後,你會發現第二天再打開時就無法用鍵鼠喚醒了。如下表所示,由於某些軟件活動,我的筆記本待機耗電達到了5%(264),接著,PC就直接進入了休眠模式(265),電量停止消耗。
綜上所述,在一台採用新型待機的PC 中,進入睡眠模式步驟如下:
電源管理器決定進入S0低功耗模式;
屏幕關閉;
告知運行中的桌面應用和UWP 在規定時間內完成最後的操作,之後將它們掛起到內存;
通知硬件設備進入相應的低功耗模式;
有通知或後台任務任務的需要時,激活器喚醒部分設備,執行操作;
完成任務或者超過喚醒時限時,再次讓設備進入低功耗模式。
我們的第二個問題也就迎刃而解了。讓我們回到文章開頭,新型待機又是怎麼製造出了高達50℃的合蓋筆記本呢?
▍對新型待機的批評
事實上,新型待機推行以來,批評的聲音此起彼伏,文章開頭的新聞只是其中一例。這些批評一部分確實和新型待機有關,也有一部分則應當歸咎於誤操作。
雖然微軟在宣傳中將新型待機功耗和S3並稱,但毫無疑問的是,由於傳統待機狀態下沒有任何後台活動,設備也大都處於關閉狀態,耗電量極小。
但新型待機狀態下,一些設備可能並不會進入低功耗狀態,甚至是拒絕進入低功耗狀態;此外新型待機也有喚醒SoC 處理指令的機制,所以,新型待機的耗電量必然不會比S3更好,但並沒有到不能接受的程度,從前面的報表中可以看出,9個小時的待機時間耗電量為3%。
因此,一個非常普遍的觀點是新型待機相較於傳統待機耗電量更大,甚至有Surface用戶稱睡眠模式下短時間內電量驟降20%。的確,既要即時啟動又要不耗電的黑魔法是不存在的,但20%實屬誇張,如果機器電池狀況良好,那麼唯一可能的解釋是PC 根本沒有進入睡眠模式。
那麼,為什麼PC 會無法進入睡眠模式呢?答案很有可能是Windows 的電源請求機制。
試想,我們正在觀看一部2個小時的電影,PC 依舊死板地遵照設置,3分鐘無操作直接息屏睡眠,這樣的體驗實在很差。正是為了解決這些情況,應用可以發送電源請求,系統掃描到電源請求後不會發送切換狀態的指令。電源請求可以使用powercfg /requests看到:
音視頻應用之外,其他應用也有可能發送電源請求,它們會阻止閒置的PC 睡眠,電量消耗自然會高。不過,當我們明確要求PC 睡眠時,這些應用也會被停止,只需要將合蓋/電源按鈕的功能設置為睡眠,然後執行這些操作即可。
除了對耗電量的批評, 還有人認為新型待機只是假睡,因為他們發現,書包裡的PC風扇仍在工作。本質上,這是不信任其激活和喚醒機制。
根據前面對新型待機原理的講解,我們知道,和S3狀態一樣,除了豁免的少數應用活動,待機狀態下傳統應用、第三方系統服務都被掛起到內存,它們沒有辦法喚醒機器。最有可能將機器喚醒至S0完全開啟狀態的並非軟件,而是外設。例如,如果PC 外接了鼠標,並且在不關閉鼠標的情況下直接合蓋放進背包,那麼,鼠標只要受擠壓輕微移動,PC 就會退出睡眠狀態。這種情況並非新型待機獨有,唯一的解決方案是裝包之前,拔出或者關閉外設的電源。
還有一種情況,前面提到過,Windows 是可以在待機狀態下執行更新操作的。根據微軟的設計,如果連接了網絡,那麼Windows 可以在待機狀態後台下載已有的更新,如果還連接了電源,那麼Windows 也能安裝更新甚至重啟設備。如果更新下載任務繁重,風扇確實可能會工作,由於此時為合蓋狀態,散熱條件差,很可能造成熱量堆積。要是廠商將待機模式下的風扇設計為完全不工作,那麼此時可能會更熱。
由網絡連接引發的問題可以通過禁用新型待機的連接解決。部分設備上的設置面板提供了“允許待機時使用Wifi”之類的選項,如果沒有提供的話,則可以直接修改註冊表:在HKEY_LOCAL_MACHINESYSTEMControlSet001ControlPower新建名為EnforceDisconnectedStandby的DWORD,值為1。這樣,就可以禁止待機時網絡下載。其代價是我們無法在待機狀態下收取郵件等需要聯網的通知。
不過,文章開頭的案例大概率並非由以上原因導致。NotebookCheck 並沒有給出完整的測試數據和步驟,但能確定的是,根據該文章發布兩天后的註釋,文章中的測試機並沒有安裝最新驅動。而戴爾則早在文章發布5個月前釋出了針對現代待機的修復補丁, Elevenforum 也有因驅動引發待機異常問題的討論。理論上,新型待機工作需要硬件設備的緊密配合,如果驅動出錯,那麼待機溫度異常也是有可能的。
總而言之,如果新型待機異常,可以通過管理員權限運行powercfg /spr獲得待機的時間、軟硬件活動、喚醒事件等信息,再從以下方向排查:
驅動程序是否為最新;
是否有應用阻止PC 睡眠;
是否連接了會喚醒PC 的外設;
是否在待機過程中進行了大量網絡活動,如係統更新?
不管用戶願意與否,新型待機都會在更多的設備上應用。就我個人而言,用極少量的待機耗電,換取無需關機、隨時可用的PC 使用體驗,這筆交易不算虧。然而,由於PC 上缺少統一推送渠道,UWP 多年來普及緩慢,新型待機離智能手機一樣的使用體驗還有很長一段路要走。