一、电脑的高级电源管理

1.什么是ACPI
  ACPI是Advanced Configuration and Power Interface的缩写,中文意为“高级配置与电源接口”,这是微软、英特尔和东芝共同开发的一种工业标准。
ACPI主要可实现以下功能:
①用户可以使电脑在指定时间开、关;   
②即插即用设备在插入时能够由ACPI来控制,并为其供电;
③在无人使用电脑时可以使电脑进入休眠状态,但保证一些通信设备打开;
④操作系统可以根据外设和主板具体需求为它分配能源;
⑤操作系统可以在应用程序对时间要求不高的情况下降低时钟频率;
⑥使用笔记本电脑的用户可以指定电脑在低电压情况下进入低功耗状态,以保证重要应用程序运行。   
  同时,可将ACPI分为六种不同的工作状态,分别是S0到S5,它们代表的含义分别是:
S0:电脑正常工作,所有硬件设备全部处于打开或正常工作的状态;
S1:也称为POS(Power on Suspend,CPU停止工作),其他的硬件设备仍然正常工作;
S2:将CPU关闭,但其余的硬件设备仍然运转;
S3:通常称为STR(Suspend to RAM,挂起到内存),将运行中的数据写入内存后关闭硬盘;
S4:也称为STD(Suspend to Disk,挂起到硬盘),内存信息写入硬盘,然后所有部件停止工作;
S5:所有硬件设备(包括电源)全部都关闭,也就是关机。

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

3.BIOS中的电源管理设置  一般而言,主板产商定义BIOS的默认设置都是启动了“高级电源管理”这个功能的,大多数情况下不需要我们自己设置,只需采用其默认设置即可。如果碰到以前能使用“高级电源管理”,但后来又不行了,排除系统或其他硬件可能外,才会考虑BIOS中的设置是否有问题。遇到这种情况,可以将BIOS设置还原到默认状态即可,方法为:启动电脑,用DEL键进入BIOS,用键盘上方向键定位到“Load Optimized Defaults”,然后按F10保存并退出BIOS设置即可。这里以Intel845PE主板为例,其他类型主板大致相同,这里仅作为参考。
“Power Management Setup”常见设置举例

ACPI Function:是否允许ACPI功能


  ACPI Suspend Type:ACPI的挂起类型,通常这里只有一个选择,即S1(POS)状态,其实这个就包含了其他的挂起状态(S2、S3、S4)

  Power Management:电能管理方式,默认为User Define(用户自定义),还有就是Min Saving(最小)和Max Saving(最大)

Video Off Method:显示器开关
  可以设置的值:Blank Screen表示显示器不发射电子光束,即可减少耗电;V/H SYNC+Blank表示除Blank Screen外,还可由BIOS来控制显示器水平与垂直同步信号,达到省电目的,此项为默认设置;DPMS Support,DPMS是显示器与显卡之间的电源管理协定。在两者都支持DPMS的状态下,只要BIOS支持,显卡即可通过信号通知显示器进入省电模式。

  HDD Power Down:设置IDE硬盘在多长时间内完全没有读写操作时,便可进入省电状态,切断硬盘电源以省电,缺省值为Disabled。

  Modem Use IRQ:该选项说明Modem使用的端口所占用的IRQ编号,让系统在省电状态下仍可以监视。Modem是否有活动,可以设置的值:N/A、3、4、5、7、9、11。其中N/A表示不对Modem进行监测;

  USB KB Wake-Up Drom S3:是否采用USB键盘唤醒,缺省值为“Disabled”。

  Soft-Off by PWR-Button:这是机箱电源开关的功能设置,在开机状态下,按住开机电源按键超过四秒钟,系统就一定会关机,如果不超过4秒,系统就会按此设置操作。可以设置的值:Delay 4 Sec表示超过4秒关机,如果不超过4秒则进入Suspend模式,此项为默认设置;Instant-Off表示不需要等待4秒,只要按下关机按钮立刻关机。

待机、休眠是怎样工作的
1.为什么需要待机、休眠
  尽管电脑硬件运行速度越来越快,但操作系统的体积也在不断膨胀,使得电脑开、关机时,启动、关闭的程序越来越多,花费时间也越来越漫长。因此如何让电脑能够快速启动、一开机就进入Windows,就成为用户关心的问题。
  于是,随着硬件和软件的升级,操作系统开始引入了高级电源管理,其作用就是在电脑闲置时关闭部分设备,将电脑进入等待休息状态,这样当需要重新使用电脑时,能够直接从等待休息状态尽快恢复到原先的工作状态,起到类似于快速启动的效果;同时,不用电脑时还能节省不少电能。

2.把数据存到内存中——待机
  我们都知道,从硬盘读取数据的速度远低于从内存读取的速度。因此,电脑运行时首先是将硬盘中的数据提出并存到内存中,然后再由内存将数据发送到CPU中进行处理,接着处理后的数据将先返回内存,再写进硬盘。正在运行的数据几乎都保存在内存中。然而,进入待机状态也就是将当前数据保存在内存中,然后将硬盘关闭,也就是挂起到内存(Suspend to RAM,简称STR)。
  这时除硬盘外,其他设备还是处于加电等待状态(也就是说唤醒时无须重新加电,通俗地说就是原地待命),所以电源、CPU、显卡等设备的风扇还是处于工作中,键盘指示灯也是亮着的。我们可以通过按键盘任意键或动一下鼠标来唤醒电脑,这时硬盘就会重新加电并启动,然后和内存、CPU等设备交换数据,从而完成返回到原来工作状态的任务。

3.将内存装进硬盘——休眠
  休眠,在广义上包括挂起到内存(STR,也就是待机)和挂起到硬盘(Suspend to Disk,简称STD)两种,而我们通常所指的休眠其实是STD。当电脑进入休眠状态时,电脑首先将内存中的状态复制到硬盘,然后关闭电源。此时电脑几乎和通常关机一样“安静”,你完全可以切断电源,因为保存到硬盘里面的数据不会由于断电而丢失!它和Ghost给系统做镜像的道理一样,不过与Ghost不同的是:Ghost保存并恢复的是整个系统信息,而休眠保存并恢复的是系统运行的信息。与待机相比,休眠是不能通过外部设备来唤醒的,它和正常开机一样启动电脑;不过和开机相比,休眠后启动电脑无需一个一个进程地来启动,只须要将硬盘中的内存镜像读取到内存中即可。
  由于内存中的资料就是电脑当前的“状态”,为保持这个状态不变(可理解为不能压缩),系统必须在硬盘中开辟一个和内存容量大小相等的空间以保证能装下整个内存的“当前状态”,而这个空间的名字就叫hiberfil.sys,它的体积一般为物理内存的大小(比如电脑的内存是256MB,这个文件的体积也将是256MB,如图1),和我们管虚拟内存叫做pagefile.sys道理是一样的。

二、一些电源相关的命令及函数

A、调用系统电源管理: rundll32.exe shell32.dll,Control_RunDLL powercfg.cpl
B、直接休眠:rundll32.exe powrprof.dll,SetSuspendState
C、电源管理命令:powercfg
  powercfg /a             生成一个报告,说明系统支持的电源模式
  powercfg /hibernate on  启用休眠功能(系统支持的话,XP对大于1G内存的需要打补丁).

D、一个让Windows进入Suspend并且重新Wakeup系统的范例
下面这个程序主要运用了WaitableTimer及SetSusepndState这两个系统函式。您可以藉由这个范例知道如何让系统进入suspend或是hibernate模式。并且可以指定计算机在指定的时间重新启动。如果是进入hibernate模式,系统回复时,将会回到原来执行的状态。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import ctypes
import win32event
import win32api# Create a waitable timer to notify system back from suspend or hibernate mode.
h = ctypes.windll.kernel32.CreateWaitableTimerA(None, False, None)# wait for 10 seconds.
waitSeconds = -10L * 10L**(9-2)
dt = ctypes.c_longlong(waitSeconds)
dt_p = ctypes.pointer(dt)# Set the timer. The last parameter must be True or system can't be resumed by the timer.
ctypes.windll.kernel32.SetWaitableTimer(h, dt_p, 0, None, None, True)# latency
#    [in] The latency requirement for the time is takes to wake the computer. This parameter can be one of the following values.
#        Value                 Meaning
#        LT_LOWEST_LATENCY(1) PowerSystemSleeping1 state (equivalent to ACPI state S0 and APM state Working).
#        LT_DONT_CARE(0)         Any latency (default)
latency = 0
ctypes.windll.kernel32.RequestWakeupLatency(latency)# Hibernate
#    [in] If this parameter is TRUE, the system hibernates. If the parameter is FALSE, the system is suspended.
hibernate = True# ForceCritical
#    [in] If this parameter is TRUE, the system suspends operation immediately; if it is FALSE, the system broadcasts a PBT_APMQUERYSUSPEND event to each application to request permission to suspend operation.
forceCritical = False 
# DisableWakeEvent
#    [in] If this parameter is TRUE, the system disables all wake events. If the parameter is FALSE, any system wake events remain enabled. 
disableWakeEvent = Falsectypes.windll.powrprof.SetSuspendState(hibernate, forceCritical, disableWakeEvent)
# Close the timer.
win32event.WaitForSingleObject(h, win32event.INFINITE)
win32api.CloseHandle(h)# EOF.

E、SetWaitableTimer补充:


http://www.vckbase.com/document/viewdoc/?id=1587

  关键部分:


__int64         qwDueTime; 
 
   LARGE_INTEGER   liDueTime; 
  
  
 

           // Copy the relative time into a LARGE_INTEGER. 
 
         liDueTime.LowPart = (DWORD) ( qwDueTime & 0xFFFFFFFF ); 
 
         liDueTime.HighPart = (LONG) ( qwDueTime >> 32 );


 

用绝对时间:

FILETIME ftUTC;
 SYSTEMTIME st;
 LARGE_INTEGER t;
 __int64 fm=10000000;
 GetSystemTimeAsFileTime(&ftUTC);
 t.HighPart=ftUTC.dwHighDateTime;
 t.LowPart=ftUTC.dwLowDateTime;
 t. QuadPart+=(__int64)seconds *  fm;