高级配置和电源接口 (ACPI) 是笔记本电脑、台式机和服务器系统最广泛使用的电源和配置接口。它也非常复杂,当前的规范超过 500 页。 不用说,选择支持 ACPI 的操作系统需要大量的额外软件支持,包括根本的操作系统(operating system,OS)架构更改。 ACPI 的定义和实现所付出的努力是值得的,因为它为操作系统(以及最终用户)提供了极大的灵活性来控制电源管理策略和实现。
当然,电源管理最初根本不是 PC 平台的一部分。早期的移动计算机只是在最宽松的意义上才是移动的。有些甚至没有电池。如果有,它们也只能在远离交流电源插座的情况下短暂运行。从软件的角度来看,PC 的第一个操作系统 DOS 通常根本没有意识到它是在移动 PC 上运行。 很早的时候,制造商通过实施对“挂起到 RAM”功能和 LCD 屏幕关闭的支持来增加其系统的价值。 具有移动功能的早期 CPU,从 Intel 80386SL 开始,添加了特殊的系统管理模式 (SMM),其中固件(也称为 BIOS)可以更轻松地执行电源管理和其他功能,而无需操作系统支持。
由英特尔和微软在 1992 年创建的高级电源管理 (APM) 接口,标志着固件首次以明确定义的方式向操作系统公开电源管理接口。这使得操作系统可以执行用户友好的操作,例如在用户界面中显示剩余电池信息,并允许操作系统控制电源管理的某些方面,例如请求系统进入挂起状态。 其他功能(例如屏幕关闭)继续仅由固件处理,并且在所有情况下,固件都执行系统进入挂起的实际硬件特定机制。
APM 对操作系统实现者的优势也反映了它的劣势。虽然支持 APM 很简单,但该接口不是很灵活。(例如,APM 的电池状态接口将电池信息(可能来自多个电池)聚合为单个“剩余分钟数”值。)APM 对操作系统的要求很少,但以不透明的方式完成所有操作,没有操作系统监督(例如挂起)。最后,APM 接口需要实模式 BIOS 调用。由于操作系统正在迅速完全采用 32 位保护模式,这是一个重大问题。
ACPI 1.0 由英特尔、微软和东芝于 1996 年开发。它的设计目的是解决 APM 的缺点,但它并没有止步于此。它还包含了许多其他系统配置接口的功能。在 ACPI 之前,系统会通过调用固件向操作系统报告内存,通过固件放置在内存中的表(多处理器规范表)枚举 CPU 和中断信息,并通过即插即用 BIOS 枚举其他设备和总线。ACPI 取代了所有这些。它还隐藏了平台电源管理细节
然而,ACPI 最雄心勃勃的改变是为了响应 APM 依赖于不透明固件调用的固有问题。这些被认为是有害的,因为这意味着操作系统不再完全控制系统:对固件的调用可能需要很长时间才能返回,或者做一些意想不到的事情,甚至永远不会返回。固件由于系统与系统之间的差异,以及由系统制造商而不是操作系统供应商编写,一直被认为是可疑的。通过调用它,操作系统的稳定性和可靠性已变得依赖于固件的质量。
ACPI 并没有使打破操作系统对固件的依赖成为可能,但它确实使以更小的程度依赖它成为可能。做到这一点的关键方法是引入 ACPI 源代码语言 (ASL) 和 ACPI 机器语言 (AML)。ASL 和 AML 允许固件向操作系统传达在其平台上执行操作所需的步骤,然后操作系统负责实际执行它们。
这可能看起来有点让人想起 Java 所做的事情,而且应该如此。可以将另一种更著名的字节码解释语言和 AML 之间进行许多类比。用 Java 编写的程序被编译成 Java 虚拟机 (JVM) 的机器指令。运行时,这些操作码在抽象硬件与程序并防止其损害系统其余部分的环境(Java 运行时环境)中被解释和执行。该环境为 Java 程序提供接口,以安全地使用系统资源。
ASL 是人类可读的源代码,就像 Java 源代码一样。AML 是 ASL 的编译版本,就像 Java 一样被编译成字节码。AML 被解释,就像 Java 字节码一样,在沙箱中。然而,这两种技术在目的上差异很大。Java 环境的目标是将操作系统和硬件特定的细节从解释的字节码中隐藏起来。AML 的功能恰恰相反。它是完全特定于平台的,其目标是将硬件特定的细节从操作系统中隐藏起来。事实上,AML 专门设计用于描述硬件和访问硬件的步骤。
Java 和 AML 都抽象了一些东西,但它们抽象了不同的东西(见图 1):Java 将操作系统接口隐藏在标准接口后面的应用程序;AML 将平台硬件细节隐藏在标准控制方法名称后面的操作系统。
例如,假设给定系统的电池状态可以通过读取位于 X 的 I/O 端口来获得。不同的系统可能将此端口位于不同的地址,或者可能具有完全不同的方法来获取电池状态。在 APM 下,操作系统将调用 APM 电池状态功能,固件将知道读取端口 X,然后返回读取的值,将控制权交还给操作系统。使用 ACPI,固件将在具有已定义名称 _BST 的“控制方法”中描述获取电池状态的步骤。操作系统将在其 AML 解释器中执行 _BST 控制方法。在这种情况下,AML 将描述端口 X 的读取,解释器将执行此操作。最后,解释器将返回电池状态。在不同的系统上,_BST 控制方法很可能最终会做完全不同的事情来获得相同的信息。
这可能看起来像是责任的微不足道的转移,因为 APM 和 ACPI 都依赖于固件,但是解释由固件描述的操作码而不是调用固件具有几个重要的优势。
所有这些都是将操作系统从系统的特定实现细节中抽象出来的非常巧妙的机制,但这仍然只是一个接口——它本身不做任何事情。实际控制系统电源策略的操作系统代理被称为操作系统的电源管理 (OSPM),无论它采用何种形式。例如,OSPM 的工作是调用返回电池状态的 _BST 控制方法,并实际根据该信息执行某些操作。许多操作系统可能会在电池驱动程序中实现特定于电池的代码,但从概念上讲,它仍然是整体操作系统电源策略(也称为 OSPM)的一部分。
APM 开启了操作系统参与电源策略决策的趋势;ACPI 将所有责任都交给了操作系统。事实证明,这很有道理,因为操作系统通常最能了解系统的总体运行状态。如果设备处于空闲状态并且可能会被关闭以节省电量,则很可能是操作系统或该设备的驱动程序最能注意到这一点并实际将其关闭。操作系统可以选择呈现 UI(用户界面),以便用户可以指定特定的电源首选项,或者可能不这样做,但操作系统拥有最终决定权。
一个特别感兴趣的领域与将系统挂起到内存或磁盘有关。ACPI 实现了使系统进入睡眠状态的机制,但与其前身不同,它依赖 OSPM 实际停用并保存系统上所有设备的状态,以准备睡眠。这为操作系统在优化睡眠进入和退出过程方面提供了很大的灵活性,但这大多数操作系统在开始实施 ACPI 支持时往往缺乏的能力。因此,必须添加此功能,这可能是一项相当大的任务。
Microsoft Windows 2000 是第一个完全支持 ACPI 和操作系统导向的电源管理的操作系统。Windows 2000 构建在 Windows NT 4 代码库之上,显着修改了现有的 NT 设备驱动程序编程接口。他们的新驱动程序 API,称为 Windows 驱动程序模型 (WDM),减轻了驱动程序编写人员在旧模型下存在的一些要求,但在其位置添加了其他要求,最值得注意的是支持电源管理和即插即用 (PnP) 操作。这些额外的代码通常是可管理的,但此更改要求驱动程序编写人员熟悉新模型并更新所有现有驱动程序以支持新接口。
虽然 WDM 将它们视为逻辑上不同的,但在驱动程序模型中添加即插即用支持是电源管理的先决条件。操作系统必须完全了解设备父子关系,以便它可以按正确的顺序对设备进行断电以正确睡眠和唤醒。例如,PCI 总线上的设备应在睡眠时在父总线的电源之前关闭,并且仅在父总线再次激活后才在从睡眠中唤醒时打开。
Windows NT 的驱动程序模型不足以完成此任务。虽然它确实有一个分层驱动程序模型,但它用于建模系统物理设备关系以外的目的。Windows 2000 改变了这一点。WDM 没有让驱动程序寻找自己的设备,而是添加了一种特殊类型的驱动程序,称为总线驱动程序。WDM 总线驱动程序负责枚举其子设备。例如,PCI 总线驱动程序会找到连接到 PCI 总线的所有 PCI 设备。总线驱动程序不是让驱动程序探测自己的设备,而是在总线上找到其设备的实例时告诉它们。
这导致操作系统拥有系统上所有设备的树。总线驱动程序构成树的内部节点,叶节点是系统设备的实际功能设备驱动程序。操作系统现在有足够的信息来正确地在系统上的设备之间排序电源事件。
虽然过渡到 WDM 并非易事,但对于原始 NT 驱动程序模型的设计来说,这也是一个了不起的致敬,它不需要进行更多更改来适应 WDM 所涉及的基本功能的巨大变化。
Linux 的设计理念与 Windows 非常不同。最值得注意的是,与 Windows(其驱动程序接口是设计的)相比,Linux 驱动程序模型是通过漫长的进化过程发展而来的。此外,几乎整个驱动程序源代码都与核心内核例程一起发布,并且定期发布源代码。
这产生了一些积极的结果。首先,无需维护旧版接口。如果需要更改接口,那么它和所有使用它的地方也可以相对容易地更改。其次,更改会在各种机器上快速测试,并且可以快速发现和报告错误。因此,下一轮更改可以合并来自这些报告的反馈。
这些优势已被证明至关重要,因为最初 Linux 缺少通用设备驱动程序接口。各个子系统(例如 PCI 和 USB)必然开始开发特定于子系统的类似 PnP 的接口,但是没有系统范围的方式来查看系统上的所有设备以及它们如何相互连接。
即将发布的 Linux kernel 2.6 将包含将系统所有设备捆绑在一起的统一设备树所需的框架。这由几乎从头开始实现的全新接口组成,但是快速的开发过程及其废除过时接口的自由导致在短时间内取得了很大进展。虽然它尚未完成,但剩下的主要任务是 Windows 也必须忍受的任务:将所有驱动程序转换为新的驱动程序模型。
在现代系统中,要被认为是功能齐全的,OSPM 必须处理各种设备和一般职责
CPU 电源管理值得特别关注,因为它对于在移动系统上获得良好的电池寿命至关重要。CPU 在执行时会消耗大量功率,并将热量散发到其周围环境中。OSPM CPU 电源管理不仅必须使 CPU 功率尽可能低,而且还必须考虑其策略对系统的性能和热影响。OSPM 可以使用多种技术来控制 CPU 功率,从而延长电池寿命。
第一个是通过处理器电源状态,称为 C 状态。这些状态可以在系统空闲时进入,并将 CPU 电源降至不同的程度。最初,定义了三个 C 状态:C1 到 C3,其中 C0 定义为“运行”。这些状态提供逐渐增加的节能效果,但是进入这些状态的进入和退出时间也增加了。因此,使用 C 状态可以在 CPU 空闲时节省电量,但重要的是不要过于激进;进入过深的 C 状态然后立即被唤醒会导致更差的性能以及不节省电量。通常,在空闲时,采用进入浅 C 状态(例如 C1)并在不中断的情况下逐渐进入更深状态的策略,可以很好地最大化节能效果,同时又不损害性能。ACPI 2.0 使 CPU 供应商在定义其产品支持的 C 状态的能力和数量方面具有更大的灵活性。
控制 CPU 功率的第二种方法是通过节流。节流向 CPU 发送特殊引脚信号,导致 CPU 以较低的有效频率执行。由于功耗与频率成线性关系增加,因此通过节流降低频率也可以节省电量。
通常,如果有选择,OSPM 最好选择使用 C 状态而不是节流来节省电量。这是因为虽然节流降低了功耗,但它也会将 CPU 性能降低到相同的程度。在 50% 节流的 CPU 上,这将导致 CPU 工作负载花费两倍的时间才能完成。通常最好“竞速到停止”——尝试尽快完成工作,然后更快地进入 C 状态。尽管如此,节流对于控制过热的 CPU 可能是必要的。
控制 CPU 功率的最新工具是性能状态。在过去的几年中,CPU 供应商已开始在移动微处理器上提供一项功能,该功能提供电源电压和频率的多种组合。这种电压缩放是一项非常重要的功能,通常,实施其某个版本的 CPU 的营销人员在宣传它时并不羞于启齿。
这起作用的原因是,更高的芯片电压可以使其以更快的速度进行时钟频率。相应地,如果可以接受较低的速度,则芯片不需要那么高的输入电压。因此,降低速度和电压会导致频率降低(就像节流一样)以及电压下降带来的功率降低。这进一步放大,因为物理学决定芯片的功耗与电压的平方成正比。因此,从 1.3V 降至 1.0V 并不会净节省 23% 的电量,而是净节省大约 40% 的电量。
电压缩放为平衡功率和性能增加了另一个难题。现在,CPU 电源策略有大量性能状态可供选择,因此并不总是容易确定平衡功率和性能的最佳方法。优化电源策略的这一领域的工作仍在继续。
自 ACPI 推出以来,计算机硬件并没有停滞不前,创新没有放缓的迹象。这给 ACPI 和移动 PC 的未来提出了一些问题。
在过去的五年中,我们看到了处理器原始频率增加了十倍。如果所有其他条件保持不变,这将导致至少十倍的功耗增加。其他系统组件也消耗更多功率。值得庆幸的是,摩尔定律在缓解这种情况方面发挥了巨大作用(较小的晶体管使用更少的功率),移动专用芯片的努力也是如此,但功率趋势正在上升。未来主要担心的是泄漏功率。与晶体管工作时生产性使用的功率相反,泄漏功率仅由接收功率的电路消耗。晶体管越小,泄漏就越多。它现在正增长到占 CPU 总功率的相当大的百分比,并且只会变得更糟。(有关此内容的更多信息,请参见 Caspar Boekhoudt 在本期第 74 页的“IDE 的大爆炸理论”。)
但是更大的、更好的电池呢?新的储能技术正在兴起,最值得注意的是燃料电池技术。人们对这些技术感到非常兴奋,但是它们的应用障碍需要克服。首先,虽然工作演示燃料电池一直在变得越来越小,但它们仍然不够小,无法安装在尺寸合理的笔记本电脑中。其次,当前的燃料电池在提供长期稳定的电源方面很强大,但还无法处理笔记本电脑通常对其电池提出的大的瞬时消耗。混合电池/燃料电池选项可能会起作用,但这些选项可能会更加笨重。最后,人们将如何看待非电力能源的问题。人们是否愿意花钱“加满”笔记本电脑的油箱以换取更高的移动性?
除了这些硬件问题之外,软件(特别是 ACPI)将在使未来系统能够继续改进功能集、性能和电池寿命方面发挥关键作用。ACPI 使得处理器和其他组件的更积极的电源管理成为可能,但是新的操作系统电源策略思想以及 ACPI 本身的更改对于 OSPM 以最智能的方式管理系统电源资源是必要的。
最后,似乎电源策略责任从固件到操作系统的演变可能不是最终的转变;对于现代处理器,CPU 热条件发生得如此之快,以至于软件无法及时处理它们。硬件必须与操作系统合作来管理此类设备,但是当最初构思 ACPI 时,并没有预料到对这种需求。一个挑战将是平稳地处理向共享责任的新过渡。
移动计算已成为许多人工作和个人生活中不可或缺的一部分,其重要性持续增长。对更高性能、更好电池寿命、创新外形尺寸和无线连接的需求正在以非常快的速度推动硬件和软件开发,并且将来会继续这样做。问
ANDREW GROVER 是英特尔移动产品事业部的高级软件工程师。他曾致力于为 Microsoft Windows 和 Linux 实现许多电源管理功能,并且他是 Linux ACPI 驱动程序的当前维护者。他拥有埃默里大学计算机科学学士学位。
最初发表于 Queue vol. 1, no. 7—
在 数字图书馆 中评论本文
Andy Woods - 数据中心的散热
发电约占美国和英国一次能源供应的 40% 至 45%,其中很大一部分用于建筑物供暖、制冷和通风。该行业中一个新的且日益增长的挑战涉及计算机数据中心和其他用于冷却计算机数据系统的设备。2006 年,美国数据中心使用了大约 60 亿千瓦时的电力,约占该国电力消耗的 1.5%。
David J. Brown, Charles Reams - 迈向节能计算
到目前为止,大多数人都意识到了最高级别的能源问题:我们的主要能源正在耗尽,而商业和家庭环境对能源的需求都在增加,并且能源使用的副作用对全球环境具有重要的考虑因素。温室气体的排放,例如二氧化碳,现在被大多数气候学家认为与全球变暖有关,这只是其中一个问题。
Eric Saxe - 节能软件
电源管理功能的演进速度简直令人惊叹。如今,几乎每种尺寸和级别的计算机系统,从最小的传感器和手持设备到数据中心中的“大型机”服务器,都提供了无数的功能来减少、计量和限制功耗。如果没有这些功能,风扇噪音将主导办公室氛围,并且未连接电源线的笔记本电脑将只能使用几个小时(而且只有在可以处理热量的情况下),而数据中心的电力和散热成本以及容量将变得难以管理。
Alexandra Fedorova, Juan Carlos Saez, Daniel Shelepov, Manuel Prieto - 使用非对称多核系统最大化电源效率
在计算系统中,CPU 通常是最大的能源消耗者之一。因此,在过去几年中,降低 CPU 功耗一直是学术界和工业界的热门话题。为了创建更节能的 CPU,一些研究人员提出了一种非对称多核架构,该架构有望在提供与传统对称多核处理器相似的性能的同时节省大量电量。