提供多媒体计时器支持的指南

本文提供关于新的系统计时器(芯片组用来替换旧式计时器并满足时间敏感的应用程序的需求)要求的信息。系统计时器是操作系统用来执行跟踪时间和触发基于时间的事件等核心任务的计时器。本文不适用于 watchdog 计时器和视频卡计时器等外围设备计时器。

本页内容

简介  简介
当前的计时硬件  当前的计时硬件
需要新计时器的原因  需要新计时器的原因
High Precision Event Timer  High Precision Event Timer
计时器要求  计时器要求
行动指南  行动指南
术语表  术语表

简介

自从个人计算机诞生以来,处理器速度增加了至少两个数量级,应用程序变得越来越复杂。这种演变对如今个人计算机计时硬件的精度和性能方面提出了新的要求。试图在当前系统上满足这些要求会迫使开发人员为了克服当前计时硬件的限制而牺牲应用程序质量和整体系统性能。要为应用程序提供真正的支持并在将来支持更复杂的应用程序,系统计时器硬件必须提供至少 1 毫秒的精度和非周期性功能。

虽然使用当前计时器硬件在理论上可以实现 1 毫秒精度和非周期性功能,但实际上,要在保持合理系统性能的情况下实现这种级别的精度和利用这种功能不太可能。要使得这种级别的精度和功能成为现实,需要一个新的计时器来替换当前使用的旧式计时器。新的高精度事件计时器 (High Precision Event Timer,HPET) 拥有极高的精度、快速的访问速度以及对非周期性行为的支持。

返回页首 返回页首

当前的计时硬件

个人计算机当前使用四个用于不同任务的系统计时器,每个计时器都有自己独特的属性集,这使得这些计时器之间难以协调工作。当前使用的计时器如下:

8254 PIT
8254 Programmable Interval Timer (PIT) 于 1981 年在 IBM PC 中引入。精度为 1 毫秒,同时支持周期和非周期模式。但是,因为读写此硬件需要通过 IO 端口进行通信,所以对其进行编程需要几个周期,这对于操作系统而言代价过高。因此,实践中不使用非周期性功能。由于这个原因,该计时器仅在周期模式中用来在单处理器系统上提供周期性的时钟中断。

RTC
1984 年,继 8254 之后,IBM-AT 发布第一个实时时钟 (RTC)。与 8254 类似,RTC 的最大精度为 1 毫秒,同时支持周期和非周期模式。与 8254 一样,与此硬件通信也通过 IO 端口进行,因此代价过高。正如 8254 一样,与此时钟通信的高成本妨碍了非周期功能的使用。除了这些限制,RTC 会在支持 ACPI 的系统上生成 ACPI 中断,这降低了系统性能。RTC 在周期模式中被用来在单处理器系统上提供系统配置中断,在多处理器系统上提供时钟中断。

APIC 计时器
Advanced Programmable Interrupt Controller (APIC) 计时器具有实时时钟的大部分能力,可以同步多个处理器,但是它精度很低并且时钟硅片问题较多。因为系统在很长时间中仍然没有 APIC 计时器,所以默认情况下不使用它。更重要的是,在一些实现中该计时器会在处理器电源管理期间暂停,这使其无法在现代系统上保证可靠的时间。出于这些原因,该计时器很少使用。

PM 时钟
ACPI 计时器(也称为 PM 时钟)被添加到系统体系结构中来提供与处理器速度无关的可靠时间戳。因为这是该计时器的唯一目标,所以它设计为在一个时钟周期内提供一个时间戳,而不提供任何其它功能。

返回页首 返回页首

需要新计时器的原因

如今的系统需要非周期功能和更高的精度。如果没有这两个功能,系统将无法满足将来的多媒体应用程序和其它时间敏感的应用程序的要求。提供这种功能的新计时器将替代 8254 计时器、RTC、PM 时钟和 APIC 计时器,并且将允许删除芯片组中的一些冗余的旧式硬件。

非周期功能

当前计时支持
Microsoft Windows XP 使用一个周期性时钟中断来跟踪时间、触发计时器对象和递减线程时间量。当 Windows XP 启动时,典型的默认时钟中断周期是 10 毫秒(在一些系统上使用 15 毫秒的周期)。这意味着操作系统每 10 毫秒从系统计时器硬件收到一个中断。

当触发时钟中断时,Windows 执行两个主要的操作:如果已经经过完整的周期,它将更新计时器计数;检查计划的计时器对象是否到期。计时器计数是所经过时间的抽象概念,Windows 用来持续跟踪时间和线程时间量。在大部分系统上,计时器计数表示 10 毫秒,但也有一些系统使用 15 毫秒作为计时器计数周期。默认情况下,时钟中断和计时器计数相同,但是操作系统或应用程序可以更改时钟中断周期,而计时器计数周期从不改变。因此,不管底下的时钟中断周期为多少,计时器计数始终表示一个不变的周期。

除了维护计时器计数之外,当触发时钟中断时,系统还检查是否有一个计时器对象到期,如果找到一个到期的计时器对象,系统将安排一个计时器延迟过程调用 (DPC)。系统使用计时器对象跟踪截止时间并在到达截止时间时通知应用程序。例如,一个播放同步的音频和视频的多媒体应用程序可能请求在 233 毫秒内执行一些代码(例如,播放一段声音)。Windows 通过创建一个计时器对象来跟踪该请求。然后,它在生成时钟中断时检查到期的计时器对象。但是,如图 1 所示,如果时钟中断周期为 10 毫秒,那么操作系统实际上将延迟 7 毫秒播放这段声音。操作系统在 230 毫秒时检查其计时器对象并发现没有任何计时器对象到期,然后在 240 毫秒时发现未决的请求。在这种情况中,时钟中断的间隔时间太大,最终用户将感觉到音频/视频同步问题。

图 1. 每 10 毫秒触发的周期性中断gg463347.mm-timer1(zh-cn,msdn.10).gif

这种实现方式的明显缺点是:大时钟中断周期会导致长时间延迟。对于当今系统上需要精度更高的通知的应用程序,它必须请求一个更小的时钟中断周期。在前面的例子中,如果多媒体应用程序想要其代码及时执行,它应该请求一个 1 毫秒的时钟中断周期。然后,系统将每毫秒检查是否需要进行一些操作,如图 2 所示。

图 2. 每 1 毫秒触发的周期性中断mmtimer2

虽然这种方法允许多媒体应用程序及时执行其代码并播放声音,但是它也降低了系统的整体性能。Microsoft 测试表明,虽然将计时器计数频率降低到 2 毫秒对系统性能影响甚微,但是如果计时器计数频率小于 2 毫秒,那会极大地降低系统的整体性能。在更快的系统上,将时钟中断周期降低到 2 毫秒以下的代价可能可以承受,但是缓存一致性和电源管理方面增加的中断频率带来的影响可能不合心意。

将来的非周期性支持
在前面的例子中,时钟中断周期被降低到 1 毫秒,以在精确的时间点播放声音。这导致在 230 毫秒和 240 毫秒之间生成 10 个中断(虽然实际上只需要一个中断)。这个问题更好的解决方法是,只在要进行某种操作时安排一个非周期性的计时器中断。这样,计时器仅在 233 毫秒时触发一次中断,系统不会将时间浪费在处理不必要的中断上。图 3 演示了这种行为。

图 3. 在请求的特定时间触发非周期性中断 mmtimer3

除了性能优势之外,非周期性功能对于移动平台上可实现的电池寿命也非常有益。当前,在没有任何系统活动时,移动系统进入低电量状态,但是当系统时钟生成周期性中断时它们将逐渐变回高电量状态。要延长移动系统可以保持在低电量状态的时间从而延长电池寿命,系统设计人员目前在尝试增大系统时钟的周期。这将允许系统长时间保持在低电量状态,但是它也将导致预先安排的事件启动延迟。在电源管理和那些应用程序之间进行折衷的办法是,系统在不需要进行任何操作时保持完全休眠,仅在生成安排的任务或警报时才唤醒。非周期性功能支持这种最理想的解决方法。

因为对现有计时器编程的代价高昂,所以非周期性功能仅在具有改进定时器的系统上才实用。

改进的精度

当前定时器在理论上最大精度为 1 毫秒,出于性能考虑,可实现的精度为 2 毫秒。此外,现有的定时器可以达到最多 1 毫秒的延迟,这意味着应用程序可以依赖的最高精度是 3 毫秒。但是,多媒体应用程序需要至少 1 毫秒的精度;因此,虽然在理论上现有的定时器可以适应当今的多媒体应用程序,但实际上还不能满足这一最低要求。

为了在装有当前计时硬件的系统上获得容许的多媒体性能,开发人员不得不使用一些特殊的手段和技巧,例如大重放缓冲区和忙等待 (busy waiting),这些技巧通过牺牲性能和质量来掩饰计时硬件的缺点。由于这些手段和技巧,带有当前计时硬件的普通系统上的多媒体应用程序绝对无法实现用户向专用单元要求的高品质性能和高级别响应。

高清晰度视频回放和同步需要 1 毫秒的精度来解码和完美地同步视频帧和音频流。高级图形包需要微秒级的精度,从而可以正确地模拟口型以匹配说出的词语。嵌入式解决方案和高速软设备(例如软 DSL)都需要微秒级的精度。要满足多媒体程序和其它时间敏感应用程序的要求,需要一个新的计时器,该计时器至少可以每毫秒生成中断,不会过分偏差,也不会在几毫秒以后生成中断。

因为时间敏感的应用程序和解决方案是 Microsoft 未来战略的关键组成部分,所以 Windows 硬件徽标计划最终将对高精度事件计时器的存在和质量提出要求。

遗留技术缩减

虽然当前的计时器仍然在使用并且仍然运行正常,但是它们不满足时间敏感的应用程序的要求并且依赖于工业标准体系结构 (ISA) 总线等遗留技术。要从这些遗留技术过渡过来并消除芯片组中的冗余硬件,需要一个新的计时器来替代现有的硬件。

返回页首 返回页首

High Precision Event Timer

High Precision Event Timer (HPET) 由 Intel 和 Microsoft 联合开发,用来满足多媒体程序和其它时间敏感应用程序的计时要求。最初,HPET 被称为 Multimedia Timer (MM Timer),但是后来这个名称被更改,以避免与 Microsoft DirectX 计时器混淆,也能更好地描述该计时器。

HPET 的好处
Microsoft 测试工程师对典型 HPET 硬件的实验表明,除了扩展系统的能力和精度之外,HPET 还提高了系统性能。

在一次比较 HPET 性能和 PM 时钟性能的测试中,执行了一个调用用户模式 QueryPerformanceCounter() API 一千次的函数并予以计时。为了确保结果具有可比性,该测试在单个系统上进行了多次。在相同硬件上执行了使用内核模式 KeQueryPerformanceCounter() API 的类似测试来确定新计时器的内核模式优势。表 1 显示这两个实验的结果。

表 1 HPET 和 PM 时钟性能之间的比较

基准点为 1000 次连续的 [K]QPC 调用

PM Clock[调用次数/毫秒][微秒数/调用]

HPET[调用次数/毫秒][微秒数/调用]

使用 HPET 的性能增加

QueryPerformanceCounter()

6301.59

7841.27

24%

KeQueryPerformanceCounter()

11940.84

19200.59

61%

这些数据显示通过 HPET 读取时间戳比旧式定时器更有效更快速。但是,由于测量需要的更高的精度,HPET 及其对应用程序带来的实际性能提高无法量化。

迁移到 HPET
下一代芯片组将需要同时支持 HPET 和旧式计时器。这种方法将在迁移到新计时器的同时保持与 Windows XP 和更早版本 Windows 的兼容性。但是,芯片组最终将不再支持传统的 8254 计时器、PM 时钟和 APIC 计时器。

HPET 的 Windows 支持
一开始,在装有 HPET 的系统上,所有 Windows 计时器 API 都将被移植到新硬件,不再使用传统的 8254、RTC、APIC 或 PM 时钟。在 HPET 被广泛使用后,将扩展 Windows 计时器 API 并增强底层 Windows 计时器代码来利用 HPET 的增强功能。

返回页首 返回页首

计时器要求

芯片组供应商应该实现一个 HPET 以符合 Intel 的 "IA-PC HPET (High Precision Event Timers) Specification"。该规范及其免费许可条款于 2002 年第二季度在 Intel 网站上提供。

Microsoft 正在将 HPET 的要求添加到 Windows 硬件徽标计划中,用来检查芯片组中 HPET 是否存在及其质量。虽然尚未为徽标计划何时将需要此硬件安排时间,但是 Windows Hardware Quality Lab (WHQL) 测试将在 Windows Vista 发布的时间帧内开始测试 HPET 的质量(如果实现)。Intel 的 HPET 规范中说明的一些要求在下文再次阐述。

微秒粒度和纳秒精度

如同 Intel 的 HPET 规范中所述,HPET 应该具备可编程的粒度。另外,计时器应该具有纳秒级的精度从而不会延迟生成或递交中断,并且应该偏差很小从而统一可靠。

主计数器和比较器

单调递增计数器
High Precision Event Timer 的主计数器应该是频率至少为 10 兆赫 (MHz) 的单调递增时钟。

独立的比较器
计时器应该至少有三个比较器寄存器,每个寄存器都生成独立的中断,从而可以独立地使用每个比较器。

独占的中断
除了生成独立的中断之外,每个比较器都必须有一个 LegacyIRQRouting 模式的唯一的(非共享的)、界限触发的中断。这是由于在常规操作期间计时器中断被广泛使用,并且处理共享中断的中断服务例程 (ISR) 比处理独占的中断代价更高。

周期性和非周期性支持
每个比较器都必须支持非周期性功能。还必须至少有一个比较器支持周期性功能。

寄存器要求

内存映射的集合
计时器的寄存器应该被定义为非索引的集合并映射到主内存,从而可以直接访问每个计时器,无需查找。

32 位宽
计时器的寄存器都应该是 32 位宽,以提供足够的精度和功能并最大程度地减少回滚事件。支持 64 位宽的 HPET 实现将在 32 位模式中使用。

返回页首 返回页首

行动指南

  • 对于系统制造商:在系统中使用包含 High Precision Event Timer 的新芯片组设计并将原型系统提供给 Microsoft 进行测试。

  • 对于芯片组供应商:在将来的芯片组设计中包含一个符合本文所列指南的高精度事件计时器。

返回页首 返回页首

术语表

下面是本文中使用的一些关键缩写和术语。

8254 PIT
Programmable Interval Timer,当今使用的系统计时器之一。

非周期性计时器
仅在指定的时间生成单个中断的“一次性”计时器。如果在生成中断之后需要后续中断,那么必须对计时器重新编程。

APIC 计时器
Advanced Programmable Interrupt Controller 计时器,当今使用的系统计时器之一。

时钟中断
由系统计时硬件(通常是 8254 时钟)生成的周期性中断,操作系统用它来跟踪时间和触发器事件。时钟中断周期可能随时间而变化。

HPET
High Precision Event Timer,这是新的计时器。

Multimedia Timer (MM Timer)
HPET 原来的名称。也是图形包使用的外围设备计时器。

周期性计时器
以规则的周期性时间间隔生成中断的计时器。

外围设备计时器
提供一些特定的非必需功能的专有计时器,例如故障转移系统使用的 watchdog 计时器支持。

PM 时钟
当今使用的系统计时器之一。

实时时钟 (RTC)
当今使用的系统计时器之一。

系统计时器
系统用来提供基本的时间功能(例如跟踪时刻和触发基于时间的事件)的计时器。

计时器对象
Windows 用来在特定的精确时间跟踪信号请求。在每个时钟中断中检查计时器对象,查看对象是否已到期,并安排一个计时器 DPC 以生成一个信号或为每个已经到期的对象运行代码。

计时器计数
Windows 用来连续跟踪时间和线程时间量的抽象概念。启动以后计时器计数的周期不会改变,但是物理测量系统时间的时钟中断的周期可能改变。

返回页首 返回页首