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