让软件更加节电

提交新文章

2008年05月11日 14:03


概述
作者:Andrew Binstock

当前,无线解决方案迅速普及,为软件开发人员带来了新的挑战。几年前还十分简单的客户端软件设计,现在却需要进行重新设计,以满足用户的两大新期望:偶发性连接与节电。英特尔在其偶发连接计算(OCC)计划中解决了这两大重点问题。本站点的其它文章讨论了偶发性连接的影响(请参阅资源部分);本文主要讨论应用设计级别中电源管理的重要性。

电源管理素来被视作由操作系统处理的一项功能。可通过用户可选的设置,并根据 Windows* 的具体版本确定何时将系统转入睡眠状态。终止睡眠状态需要用户交互操作,且无法通过个别操作(例如,通过局域网唤醒)实现。大多数客户机应用尚未提出节电要求,因为用户长时间不操作时,它们可转为睡眠状态。此时,应用不可能活跃运行,由此转入到睡眠状态不会造成不利影响。

这种无视有源电源管理的态度将很快得以扭转。用户购买的笔记本电脑(如具备英特尔® 迅驰™ 移动计算技术的笔记本电脑)中,其独特组件的使用时间都有所延长,而由此,无法节电的应用也将日受冷落。

节电
英特尔® 迅驰™ 移动计算技术平台中的英特尔® 奔腾® M 处理器使用的是与以往的英特尔处理器架构截然不同的全新架构。芯片的突破性技术可将处理器的缓存、甚至其数据输入缓冲器的电源完全切断至少几个时钟周期。这些小型节电措施经过累积即可大大延长一个电池的使用时间。鉴于用户的这一巨大益处,开发人员应在设计客户端应用时,应使奔腾 M 处理器可关闭选中操作,不再被迫执行各种不必要计算。更准确地说,也就是通过减少那些保持处理器运行却对于应用并不关键的操作,实现节电。

应采用何种操作执行这一方式,在很大程度上取决于应用。以文字处理器为例。这要求在用户未打字时对仍在运行的任务进行仔细检查。理想状态下,为了实现节电,在用户没有输入数据或运行特殊任务时,处理器应当关闭。这样,当系统借助电池运行时,诸如重新连接或重新格式化一个文档等后台任务就会延迟或降低运行频率。另外一个示例是数据提取:当系统借助电池运行时,如果应用通过 Web 检查组件更新,这些检查的运行频率可能会降低。同样,将新闻标题发送至桌面可能需要更长的延迟周期。每项措施的可取程度取决于应用的性质,很明显,如今很多线程执行的工作不需要十分频繁,且不会影响客户体验 — 应谨慎评估这些线程。

只有当系统借助电池运行时,用户才应考虑减少操作这一方法。当代笔记本电脑操作系统使开发人员通过系统调用即可确定电池使用情况。例如,在 Windows(Windows 95 之后的所有版本)下,GetSystemPowerStatus() API(在 kernel32.lib 中)提供大量的电源状态信息,包括系统是否借助电池运行。(如需了解有关此 API 的更多信息,请见参考部分。)

从此函数调用返回的字段中,有一个字段为剩余电池功率的百分比。百分比较低时可能会有效促进辅助性任务中功耗更大程度地降低。此时,通知用户相当重要,因为用户可能会重新激活由于低电量而停止的服务。应提供一个选项,以在用户认为需要将电量耗光时借助这一选项拒绝系统的操作,重新激活服务。

遗憾的是,Linux* 电源管理系统调用还没有较为完整的文档资料或良好的支持。多年来,其主要接口为 apm(高级电源管理)。它常与执行附加电源管理功能的一个 daemon(后台程序)— apmd 共同使用。新推出的 Linux* 内核已转为使用高级配置和电源接口(ACPI),这是部署于大多数 PC 机上,由英特尔参与开发的一个电源管理接口。(有关这两个选项的参考信息请见本文末尾部分。)

对睡眠/唤醒转换的响应
笔记本电脑的唤醒和睡眠状态转换有两种类型:进入“待机”或“休眠”模式。(唤醒转换恰好相反。)在待机模式下,应用和相关数据被复制到内存中;对于休眠模式,这些数据条目则被复制到硬盘上。尽管速度较慢,但休眠状态耗电要少得多。)Windows XP 中的用户可选设置支持用户在即将合上笔记本时对转换至何种模式进行指定。

性能良好的软件可对立即转换到休眠模式的信号智能地作出响应。而该如何响应则由应用的性质决定。可参照一些建议:
  • 因为您不知道系统休眠的时候用户会做何操作,您需要保存所有数据以便应用从停止位置重新运行。这包括将临时文件写入到磁盘中、保存状态并配置数据、准确记录转换时用户屏幕上的信息(做何操作、光标所在位置以及有哪些部分突出显示等。)
  • 理想状态下,应用也需关闭所有文件。这样可在系统由睡眠周期直接转入电源完全关闭状态时,保护文件系统不被破坏。一个好办法就是记录每个文件中的应用位置(在 C 中,需使用 ANSI ftell() 函数)。在唤醒状态下,这些文件应在之前存储的位置重新打开。(在 C++ 中,fpos() 函数执行这一操作,在 Java* 中,可以在 java.io 数据包 RandomAccessFile 类中使用 getFilePointer()seek() 方法。)
  • 还可对远程对象和数据库实现同步。
  • 最后,应断开哪种通信信道(调制解调器还是网络)则需根据应用的性质进行评估。
而较之唤醒和睡眠转换期间您所做的操作,可能更重要的是您应确保软件的设计充分考虑了意外休眠的问题。除非您的软件必须保持系统处于唤醒状态(请参看下一章节),否则应确保任何时候都可记录状态和所有相关信息,并能轻松地应对休眠模式。

停止休眠
Windows 可根据由用户选择的一组系统设置自行决定何时将系统转入休眠模式。它可在某项操作未在用户规定期间内执行时选择转入睡眠模式。这些操作为:
键盘输入、鼠标操作、窗口焦点的变化以及服务器操作。不包括下列操作: 磁盘运行、处理器运转以及视频/显示器处理。

一些软件面临的问题是当睡眠/唤醒监控无法监测到主要操作时,应如何保持系统处于唤醒状态。这一问题由执行更长视频处理的软件(如 DVD 播放器)导致,如果睡眠/唤醒未能执行预测,则可能无意中触发休眠模式。主要工作并非面向用户的程序(例如,传真服务器和网络管理控制台)也与其类似。

该问题的正确解决方案是,通知 Windows 正在执行重要操作,不要将系统转入睡眠状态。自 Windows 98 之后,该通知由 SetThreadExecutionState() API 执行。该函数采用 OR'd 的标记,共同识别特殊需求。这些标记可设置成为近永久状态:也就是,与软件运行时间一样长。在本文末尾,我将指出怎样可以获得有关此调用的更多信息。

结束语和作者简介
现在,专用于笔记本电脑的大多数软件可出色适应休眠/唤醒转换。但是,这些软件包通常并未特别考虑到规划工作的需求,使得处理器可关闭并节能。英特尔® 奔腾® M 处理器的诞生使这一切有了转变,特别是由于基于英特尔® 迅驰™ 移动计算技术的笔记本电脑的用户对软件持久的功能持有更高的要求。因此,开发人员 — 特别是独立软件厂商(ISV)的开发人员 — 必须对他们的软件设计重新作出评估。他们尤其需要考虑当系统借助电池运行的时候,可延迟或重设哪项操作。如果他们可以出色地解决这个问题,使得唤醒/睡眠状态顺利转换,他们就会给客户带来最满意的用户体验。

作者简介

Andrew Binstock 现任 Pacific Data Works LLC 首席分析师。此前,他负责 PricewaterhouseCoopers 的全球技术预测工作。他与 John Rex 共同编写了《开发人员实用算法》在 Addison-Wesley 已印刷了 12 次,并在 30 多所大学作为计算机科学程序教材使用。可通过 abinstock@pacificdataworks.com 与他取得联系。

资料来源与参考
可通过以下地址,获得有关电源管理的主要 Windows 系统调用的完整文档 http://msdn.microsoft.com/library/default.asp?url=/library/en-us/power/base/getsystempowerstatus.asp*

用于保护转入休眠状态的 Windows API: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/power/base/setthreadexecutionstate.asp*

某些系统的启动脚本详见: http://www.comptechdoc.org/os/linux/startupman/index.html*

有关 ACPI 接口,详见 http://www.acpi.info/*。该站点包括到 Linux 和 Windows 信息与工具的链接。英特尔面向 PC 操作系统设计人员提供的更多 ACPI 工具: http://developer.intel.com/technology/iapc/acpi/downloads.htm