https://hceng.cn/2018/01/18/Linux%E7%94%B5%E6%BA%90%E7%AE%A1%E7%90%86/
1.1系統睡眠模型Suspend
On (on) S0 - Working
Standby (standby) S1 - CPU and RAM are powered but not executed
Suspend to RAM (mem) S3 - RAM is powered and the running content is saved to RAM
Suspend to Disk, Hibernation (disk) S4 - All content is saved to Disk and power down
S3 aka STR(suspend to ram),掛起到內存,簡稱待機。計算機將目前的運行狀態等數據存放在內存,關閉硬盤、外設等設備,進入等待狀態。此時內存仍然需要電力維持其數據,但整機耗電很少。恢復時計算機從內存讀出數據,回到掛起前的狀態,恢復速度較快。對DDR的耗電情況進行優化是S3性能的關鍵,大多數手持設備都是用S3待機。
S4 aka STD(suspend to disk),掛起到硬盤,簡稱休眠。把運行狀態等數據存放在硬盤上某個文件或者某個特定的區域,關閉硬盤、外設等設備,進入關機狀態。此時計算機完全關閉,不耗電。恢復時計算機從休眠文件/分區中讀出數據,回到休眠前的狀態,恢復速度較慢。
系統休眠模型給我的感覺是以整機角度進行省電。
S3類似電腦的睡眠,在教長時間不使用電腦后,電腦黑屏,再次敲擊鍵盤迅速顯示桌面,原來的工作內容仍不變。
S4類似電腦的休眠,在長時間不使用電腦后,電腦黑屏,再次敲擊鍵盤無反應,按下電源鍵,開機,原來的工作內容仍不變。
對於嵌入式設備,更多的是使用S3,將數據暫時放在內存里,以實現快速恢復,就像手機的電源鍵按下黑屏,再次按下迅速亮屏。
在Linux中,通過cat /sys/power/state
可以得知當前設備支持的節能模式,一般情況有如下選項:
- freeze:不涉及具體的Hardware或Driver,只是凍結所有的進程,包括用戶空間進程及內核線程,能節省的能量較少,使用場景不多;
- standby:前面的S1狀態,CPU處於淺睡眠模式,主要針對CPU功耗;
- mem:前面的S3狀態,Suspend to RAM;
- disk:前面的S4狀態,Suspend to Disk;
需要設置以上模式,只需echo mem > /sys/power/state
即可。
系統睡眠狀態
在這篇文章中,我們將在Windows中看到不同的系統睡眠狀態。 MSDN很好地解釋了這一點。
系統電源狀態S0 - 這是工作狀態,Windows PC處於喚醒狀態。這不是睡眠狀態。
系統電源狀態S1 - 在此睡眠狀態下,CPU停止並且您的計算機處於待機模式。如果支持下一個S3狀態,則此S2是大多數硬件上的默認狀態。處理器時鍾關閉,總線時鍾停止。在這種狀態下,功耗可以在5-30瓦之間。
系統電源狀態S2 - 此狀態與S1類似,不同之處在於CPU上下文和系統緩存的內容因處理器斷電而丟失。
系統電源狀態S3 - 在此狀態下,數據或上下文將保存到RAM,並且硬盤驅動器,風扇等將關閉。功耗通常小於5瓦。 Windows 10/8中的S3(睡眠)或S4(休眠)狀態支持LAN喚醒。
系統電源狀態S4 - 在此狀態下,數據或上下文將保存到磁盤。它也被稱為 過冬 狀態,對筆記本電腦很有用。您的PC將RAM的內容保存到硬盤。硬件關閉所有設備。但是,操作系統上下文保存在系統在進入S4狀態之前寫入磁盤的休眠文件中。重啟后,加載程序讀取此文件並跳轉到系統之前的休眠前位置。功耗再次低於5瓦。
ACPI簡介
要理解第一個問題,得先從ACPI(高級配置與電源接口)說起,ACPI是一種規范(包含軟件與硬件),用來供操作系統應用程序管理所有電源接口。
ACPI將計算機系統的狀態划分為四個全局狀態(G0-G3),共7個狀態,其中G0對應S0;G1將低功耗狀態細分為四個狀態,對應S1-S4;G2、G3代表關機狀態分別對應S5、S6。
ACPI State | Description |
---|---|
S0 | 正常工作狀態 |
S1 | CPU與RAM供電正常,但CPU不執行指令 |
S2 | 比S1更深的一個睡眠層次,這種模式通常不采用 |
S3 | 掛起到內存 |
S4 | 掛起到硬盤 |
S5 | Soft Off,CPU、外設等斷電,但電源依舊會為部分極低耗設備供電 |
S6 | Mechanical Off,全部斷電 |
這里只需要對ACPI的七個狀態有個大致了解即可,下一節會有具體的例子來說明各個狀態。
Linux系統電源狀態
在Linux操作系統中,將電源划分為如下幾個狀態:
ACPI State | Linux State | Description |
---|---|---|
S0 | On(on) | Working |
S1 | Standby(standby) | CPU and RAM are powered but not executed |
S2 | ------ | ------ |
S3 | Suspend to RAM(mem) | CPU is Off,RAM is powered and the running content is saved to RAM |
S4 | Suspend to Disk(disk) | All content is saved to Disk and power down |
S5 | Shutdown | Shutdown the system |
On:正常工作狀態
STR(Suspend to RAM):
掛起到內存,俗稱待機、睡眠(Sleep),進入該狀態,系統的主要工作如下:
1、將系統當前的運行狀態等數據保存在內存中,此時仍需要向RAM供電,以保證后續快速恢復至工作狀態
2、凍結用戶態的進程和內核態的任務(進入內核態的進程或內核自己的task)
3、關閉外圍設備,如顯示屏、鼠標等,中斷喚醒外設不會關閉,如電源鍵
4、CPU停止工作
Standby也屬於睡眠的一種方式,屬於淺睡眠。該模式下CPU並未斷電,依舊可以接收處理某些特定事件,視具體設備而定,恢復至正常工作狀態的速度也比STR更快,但也更為耗電。舉個例子來說,以該方式進入睡眠時,后續通過點擊鍵盤也能將系統喚醒。而以mem進入的睡眠為深度睡眠,只能通過中斷喚醒設備喚醒系統,如電源鍵(此時按電源鍵,不會經過正常的開機流程的BIOS、BOOTLOAD等),此時按鍵盤是無法喚醒系統的。
STD(Suspend to Disk):
掛起到硬盤,俗稱休眠(Hibernation)將系統當前的運行狀態等數據保存到硬盤上,並自動關機。下次開機時便從硬盤上讀取之前保存的數據,恢復到休眠關機之前的狀態。
譬如在休眠關機時,桌面打開了一個應用,那么下一次開機啟動時,該應用也處於打開狀態。而正常的關機-開機流程,該應用是不會打開的。
Linux內核代碼聲明如下,位於kernel/power/suspend.c