Windows 管理

了解 Windows Vista 内核:第一部分

Mark Russinovich

 

概览:

  • 线程优先级和计划
  • 基于文件的符号链接
  • 取消 I/O 操作

这是系列文章的第一部分,探讨的是 Windows Vista 内核中的新增内容。在这一期中,我将着重说明在进程、线程和 I/O 方面的更改;在将来几期内容中将涉及到内存管理、启动和关闭、可靠性和恢复以及安全性方面的内容。

本文的范围仅限于对 Windows Vista™ 内核的更改,尤其是对 Ntoskrnl.exe 和与其紧密关联的组件的更改。请记住,在 Windows Vista 中还存在许多其他重大更改,但这些却超出了内核的范围,因此本文将不予以说明。其中包括对外壳(如集成的桌面搜索)、网络(如新的 IPv6 堆栈和双向防火墙)和下一代图形模型(如 Aero™ Glass、Windows® Presentation Foundation、桌面窗口管理器和新图形驱动程序模型)的改进。而且未涉及的内容还包括新的 Windows 用户模式和内核模式驱动程序框架(UMDF 和 KMDF),因为在较早的 Windows 版本上它们在后级别才是可安装的。

CPU 时钟周期计数

Windows Vista 包含了进程和线程方面的大量增强功能,其中包括使用 CPU 时钟周期计数器以较公平地进行 CPU 分配,以及使用新的多媒体类计划程序服务 (MMCSS),它有助于媒体应用程序提供稳定的播放。

所有 Windows NT® 版本,包括 Windows Vista 程序在内,大约在每 10 ms 或 15 ms(毫秒)执行一次间隔计时器中断例程,间隔取决于硬件平台。该例程查看它所中断的线程并更新线程的 CPU 使用统计数据,就好像该线程在整个间隔期间都在运行,而事实上,线程可能仅在间隔就要结束前才开始执行。而且,从技术上讲,可能已经为线程分配了 CPU,但却一直没有机会运行,因为执行的是硬件和软件中断例程。

虽然对于报告线程和进程 CPU 使用情况的诊断工具来说,基于时钟的时间计算是一个好方法,但是,若由线程计划程序使用该方法将导致不公平的 CPU 分配。默认情况下,Windows 客户端版本上的线程最多可运行 2 个时钟节拍(如果是在前台中运行则为 6 个时钟节拍)。然而,根据线程在系统上的行为和其他活动,线程实际上可能在 CPU 上根本没有时间或是最多得到 6 个时钟节拍(如果是在前台中运行则为 18 个时钟节拍)。

图 1 显示了两个具有相同优先级的线程同时准备好运行时发生的不公平情况。计划程序假定线程 A 在整个间隔期间内运行时,线程 A 一直运行到下一时间片间隔过期,因此也就可以确定线程 A 已运行完毕。而且,在线程 A 运行期间发生的中断应由线程 A 完全负责。在下一间隔内,计划程序挑选线程 B 来接续,并且要在整个间隔内运行。

图 1 不公平的线程计划

图 1** 不公平的线程计划 **

在 Windows Vista 中,计划程序使用现代处理器的时钟周期计数器寄存器精确地跟踪线程所执行的 CPU 时钟周期数。通过估计 CPU 在一个时钟间隔内能够执行的时钟周期数,它可以更准确地在 CPU 上布置轮循。另外,Windows Vista 计划程序不会根据线程的轮循计数中断执行。这就意味着,在 Windows Vista 上,线程始终会得到至少一次在 CPU 上运行的机会,而且永远不会执行多个额外时钟间隔,这使应用程序的行为更公平,也更具确定性。图 2 显示了 Windows Vista 如何响应图 1 中所示的情况,方法是为两个线程提供至少一个时间片的执行间隔。

图 2 Windows Vista 基于时钟周期的计划

图 2** Windows Vista 基于时钟周期的计划 **

“查看进程的 CPU 使用情况”边栏说明了用户如何通过使用 Process Explorer 实用工具监视进程的 CPU 时钟周期使用情况。

多媒体类计划程序服务

用户期望多媒体应用程序(包括音乐和视频播放器)能够提供无缝的播放体验。然而,其他同时运行的应用程序(如防病毒、内容索引甚至是邮件客户端)对 CPU 的要求会带来不和谐的因素。为了提供更佳的播放体验,Windows Vista 引入 MMCSS 来管理多媒体线程的 CPU 优先级。

像 Windows Media® Player 11 这样的多媒体应用程序使用能够表明其多媒体特性的新 API,通过 MMCSS 进行注册,它必须与下列按名称排列的注册表项之一匹配:

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\Currentversion\Multimedia\SystemProfile\Tasks

图 A** 查看 Process Explorer 中的 CPU Time 和 Cycles Delta **(单击该图像获得较大视图)

图 3 多媒体类计划程序音频任务定义

图 3** 多媒体类计划程序音频任务定义 **(单击该图像获得较大视图)

在 %SystemRoot%\System32\Mmcss.dll 中实现且在服务主机 (Svchost.exe) 进程中运行的 MMCSS 具有可在优先级 27 运行的优先级管理线程。(Windows 中线程优先级的范围是从 0 到 31。)此线程将已注册的多媒体线程的优先级推进到另一个范围内,该范围与任务注册表项(如图 4 所示)的计划类别值相关联。在 Windows 中,线程优先级 16 及更高级别处在实时优先级范围内并且高于系统上的其他所有线程(除了内核的内存管理器工作线程,该线程在优先级 28 和 29 运行)。仅管理帐户(如执行 MMCSS 的“本地系统”帐户)具有设置实时线程优先级所需的提升优先级权限。

Figure 4 MMCSS 线程优先级

计划类别 提升的线程优先级
23-26
中等 16-23

在播放音频文件时,Windows Media Player 注册音频任务线程;在播放视频时,Windows Media Player 注册播放任务线程。对于已经指明它们在拥有前台窗口的进程中运行时并且在将任务的定义注册表项中的 BackgroundOnly 值设置为 True 时将同时传递流的所有线程,MMCSS 服务会对其进行提升。

但是在 MMCSS 想要帮助多媒体线程获得所需的 CPU 时间的同时,它还想确保其他线程至少也能获得一些 CPU 时间,这样,系统和其他应用程序才能保持响应能力。因此,MMCSS 为其他活动保留了一定百分比的 CPU 时间,并在以下注册表值中进行指定:

HKLM\Software\Microsoft\Windows NT\Currentversion\Multimedia\SystemProfile\SystemResponsiveness 

默认情况下,此比例为 20%;MMCSS 监视 CPU 的使用情况,以确保在其他线程需要 CPU 时,在 10 ms 期间内提升多媒体线程所占的时间不超过 8 ms。为了使多媒体线程不占用剩下的 2 ms,计划程序将其优先级设置在 1-7 级的范围内。

您可以通过阅读“查看 MMCSS 优先级提升”边栏了解 MMCSS 是如何提升线程优先级的。

基于文件的符号链接

Windows Vista I/O 的相关更改包括基于文件的符号链接、更有效的 I/O 完成处理、对 I/O 取消的全面支持以及优先 I/O。

终于在 Windows Vista 中见到符号文件链接(或如在 UNIX 中那样称作软链接)了,许多人认为它是 NTFS 中缺少的文件系统功能。NTFS 的 Windows 2000 版本引入了符号目录链接(称为目录接合),允许用户创建指向其他目录的目录,但是在 Windows Vista 版本发布之前,NTFS 仅支持文件的硬链接。

Windows 解决符号链接和目录接合所采用的方式的最大区别在于处理所发生的位置。Windows 在本地系统上处理符号链接,即使它们引用远程文件服务器上的位置。Windows 在服务器本身上处理引用远程文件服务器的目录接合。因此,服务器上的符号链接可以引用仅从客户端才能访问的位置(如其他客户端卷),而目录接合则做不到。为了解决这个问题,Windows Vista 支持适用于文件和目录的新符号链接类型。

已经对许多文件系统命令进行了更新,以了解符号链接的含义。例如,Delete 命令知道不要跟随链接(这样会导致目标的删除),而是要删除链接。然而,由于不是所有的应用程序都能正确地处理符号链接,因此,创建符号链接需要新的创建符号链接权限,而默认情况下,仅有管理员才具有该权限。

您可以在命令提示符下使用 Mklink 命令创建符号链接。命令提示符的内置目录命令通过用 <SYMLINK> 标记符号链接并在括号中显示目标的方式标识符号链接,如图 5 中所示。Windows 资源管理器也可识别符号链接,并使用快捷方式箭头显示。可以通过将“链接目标”列添加到浏览窗口中来查看资源管理器中的链接目标。查看 MMCSS 优先级提升

您可以通过以下方法见证 MMCSS 服务应用到 Windows Media Player 线程的线程提升:播放视频或音频剪辑,运行性能监视器,将图形标尺设置为 31(Windows 线程最高优先级)以及将 Windows Media Player (Wmplayer.exe) 线程对象中所有实例的当前优先级计数器添加到显示内容中。一个或多个线程将在优先级 21 运行。

图 B** Windows Media Player 的线程优先级提升 **(单击该图像获得较大视图)

图 5 使用 Mklink 创建符号链接

图 5** 使用 Mklink 创建符号链接 **(单击该图像获得较大视图)

I/O 完成和取消

对 I/O 系统所做的大量更改可改进服务器应用程序的性能。这些应用程序通常使用称为完成端口的同步对象来等待异步 I/O 请求的完成。在 Windows Vista 之前,当此类 I/O 完成时,已发布 I/O 的线程将执行 I/O 完成工作,这可切换到线程所属的进程并中断所有正在进行的其他工作。然后,I/O 系统将更新完成端口的状态,以唤醒正在等待完成端口进行状态更改的线程。

在 Windows Vista 上,I/O 完成处理不必非由已发布 I/O 的线程执行,但是必须由等待完成端口将其唤醒的线程来执行。这个相对较小的更改避免了不必要的线程计划以及可能造成应用程序和系统整体性能下降的上下文切换。为了进一步提高性能,服务器可以从一个请求的完成中检索多个 I/O 操作的结果,避免转换到内核模式。

从最终用户的角度来看,I/O 系统中最可见的更改可能是 Windows Vista 所支持的取消同步 I/O 操作。如果曾经执行过 net view 命令或试图使用 Windows XP 或 Windows Server® 2003 访问过脱机远程系统的共享,您就已经体验到了无法取消的 I/O 操作问题:直到网络超时过期后,命令或文件浏览器才能响应。应用程序没有选择,只能等待,直至操作失败,因为它没有办法告知正在执行 I/O 的设备驱动程序不需再理会 I/O 了。

在 Windows Vista 中,大多数 I/O 操作都可以取消,包括 Net View 和资源管理器使用的打开文件 I/O。然而,必须更新应用程序以响应最终用户的取消 I/O 请求,而且许多与具有超时设置的设备进行交互的 Windows Vista 实用工具已得到必要的支持。例如,实际上由每个 Windows 应用程序(包括第三方应用程序)使用的文件打开和保存对话框现在允许在试图显示文件夹内容时启用“取消”按钮。在按 Ctrl+C 时,Net 命令也可取消其同步 I/O。

可以通过在 Windows Vista 上打开命令提示符并键入以下内容来查看 I/O 取消所带来的好处:

net view (\\nonexistentmachine)

在 Windows 试图联系不存在的系统时该命令将挂起,但可以通过键入 Ctrl+C 来终止该命令。在 Windows XP 中,Ctrl+C 不会产生影响,并且直到网络操作超时后命令才会返回。

在 Windows 以前的版本中会引发用户问题的另一类 I/O 就是设备驱动程序不能正确取消的 I/O,因为设备驱动程序轻易不会知道它们应该这样做。如果曾经终止过进程,但随后发现它在进程查看工具中有所延迟,那么,您已经亲眼目睹了设备驱动程序无法对进程终止做出响应,并且取消由未完成进程发布的 I/O 这两个过程。直到所有进程的 I/O 已经完成或已被取消,Windows 才能执行最终进程清理。在 Windows Vista 中,设备驱动程序能够很容易地注册进程终止的通知,因此,大多数无法终止的进程问题也就迎刃而解了。

I/O 优先级

虽然 Windows 始终支持 CPU 使用情况的排列优先级,但是却未包括 I/O 优先级这一概念。如果没有 I/O 优先级,搜索索引、病毒扫描和磁盘碎片整理等后台活动会对前台操作的响应性带来严重的影响。例如,用户在另一进程正在执行磁盘 I/O 时启动应用程序或打开文档,则该用户将体验到延迟,因为前台任务要等待磁盘访问。同样的干扰也会影响到多媒体内容(如硬盘上的歌曲)流播放的质量。

为了有助于前台 I/O 操作获取首选项,Windows Vista 引入了两个全新类型的 I/O 优先级排列:单独 I/O 操作的优先级和 I/O 带宽保留。Windows Vista I/O 系统内部包括对五个 I/O 优先级的支持,如图 6 所示,但是仅使用了四个优先级(Windows 的未来版本可能支持“高”优先级)。

Figure 6 Windows Vista I/O 优先级

I/O 优先级 使用情况
关键 内存管理器
未使用
普通 默认优先级
默认任务优先级
非常低 后台活动

I/O 具有“中等”默认优先级,内存管理器想要在低内存情况下将脏内存数据写到磁盘中从而为其他数据和代码在 RAM 中留出空间时,将使用“关键”优先级。Windows Task Scheduler 将具有默认任务优先级的任务 I/O 优先级设置为“低”,并将由执行后台处理的应用程序(为 Windows Vista 而编写)指定的优先级设置为“非常低”。所有 Windows Vista 后台操作(包括 Windows Defender 扫描和桌面搜索索引)均使用“非常低”I/O 优先级。查看“非常低”I/O 优先级

Process Monitor 是 Sysinternals 的实时文件系统和注册表监视实用工具,它可以收集读写文件系统操作的详细信息,包括它们在 Windows Vista 上的 I/O 优先级。突出显示的行显示了由 SuperFetch 发布的优先级非常低的 I/O 示例(这将在下期内容中进行探讨)。

图 C** 在 Proces Monitor 中查看“非常低”I/O 优先级 **(单击该图像获得较大视图)

系统存储类设备驱动程序 (%SystemRoot%\System32\Classpnp.sys) 强制使用 I/O 优先级,因此也就自动应用于指向大多数存储设备的 I/O。类和其他存储驱动程序将“中等”I/O 插入到队列内优先级为“低”和“非常低”的 I/O 之前,但是至少应每秒发布一个等待“低”或“非常低”I/O 的操作,这样后台进程才可以向前进行。使用“非常低”I/O 读取数据还会使缓存管理器立刻将修改写入磁盘,并绕过读取操作的预读逻辑,否则它会优先从正在访问的文件中进行读取。请将边栏“查看“非常低”I/O 优先级”作为使用 Process Monitor 实用工具的“非常低”I/O 优先级的示例了解一下。

Windows Vista 带宽保留支持对于媒体播放机应用程序非常有用,Windows Media Player 将其连同 MMCSS 优先级提升一起使用,以提供对本机内容近乎稳定的播放体验。媒体播放机应用程序要求 I/O 系统确保它能够以指定速率读取数据,如果设备能够以请求的速率传递数据而且现有保留也允许的情况下,它将针对发布 I/O 的频率以及 I/O 应具有的大小两方面为应用程序提供指导。I/O 系统不会为其他 I/O 提供服务,除非它能够满足在目标存储设备上做出保留的应用程序的要求。

在 I/O 系统中值得一提的一个最终更改与 I/O 操作的大小有关。因为第一版 Windows NT、内存管理器和 I/O 系统已将单独存储 I/O 请求所处理的数据数量限制为 64KB。因此,即使应用程序发布了一个更大的 I/O 请求,也会被分解为最大大小为 64KB 的多个请求。每个 I/O 都导致了转换到内核模式的开销并在存储设备上启动 I/O 传输,因此在 Windows Vista 中,存储 I/O 请求大小将不再受限。已对一些 Windows Vista 用户模式组件进行了修改,以利用对更大 I/O 的支持,包括资源管理器的复制功能和命令提示符的 Copy 命令(现在发布 1MB 的 I/O)。

预告

现在,您已经了解了 Windows Vista 内核功能增强的两个方面。预期您可以在《Windows Internals》(Windows 内部结构)(与 David Solomon 共同执笔)一书的下一版本中了解到更详细的信息,计划与 Windows Server 的下一版本(代码名为“Longhorn”)同时推出。在下期内容中,我将继续通过探讨内存管理以及系统的启动和关闭来为您介绍新的内核。

Mark Russinovich 是 Microsoft 平台和服务部门的技术人员。他是《Microsoft Windows Internals》(Microsoft Windows 内部结构)(Microsoft Press, 2004) 的合著者之一,并经常在 IT 和开发人员会议上演讲。作为 Winternals Software 的创办者之一,他随着 Microsoft 对该公司最近的收购加入到了 Microsoft。他还创建了 Sysinternals,在这里他发布了 Process Explorer、Filemon 和 Regmon 实用工具。

© 2008 Microsoft Corporation 与 CMP Media, LLC.保留所有权利;不得对全文或部分内容进行复制.