操作系统

当前位置:金沙棋牌 > 操作系统 > linux系统的休眠与唤醒简介,电源管理ACPI

linux系统的休眠与唤醒简介,电源管理ACPI

来源:http://www.logblo.com 作者:金沙棋牌 时间:2019-09-03 16:41

 

转自:

Android系统电源管理及省电机制

移动设备因为其有限的电池,省电技巧成为Android开发者的一项必备知识。本文不探讨怎样从应用层面省电,因为这些内容已经有很成熟的总结。本文拟介绍Android系统的电源管理机制。因为笔者对于Linux的浅薄知识,如有错漏,请不吝指出。

在Windows下我们已经对系统的电源管理非常熟悉了,我们可以通过主板的高级电源管理模块实现STR、STD等功能。对于笔记本电脑用户使用高级电源管理方式,让笔记本电脑处于休眠状态,节省电池就更加重要。上面说的这些功能在Windows平台下实现对于我们来说,可能都已经不再是困难的事情。但如果换成Linux恐怕就很少有人知道了,今天我们就来介绍一下在Linux操作系统下的电源管理的实现。由于许多服务器都采用了Linux,电源管理的重要性也就变得非常明显了。

/*********************************************************************
 * Author  : Samson
 * Date    : 05/19/2014
 * Test platform:
 *              Mint 15-3.8.13.13
 *              GNU bash, version 4.2.45
 * *******************************************************************/ 

系统挂起(Suspend)是电源管理(APM&ACPI)的一个特性,给用户带来了很大的方便。Linux在2.6系列核心中对电源管理有了较好的支持,下面就谈谈Linux对系统挂起的支持情况。

一、常见电源管理机制(休眠)

在x86机器中,存在两种电源管理方法:

  • APM(Advanced Power Management,高级电源管理)
  • ACPI(Advanced Configuration and Power Interface ,高级配置和电源接口)

这两个标准不能同时允许在Linux上面,默认情况下,Linux运行ACPI.需要注意,apm和acpi是互相冲突的两个模块,用户在同一时间内只能加载其中之一

APM基本已经淘汰

ACPI主要执行者是操作系统,可以单独控制外设。

ACPI主要分成6种状态,分别是S0到S5,它们代表的含义分别是:

  • S0:实际上这就是我们平常的工作状态,所有设备全开,功耗一般会超过80W;

  • S1:也称为POS(Power on Suspend),这时除了通过CPU时钟控制器将CPU关闭之外,其他的部件仍然正常工作,这时的功耗一般在30W以下;(其实有些CPU降温软件就是利用这种工作原理)

  • S2:这时CPU处于停止运作状态,总线时钟也被关闭,但其余的设备仍然运转;

  • S3:这就是我们熟悉的STR(Suspend to RAM),这时的功耗不超过10W;

  • S4:也称为STD(Suspend to Disk),这时系统主电源关闭,硬盘存储S4前数据信息,所以S4是比S3更省电状态.

  • S5:这种状态是最干脆的,就是连电源在内的所有设备全部关闭,即关机(shutdown),功耗为0。

ACPI的省电主要就是依靠 S3,S4,S5状态。

在x86机器中,存在两种电源管理方法:APM (Advanced Power Management,高级电源管理)和ACPI (Advanced Configuration and Power Interface,高级配置和电源接口)。APM是老标准,而ACPI则提供了管理电脑和设备更为灵活的接口。Linux支持这两种协议,不过有时还需要手工配置。另外,两个标准不能同时运行。缺省情况下Linux运行ACPI。

rtc:

 

二、Android系统的休眠机制

Android系统是基于Linux的,但是其因为移动设备的独特性又有所不同,Android在kernel中支持的休眠模式有S0,S1,S3,S4,但是这个是需要硬件配合来实现的,标准的手机Android系统,只支持S0,S3。

即休眠状态实质上就是挂起到内存。

APM可以让你把机器处于Suspend(悬挂) 或Standby(备用)状态,以及检查电池容量。而ACPI还可以让你把外设(如:显示器、显卡、PCI总线)单独断电,在节省电能方面有更多的控制。为了让电源管理功能生效,需要在BIOS和Linux核心里要打开它,并且在linux里加载必需的应用软件。

The Real Time Clock (RTC) unit can be operated by the backup battery when the system power is off. The data
include the time by second, minute, hour, date, day, month, and year. The RTC unit works with an external 32.768 KHz crystal and can perform the alarm function.

另外有一篇介绍android和linux内核对电源管理的支持的比较,代码级别的:Linux Kernel and Android 休眠与唤醒(中文版)

1. 两个处理器芯片

Android手机有两个处理器:

  • Application Processor(AP):AP是ARM架构的处理器,用于运行Linux Android系统;
  • Baseband Processor(BP):BP用于运行实时操作系统(RTOS),通讯协议栈运行于BP的RTOS之上。

在休眠状态下,BP仍旧会收取数据,如有必要会唤醒AP。

检查系统是否支持电源管理

当系统电源关闭时,通过备用电源可以运行实时时钟(RTC)单元。数据包含的时间,即秒,分钟,小时,日期,日,月和年。RTC 工作由一个外部32.768kHz 的晶体驱动,并可以执行报警功能。

一个网址是

2. Android的休眠流程

Android 在Linux的基础上引进了新的状态:预挂起(earlysuspend),同时引进了唤醒锁机制。

其流程如下:

(1)一段时间内无活动,系统发起挂起检查。

(2)进入earlysuspend状态(关闭屏幕、背光、重力感应)

(3)检查wake lock是否全部释放。

(4)如果全部释放,冻结进程挂起外设。

(5)进入深度睡眠,等待外终端唤醒。

注:Android4.4以后和Linux保持统一,实现了AutoSleep机制,本质区别不大,算是Linux和Android的一种相互妥协。

在较新的核心里,都包含了对ACPI和APM的支持。一般地,ACPI是激活的。使用dmesg来检验一下:

要掌握待机和休眠,必须先了解下面两个知识:ACPI和APM。  
  1.什么是ACPI
  ACPI是Advanced Configuration and Power Interface的缩写,中文意为“高级配置与电源接口”,这是微软、英特尔和东芝共同开发的一种工业标准。  

      Linux对系统挂起的支持

3. 颇有争议的Opportunistic suspend

Android的休眠机制简单粗暴,主要遵守两条原则:

  • 系统没有事情的时候就睡。
  • 不管三七二十一,休眠的时候休眠所有外设。

这种机制Linux社区是饱受争议的,主要有以下几项质疑:

  1. 系统没有事情做事很不好判断的,可能会频繁的触发休眠流程。
  2. 只有一个设备在做事的时候,其他设备也得陪着工作吗?

金沙棋牌 ,注:Linux社区是有一套“多样的系统组件单独控制”的电源管理方案(如Linux kernel的Dynamic PM)

dmesg |egrep -i ‘(apm|acpi)’

  ACPI主要可实现以下功能:   
  ①用户可以使电脑在指定时间开、关;   
  ②即插即用设备在插入时能够由ACPI来控制,并为其供电;
  ③在无人使用电脑时可以使电脑进入休眠状态,但保证一些通信设备打开;
  ④操作系统可以根据外设和主板具体需求为它分配能源;
  ⑤操作系统可以在应用程序对时间要求不高的情况下降低时钟频率;
  ⑥使用笔记本电脑的用户可以指定电脑在低电压情况下进入低功耗状态,以保证重要应用程序运行。   

 

4. 在休眠状态下保持被唤醒的机会:AlarmManager

AlarmManager 是Android 系统封装的用于管理 RTC 的模块,RTC (Real Time Clock) 是一个独立的硬件时钟,可以在 CPU 休眠时正常运行,在预设的时间到达时,通过中断唤醒 CPU。

(注:用Timer保持消息推送长连接是非常2B的)

Kernel command line: vga=274 quiet console=ttyS3,9600acpi=no-idleoot=/dev/hda3

  同时,可将ACPI分为六种不同的工作状态,分别是S0到S5,它们代表的含义分别是:  
  S0:电脑正常工作,所有硬件设备全部处于打开或正常工作的状态;
  S1:也称为POS(Power on Suspend,CPU停止工作),其他的硬件设备仍然正常工作;
  S2:将CPU关闭,但其余的硬件设备仍然运转;
  S3:通常称为STR(Suspend to RAM,挂起到内存),将运行中的数据写入内存后关闭硬盘;
  S4:也称为STD(Suspend to Disk,挂起到硬盘),内存信息写入硬盘,然后所有部件停止工作;
  S5:所有硬件设备(包括电源)全部都关闭,也就是关机。  

       Linux同时提供了对APM和ACPI的支持,当时两者是不兼容的,同一时刻只能有一种机制工作。由于ACPI的优越性,所以现在Linux将ACPI设为缺省的电源管理方案。对于一些比较旧的主板,如果其BIOS中ACPI的实现在2000年以前,那么Linux自动启用APM(可以通过核心命令行参数acpi=force来强制启用ACPI)。如果你下主板BIOS中对ACPI的支持有些问题导致Linux工作不正常,那么还可以使用核心命令行参数acpi=off来强制禁用ACPI,这样Linux会自动启用APM电源管理。

三、Android在省电机制上做的努力

ACPI: Core Subsystem version [20010208]

  2.什么是APM
  APM其实是Advanced Power Manager(高级电源管理)的缩写,这是通过操作系统来控制、管理电脑硬件电源的一种管理模式,其实也是一套电脑电源管理程序(软件),版本不同,功能也有所不同,比如APM V1.0&V1.1,这两个版本都是直接由BIOS执行电源管理,而APM V1.2则是可以先通过操作系统定义电源管理,然后再由BIOS负责执行。
  在如今流行的操作系统中,都内置了APM,而在以前的DOS时代,APM并未真正被引入操作系统,所以无法执行待机、休眠等操作,重启也只能用Ctrl+Alt+Delete组合键或电源的Reset键。

Linux现在主要支持三种ACPI的节电方式:

1. 传感器批处理(Sensor batching)

Android 4.4 为了省电引入了一项新的技术: Sensor batching。这不是一项独特的技术,实际上很多其他OS也引入了该项技术,它是什么意思呢?

该项技术允许设备积累一段时间的数据,而后一次性“上报”,引入这种技术后,设备不必频繁的唤醒CPU,从而节省了电量。

ACPI: Subsystem enabled

  S1 =>Standby。即指說系統處於低電源供應狀態,在 windows or BIOS 中可設定螢幕訊號輸出關閉、硬碟停止運轉進入待命狀態、電源燈號處於閃爍狀態。此時動一動滑鼠、按鍵盤任一鍵均可叫醒電腦。
  
  S2 =>Power Standby。和 S1 幾乎是一樣。
  
  S3 =>Suspend to RAM。即是把 windows 現在存在記憶體中的所有資料保存不動,然後進入「假關機」。此時除了記憶體需要電源來保持資料以外,其它的設備、裝置全部停止供電。也就是說,理論上可以把 CPU, PCI, AGP device 拿掉又插回去,電腦也可能正常完成開機及運作,只要不動到記憶體和電源的部份。這時只剩下電源燈號一閃一閃的,其它和關機沒什麼兩樣。(電源供應器的風扇也停止運轉喔)重新開新後,電腦只是把記憶體的資料完整性確認後,即立刻會回到你進 S3 前的畫面。
  
  S4 =>Suspend to Disk。即是把 windows 記憶體中的資料完整的存在硬碟中。等開機時就直接從存這些資料的地方直接完整的讀到記憶體,不需要跑一堆應用程式。使用這種模式的話,硬碟一定要騰出一個完整的連續空間。Windows 98/SE 必需要用軟體去製作一個大檔案或是一個磁區來提供 win98/SE 執行 S4 這功能,WinME/2000/XP 本身就有製作一個大檔案來給 S4 功能用(在電源管理中有一個啟動休眠,就是這個啦) 。在啟動後,在 C: 下會看到一個和你電腦現有記憶體大小一樣的大檔案。
  
  S5 =>Shutdown....這不用說了吧!
  
  S1/S3 在 windows 中都叫「待命 or standby」,所以在 BIOS 裏會有一個選項,設定說 Standby mode 為何,是要 S1 還是 S3,所以啦。S1 和 S3 是不能同時存在的。不是 S1,S4,S5 就是 S3,S4,S5 。

S1:Stopgrant,即待机(standby)模式。显示屏自动断电,只是主机通电。这时敲任意键即可恢复原来状态。
S2 S3:STR(Suspend To Ram),即挂起到内存。系统把当前信息储存在内存中,只有内存等几个关键部件通电,这时计算机处在高度节电状态。此时系统不能从键盘唤醒。手工唤醒的方法只能是按前面板上的电源按钮。唤醒后,计算机从内存中读取信息很快恢复到原来状态。
S4:STD(Suspend To Disk),即挂起到硬盘,也即休眠。计算机自动关机,关机前将当前数据存储在硬盘上,用户下次按开关键开机时计算机将无须启动操作系统,直接从硬盘读取数据,恢复原来状态。

2. JobScheduler

为了更有效率的利用电池,Android 5.0 引入了 JobScheduler API。 应用可以将一些实时性不强的任务(如)采用JobScheduler来做,Android系统会根据系统情况在合适的时机进行调度执行。

ACPI: System firmware supports: C2

S1、S2:待机,可通过鼠标、键盘唤醒,省电低;
S3:挂起,是把所有当前运行的环境保存到内存中,而关闭硬盘等其它设备全部停止供电,必须通过按设备的开机按钮唤醒进行载入;
S4:休眠,把所有当前运行的环境保存到硬盘中后,只是RTC处理器供电,而RTC是基于BIOS电池供电的,所以在省电方面是和关机是一样一样的,当设置的唤醒时间或是重新按开机按钮后,从硬盘载入保存的环境到内存中,即是休眠前的状态,便于快速恢复到上一次的工作环境。

在Linux下查看核心支持ACPI情况的方法如下:

3. Doze机制

随着时间流逝,Google渐渐意识到,无良的开发者是不可靠的,依靠他们遵守可有可无的“规范”是不可能的。

于是Google在Android 6.0 引入了一种新的省电机制,即Doze机制,中文可以翻译成“对齐唤醒机制”。

当设备处于未充电状态、屏幕熄灭一段时间后就会进入Doze状态。在这种状态下,Android系统会限制使用访问网络和CPU。

每过一段时间,Android系统会退出Doze状态,让应用执行之前被延迟的活动。在这个执行窗口,Android系统会执行所有的异步操作,时钟(Alarm),同时允许APP访问网络。

在执行窗口的末期,Android系统又把所有的时钟、网络请求、异步任务给挂起。再次进入Doze状态。

随着时间进行,Doze的状态时间会逐渐延长。

金沙棋牌 1

image

Doze机制是一种“在集中时间段处理事情”的省电思想。

注:因为Doze状态,AlarmManager也不是那么“准时了”。

ACPI: plvl2lat=99 plvl3lat=1001

GNU/Linux系统中提供的rtcwake命令进行以上的5种模式:
休眠:
电脑进入休眠模式,并在2个小时(7200秒)后自动唤醒
sudo rtcwake -m disk -s 7200

2.4核心下:
# cat /proc/acpi/sleep
S0 S1 S3 S4 S5
2.6核心下:
# cat /sys/power/state
standby mem disk

ACPI: C2 enter=1417 C2 exit=354

在10:45这个时刻唤醒
sudo rtcwake -m disk -t `date -d 10:45 %s`

上面的输出可知,我们系统中核心同时支持三种节电模式。

ACPI: C3 enter=-1 C3 exit=-1

会让系统进入S3,睡20秒再自动唤醒。
sudo rtcwake -v -s 20 -m mem

在/sys/power目录下还有一个文件:disk,文件的内容可以如下:

ACPI: Not using ACPI idle

-m后的参数可以查看系统下支持的模式:
[email protected]:~$ cat /sys/power/state
standby mem disk

shutdown: 将系统状态保存到磁盘,让BIOS关闭计算机;
platform: 将系统状态保存到磁盘,让BIOS关闭计算机,并且点亮挂起指示灯;
firmware:
让BIOS自己将系统状态保存,并且关闭计算机,需要BIOS自己有挂起磁盘。大部分工作都由BIOS完成,对操作系统是透明的;


进入这三种节电模式的方法如下: 

#echo  standby > /sys/power/state ---->挂起(S1)
#echo  mem > /sys/power/state ---->挂起到内存(S3)
#echo shutdown > /sys/power/disk; echo disk >
/sys/power/state ---->挂起到磁盘(S4)
#echo platform > /sys/power/disk; echo disk >
/sys/power/state

ACPI: System firmware supports: S0 S1 S4 S5

可见是支持以上三种模式。关于rtcwake的更多请在GNU/Linux下man了。

Linux下的磁盘挂起(STD)是通过swsusp机制实现的:将系统当前状态保存的内存后,再把内存内容写入交换分区(swap)。这里要求交换分区容量最好大于内存容量。系统挂起到磁盘后,下次启动的时候需要向核心传递命令行参数resume=/dev/hdaX(/dev/hdaX是系统中的交换分区),这样系统就能够很快恢复到关机时的状态。

另外,支持ACPI的系统也将增加/proc/ sys/acpi的目录。如果它存在,就表示核心已经加载ACPI驱动。

ref:

还有一个非正式的核心补丁可以实现STD:Software Suspend 2。该项目是一个快速发展的项目,设计上教swsusp有一些优势,但是还没有集成到核心正式发布中,实现方式与swsusp基本相同。

具体的应用实例

虽然Linux提供了系统挂起的机制,但是执行上面的挂起操作不一定能够成功。一方面,这些操作除了需要BIOS支持以外,还需要外围硬件设备能够兼容,即设备支持节电状态,支持从节电状态或断电状态恢复;另一方面,这些设备驱动必须能够接收电源管理指令。目前,系统挂起的主要障碍就是那些还不太完善的驱动程序,如USB、显卡、声卡驱动等。

建议用最新的核心(如:2.4.5)。因为旧的核心支持的特色较少,而2.2.x的核心就是支持ACPI,也只有极少的功能。

当然,现在Linux核心对系统挂起的支持还有待改进,主要表现在:

1、Advanced Power Management

* Author : Samson * Date : 05/19/2014 * Test platform: * Mint 15-3.8.13.13 * GNU bash, version 4.2.45 * *****...

  1. 不支持SMP系统。
  2. 不支持大内存(>4G)。
  3. 核心中许多模块需要增加电源管理的支持。
  4. 缺少上层配置程序。

APM应用包含:apmd(APM的后台服务程序)和其他的应用程序(如APM)。建议到rpmfind.net找最新的适合你使用的版本,安装和运行OK后,我们可以试验APM命令了。

不过可以放心,所有的问题内核黑客们都能够解决!

APM最简单的使用就是显示机器里的电池容量。

参考阅读:

APM

 

AC on-line, no system battery

  1. http://www.acpi.info:ACPI的官方网站,在上面可以免费获得最新的ACPI规范。
  2. http://acpi.sourceforge.net:Linux下支持ACPI项目网站。官方Linux内核中ACPI的版本实际上已经远远落后于最新的版本,因为linux稳定版中对任何新特性的加入都是非常小心谨慎的。你可以从这里下载最新的ACPI补丁。
  3. Linux核心源代码目录:Documentation/power/,里面有开发人员写的一些关于电源管理在Linux上实现的文档。
  4. http://www.suspend2.net:Software Suspend 2的官方网站,STD的另一个解决方案。

如果不支持APM,就显示“No APM support in核心”。这时,先检查是否有/proc/apm。如果没有,检查是否运行安装APM后的核心。如果你把APM作为了一个模块,检查是否加载这个模块。 apm还能用-S/-s分别进入备用(Standby)和悬挂(Suspend)状态。

金沙棋牌 2

图1

图1是KDE系统界面,它采用APM来检查电池容量,还可以管理其他硬件的节能模式(图2),并在任务栏显示。进一步的了解可到www.linuxdoc.org。

2、ACPI

linux对ACPI的支持较好,而且相关的文档也比APM的要多。

ACPI的权威网站是

金沙棋牌 3

图2

Pmtools里面有个命令是Pmtest,它让你检测设备。一般地,它显示你系统里的ACPI设备,并能让你对它们进行“悬挂”或“备用”处理。它必须用root来运行。

/pmtools/pmtest

VGA (D0)

keyboard (D0)

PCI 0×0 (D0)

system 0×0 (D0)

看来,VGA显示器、键盘、PCI总线和系统都被识别为ACPI设备。它们的状态都是D0,就是活动状态。我们可以把状态设为D1/D2 (耗电最小化)或D3 (完全关闭)。比如:

/pmtools/pmtest -d1 VGA

现在显示器应该变黑。这并不会让显卡停止产生视频信号(显示器也表示有输入信号),只是把信号全部转变为黑色。/pmtools/pmtest -d0 VGA可以恢复。

上面我们仅仅是举了几个例子,大家可以举一反三,管理好您的系统,充分发挥出高级电压管理功能。

...

本文由金沙棋牌发布于操作系统,转载请注明出处:linux系统的休眠与唤醒简介,电源管理ACPI

关键词: