出现在 WindowsNT、 Windows 2000, 和 WindowsXP, 同步异步磁盘 I/O

<script type="text/javascript">if (self.name == "MNPMainFrame") top.location.href = self.location.href;</script>

出现在 WindowsNT、 Windows 2000, 和 WindowsXP, 同步异步磁盘 I/O

<script type="text/javascript">function loadTOCNode(){}</script>
注意:这篇文章是由无人工介入的自动的机器翻译系统翻译完成。这些文章是微软为不懂英语的用户提供的, 以使他们能够理解这些文章的内容。微软不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的使用所引起的任何直接的, 或间接的可能的问题负责。
文章编号:156932
最后修改:2006年11月21日
修订:4.3
<script type="text/javascript"> var sectionFilter = "type != 'notice' && type != 'securedata' && type != 'querywords'"; var tocArrow = "/library/images/support/kbgraphics/public/en-us/downarrow.gif"; var depthLimit = 10; var depth3Limit = 10; var depth4Limit = 5; var depth5Limit = 3; var tocEntryMinimum = 1; </script> <script src="http://support.microsoft.com/common/script/gsfx/kbtoc.js?8" type="text/javascript"></script>

概要

<script type="text/javascript">loadTOCNode(1, 'summary');</script>
在 MicrosoftWindowsNT、 Windows 2000, 和 WindowsXP 文件 I/O 可以是同步还是异步。 有关 I/O 默认行为是同步: I/O 已完成时的 I / O 函数调用并返回。 异步 I/O, 另一方面, 使一个 I / O 函数以执行返回到调用方立即, 但 I/O 是不认为直到一些将来次要完成。 操作系统 I/O 已完成时通知调用方。 通过使用对操作系统服务或者, 调用方可确定是完成 I / O 操作状态。

异步 I/O 利用是调用方有时间来进行其他工作或者是正在完成 I / O 操作时发出多请求。 对于同步 I/O Overlapped I/O 术语经常用于异步 I/O 和非 overlapped I/O。 本文用于异步和同步术语 WindowsNT 下 I / O 操作。 本文假设读者具有某些熟悉文件 I/O 函数如 CreateFile, ReadFile, WriteFile。

某些条件, 本文以后部分进行 I / O 操作完成同步中讨论经常, 异步 I / O 操作行为如只同步 I/O。 调用方具有背景工作没有时间因为 I / O 函数不返回 I/O 在完成之前。

一些函数是与同步和异步 I/O。 本文使用 ReadFile 和 WriteFile 作为示例 ; 替代好方法是 ReadFileEx 和 WriteFileEx。 尽管本文讨论只有磁盘 I/O 专门, 众多原则能应用到其他类型的 I/O, 如串行 I/O 或网络 I/O。

注意 : (尽管不对其他类型的 I / O 设备) 由于 95 不支持异步 I/O 磁盘设备上, 其行为是本文中未涉及。

回到顶端

更多信息

<script type="text/javascript">loadTOCNode(1, 'moreinformation');</script>

设置异步 I/O

<script type="text/javascript">loadTOCNode(2, 'moreinformation');</script> CreateFile 中打开文件时必须指定 FILE_FLAG_OVERLAPPED 标志。 此标志允许对文件进行异步 I / O 操作。 下面是一个示例:
   HANDLE hFile;

hFile = CreateFile(szFileName,
GENERIC_READ,
0,
NULL,
OPEN_EXISTING,
FILE_FLAG_NORMAL | FILE_FLAG_OVERLAPPED,
NULL);

if (hFile == INVALID_HANDLE_VALUE)
ErrorOpeningFile();
注意当由于系统保留权利进行操作如果需要同步编码用于异步 I/O。 因此, 最好如果编写程序来正确处理, 可能完成同步或者异步 I / O 操作。 示例代码说明此考虑。

有许多事情程序可执行而等待异步操作以完成, 如排队额外操作, 或者执行后台工作。 例如, 下面代码正确处理重叠和非 overlapped 完成的读取操作。 它不任何超过等待完成 I/O 以完成:
   if (!ReadFile(hFile,
pDataBuf,
dwSizeOfBuffer,
&NumberOfBytesRead,
&osReadOperation )
{
if (GetLastError() != ERROR_IO_PENDING)
{
// Some other error occurred while reading the file.
ErrorReadingFile();
ExitProcess(0);
}
else
// Operation has been queued and
// will complete in the future.
fOverlapped = TRUE;
}
else
// Operation has completed immediately.
fOverlapped = FALSE;

if (fOverlapped)
{
// Wait for the operation to complete before continuing.
// You could do some background work if you wanted to.
if (GetOverlappedResult( hFile,
&osReadOperation,
&NumberOfBytesTransferred,
TRUE))
ReadHasCompleted(NumberOfBytesTransferred);
else
// Operation has completed, but it failed.
ErrorReadingFile();
}
else
ReadHasCompleted(NumberOfBytesRead);
注 意 & & NumberOfBytesTransferred 传递到 GetOverlappedResult NumberOfBytesRead 传递到 ReadFile 点与不同。 如果操作已被进行异步, 然后 GetOverlappedResult 用于确定实际的传输操作中完成它后字节数。 & NumberOfBytesRead 传递到 ReadFile 没有意义。

如果, 另一方面, 然后立即, 完成操作 & NumberOfBytesRead 传递到 ReadFile 是有效的读取字节数。 此时, 忽略传递到 ReadFile OVERLAPPED 结构 ; 不要使用它与 GetOverlappedResult 或 WaitForSingleObject。

其他 caveat 与异步操作是您必须不使用 OVERLAPPED 结构其挂起操作完成之前。 如果有三完成 I / O 操作, 换句话说, 必须使用三 OVERLAPPED 结构。 如果您重用 OVERLAPPED 结构, 您将收到 I / O 操作中非预期结果而且可能遇到数据损坏。 此外, 之前可用于首次, OVERLAPPED 结构或者之前, 早期操作完成后重新使用它必须正确初始化, 没有左转移数据影响新操作。

应用于数据缓冲区操作中使用相同类型的限制。 数据缓冲区不能读取或写入其相应 I / O 操作完成之前 ; 读取或写入缓冲区可能导致错误和损坏数据。

回到顶端

异步 I/O 仍然似乎同步

<script type="text/javascript">loadTOCNode(2, 'moreinformation');</script> 如果按照上文, 说明但是, 所有 I / O 操作通常仍完成同步按顺序颁发, 和无的 ReadFile 操作返回 FALSE 以返回 ERROR _ IO _ PENDING, 这意味着您有任何背景工作没有时间。 为什么这发生 ?

有许多方面即使您有编码对于异步操作为什么 I / O 操作完成同步:
压缩
<script type="text/javascript">loadTOCNode(3, 'moreinformation');</script> 一个 obstruction 到异步操作是 NTFS 压缩。 文件系统驱动程序将不访问异步压缩文件 ; 而所有操作只进行同步。 这不适用于以类似于 PKZIP COMPRESS 或者是压缩文件。
扩展文件
<script type="text/javascript">loadTOCNode(3, 'moreinformation');</script> I / O 操作完成同步另一个原因是操作本身。 WindowsNT, 上任何编写操作以扩展其长度文件会同步。

备注 : 通过通过使用 SetFileValidData 函数, 和然后颁发 WriteFile 更改有效数据长度对文件 Applications 可使提到写操作异步。

应用程序使用 SetFileValidData (这是在 WindowsXP 和更高版本上可用), 可有效扩展文件不会导致性能损失对于零 filling 它们。

因为 NTFS 文件系统不零不 - 填充一直到有效数据长度 (VDL) 由 SetFileValidData, 此函数定义数据具有安全含义其中文件可能指派群集以前由其他文件已占用,。 因此, SetFileValidData 要求调用方具有新 SeManageVolumePrivilege 启用 (默认情况下, 仅对管理员分配该)。 Microsoft 建议 ISV 仔细考虑含义是使用此函数。
缓存
<script type="text/javascript">loadTOCNode(3, 'moreinformation');</script> 大 多数驱动 I/O 程序 (磁盘、 通信, 和其他) 有特殊事例代码如果 " 立即, " 完成的 I / O 请求完成操作并 ReadFile 或 WriteFile 函数返回 TRUE 位置,。 在所有方面, 这些类型的操作似乎同步。 对磁盘设备, 通常, 内存中缓存数据时 " 立即 " 可完成的 I / O 请求。
数据处于缓存
<script type="text/javascript">loadTOCNode(3, 'moreinformation');</script> 如 果数据缓存中不是缓存方案对您, 可但是,。 WindowsNT 缓存实现内部使用文件映射。 WindowsNT 中内存管理器不提供异步页面容错机制来管理缓存管理器由文件映射。 缓存管理器可, 但是, 验证所请求页是否内存, 中, 如果发出异步缓存读取, 且页不处于内存, 文件系统驱动程序假定不希望阻止您线程并将由有限池的工作线程处理请求。 控制以仍等待 ReadFile 呼叫后返回到程序。

好这适用于少数几个请求, 将仍能仅几请求排队到磁盘驱动程序在特定时间但因为的线程池是有限制 (当前三 16MB 系统上), 如果您发出大量 I / O 操作的数据, 处于缓存, 饱和缓存管理器和内存管理器并请求进行同步。

缓存管理器行为可还能影响基于是否顺序或者随机访问文件。 缓存的优点顺序访问文件时都发生最。 调用 CreateFile 中 FILE_FLAG_SEQUENTIAL_SCAN 标志将优化缓存用于这种访问。 CreateFile 中但是, 如果访问文件以随机方式, 使用 FILE_FLAG_RANDOM_ACCESS 标志来指示缓存管理器来优化其行为进行随机访问。
不使用缓存
<script type="text/javascript">loadTOCNode(3, 'moreinformation');</script> FILE_FLAG_NO_BUFFERING 标志有文件系统对异步操作行为上大多数效果。 这是最佳方法以保证是实际异步 I / O 请求。 它指示要不使用任何缓存机制根本文件系统。

警告 : 有某些限制以使用此标志, 需要该设备的扇区大小和数据缓冲区对齐做是。 请参阅文档有关正确使用此标志 CreateFile 函数中函数引用。

回到顶端

SAMPLE CODE

<script type="text/javascript">loadTOCNode(2, 'moreinformation');</script> 可用于从 Microsoft 下载中心下载下列文件:
Asynczip.exe (http://download.microsoft.com/download/platformsdk/sample/3/nt4/en-us/asynczip.exe)
有关如何下载 Microsoft 支持文件请单击下列文章编号以查看 Microsoft 知识库中相应:
119591 (http://support.microsoft.com/kb/119591/EN-US/) 如何从联机服务获取 Microsoft 支持文件
此文件进行病毒扫描 Microsoft。 Microsoft 使用最新病毒检测软件, 投递文件日期上的可用。 文件存储, 有助于防止对文件进行任何未经授权更改安全性增强的服务器上。 与本文示例代码演示使用标志和函数讨论。 作为控制台应用程序是 WindowsNT 上运行代码。 以下命令行开关控制其行为:
   Asynchio
Usage: asynchio [options]

Options:
/fFilePattern Files to use for I/O.
/s Specifies synchronous operation.
/n Specifies that no buffering should be used
/r Use FILE_FLAG_RANDOM_ACCESS
/l Use FILE_FLAG_SEQUENTIAL_SCAN
/o### Issue ### operations
/e First read entire file, then issue smaller reads
/? Display this usage message.
/ asynchio /f*.bmp n 示例:
此程序的默认操作是用于异步、 缓冲操作。 默认情况下, 500 I / O 操作请求。

回到顶端

实际测试结果

<script type="text/javascript">loadTOCNode(2, 'moreinformation');</script> 下面是一些测试结果从示例代码。 量的数字这里并不重要和变化从计算机到计算机, 但 illuminates 一般影响与性能上标志的数字比较相互关系。

您可能希望看到类似于以下结果:
测试 1
Asynchronous, unbuffered I/O:  asynchio /f*.dat /n

Operations completed out of the order in which they were requested.
500 requests queued in 0.224264 seconds.
500 requests completed in 4.982481 seconds.
这个测试说明提到程序快速颁发 500 I / O 请求, 并有大量时间来进行其他工作或发出多个请求
测试 2
Synchronous, unbuffered I/O: asynchio /f*.dat /s /n

Operations completed in the order issued.
500 requests queued and completed in 4.495806 seconds.
这个测试说明, 该程序花费而测试 1 花费仅 0.224264 秒以便发出同一请求调用 ReadFile 以完成其操作, 4.495880 秒。 测试 2 中, 没有用于程序进行任何背景工作没有 " 额外 " 时间。
测试 3
Asynchronous, buffered I/O: asynchio /f*.dat

Operations completed in the order issued.
500 requests issued and completed in 0.251670 seconds.
这个测试说明缓存同步性质。 所有读取已发出, 以秒计 0.251670 完成。 换句话说, 异步请求已完成同步。 当数据位于缓存此测试还说明高性能缓存管理器
测试 4
Synchronous, buffered I/O: asynchio /f*.dat /s

Operations completed in the order issued.
500 requests and completed in 0.217011 seconds.
这个测试说明作为测试 3 中相同的结果。 注意从缓存从缓存同步读取完成比异步读取有点快。 当数据位于缓存此测试还说明高性能缓存管理器

回到顶端

CONCLUSION

<script type="text/javascript">loadTOCNode(2, 'moreinformation');</script> 您可以决定哪种方法最好由于其所有依赖类型、 大小, 和次数, 程序执行操作。

没有指定任何特殊标记以 CreateFile 默认文件访问是同步和缓存操作。

注意 : 因为文件系统驱动程序不预测异步预读和异步惰性写入的数据修改您执行获取某些自动异步行为此模式中。 虽然这不会应用 [ ASCII 146 ] s I/O 异步, 但它是对于绝大多数的简单应用程序理想情况。

如果, 另一方面, 应用程序并不简单, 您可能需要执行某些分析和性能监视来确定最佳方法, 类似于本文前面示测试。 分析时间花费 ReadFile 或 WriteFile 函数中, 然后比较这次要多长时间进行实际 I/O 操作以完成其是非常有用。 如果是大部分时间花费中实际颁发 I/O, 然后您 I/O 正在完成同步。 但是, 如果时间颁发 I / O 请求是比较时间对于 I / O 操作以完成, 然后正在处理异步操作相对较小。 本文中前面提到示例代码使用 QueryPerformanceCounter 函数进行内部分析它自己。

性能监视可帮助确定如何有效程序是否使用磁盘和高速缓存。 将跟踪任何 Cache 对象用于性能计数器指示性能缓存管理器。 跟踪性能计数器对于物理磁盘或逻辑磁盘对象表示磁盘系统性能。

有几个工具都有用中性能监视 ; PerfMon 和 DiskPerf 将非常有用。 对于系统来收集数据磁盘系统, 性能上您必须首先发出 diskperf - y 命令。 您发出命令, 后必须重新启动系统以启动数据集。

回到顶端

参考

<script type="text/javascript">loadTOCNode(1, 'references');</script>
有关这些工具和性能监视, 的详细信息请参阅卷优化 " WindowsNT " WindowsNT 资源工具包文档中。

回到顶端


这篇文章中的信息适用于:
Microsoft Win32 Application Programming Interface 当用于
  Microsoft Windows NT 3.51 Service Pack 5
  Microsoft Windows NT 4.0
  Microsoft Windows 2000 Standard Edition
  Microsoft Windows XP Professional

回到顶端

关键字: 
kbapi kbfileio kbinfo kbkernbase KB156932 KbMtzh kbmt

回到顶端

Microsoft 和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何 责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与 该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、

查找支持

 
高级搜索
<script type="text/javascript">var curspid = '';document.frmsrch.qryWt.value='';document.frmsrch.cus.value='False';InitSrch();</script>

文章翻译

 

其他支持选项

页面工具


©2007 Microsoft Corporation. 版权所有.   保留所有权利 | 商标 | 隐私权声明
<script src="http://support.microsoft.com/common/script/gsfx/wtInit.js?8" language="javascript" type="text/javascript"></script> <script src="http://support.microsoft.com/common/script/gsfx/wtCore.js?8" language="javascript" type="text/javascript"></script> <script type="text/javascript">StatsDotNet.disabled=false;StatsDotNet.host='http/x3a/x2f/x2fsupport.microsoft.com/x2fLTS/x2fdefault.aspx';StatsDotNet.ssId='1';StatsDotNet.siteLcId='2052';StatsDotNet.SiteCulture='zh-cn';StatsDotNet.SsVersion='GSS4.3';StatsDotNet.url='/x2fdefault.aspx';StatsDotNet.ContentCulture ='zh-cn';StatsDotNet.contentType='kb';StatsDotNet.contentLn='2052';StatsDotNet.contentId='156932';StatsDotNet.eventCollectionId=1;StatsDotNet.siteBrandId='1';StatsDotNet.onUnloadTimeout=300;StatsDotNet.userAgentString='mozilla/x2f5.0 /x28windows/x3b u/x3b windows nt 5.1/x3b zh-cn/x3b rv/x3a1.8.1/x29 gecko/x2f20061010 firefox/x2f2.0';StatsDotNet.ContentProperties='6/x3d9/x7c7/x3d4.3/x7c8/x3d1/x7c';</script> <script language="javascript" type="text/javascript">if(window.top == window && enableSiteSurvey) document.write('
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值