Windows 机密错误的力量

Raymond Chen

在 Windows 95 中, 您可以进入“故障排除”页面选择“禁用同步缓冲提交”。但您知道这一复选框是干什么用的吗?或者为什么要这样做呢?

MS-DOS® Commit 功能的正常行为是将某一特定文件的所有未写入数据冲洗到磁盘,并等候直到确认数据已写入后才返回。当选中“禁用同步缓冲提交”选项时,调用将会立即返回,而不必等待数据的写入。当然,这违背了要求调用在数据写入后才能返回的功能规范。这增加了知识库文章 139669 中婉称为“文件完整性问题”的风险,因为它会导致程序发出冲洗请求,认为磁盘上的数据是安全的,但是事实上不是。

数据库程序可能使用“提交”功能来建立一些点,在这些点上,磁盘上文件的状态和程序所希望的状态一致。如果计算机在更新过程中断电,那么数据库程序可以使用最后提交点记录的信息来重新建立数据库的完整性。如果“提交”在提交未完成之前立即返回,则将会丢失此完整性检查点。后果是您的数据库会损坏。

如果后果是如此的糟糕,那为什么还提供此选项呢?原因是:在 Windows® 3.11 中有一个错误。

图 1 在 Windows Server 2003 中启用错误行为

图 1** 在 Windows Server 2003 中启用错误行为 **(单击该图像获得较大视图)

Windows 3.11 引入了“32 位文件访问”,它是一个底层文件 I/O 接口的 32 位实施。但“提交”功能的实施包含一个错误,它有效地忽略了冲洗文件缓存的请求。如果您在 Windows 3.11 中运行程序来冲洗文件缓存,则冲洗调用无效。因此,如果您的计算机在不适当的时间断电,您将得到一个损坏的数据库。

Windows 95 文件系统的工作人员修复了这个错误,但是陆续产生新的错误报告。一些人的帐户支付程序运行开始变得非常缓慢。接着,其他人的数据库程序也出现了同样的问题。这是怎么回事?

原来,这些程序不断地发出冲洗调用。编程人员注意到在 Windows 3.11 中冲洗调用非常快,因此他们在程序中无限制地大量调用。写入一个字节,冲洗。写入一个字符串,冲洗。由于冲洗速度很快,因此应用程序可以在每次操作后将数据提交到磁盘,而没有注意到性能的降低。但是一旦 Windows 95 修复了这一错误,这些程序开始运行非常缓慢,因为这些提交的调用突然开始真正工作。

当然,如果文件系统小组没有做任何事,这些程序将会一直运行缓慢,而用户就会得出问题在于 Windows 95 的结论。“Windows 95 运行的非常慢”,他们将会这样告诉其他人。另一方面,如果文件系统还原到旧版的 Windows 3.11 行为,则它们将再次引入将会导致这些讨厌的“文件完整性问题”的错误。

所以他们的结论是,修复这个错误但增加一个复选框(虽然隐藏在“故障排除”页面),以便让运行程序时遇到因为修复错误而引起问题的人们返回到 Windows 3.11 行为。

事实证明,历史经常重演。在 Windows Server® 2003 中,I/O 人员发现了一个错误,即标记为“Forced Unit Access (FUA)”的请求会丢失 FUA 标记并作为正常 I/O 执行。它是忽略冲洗请求的“现代版”!他们修复了该错误,但是留下了返回到旧的错误行为的选项。此复选框的 Windows Server 2003 版本称为“启用高级性能”,但现在您知道它的真实含义是“还原旧的错误行为”。

Raymond Chen的网站旧事重提及其同名书 (Addison-Wesley, 2007) 介绍的是 Windows 历史和 Win32 编程。他没有忘记 tag。

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