你的“重叠IO”是真正异步的吗?

什么是同步IO?什么是异步IO?
在windows下,一个IO读操作可以分为两大步:
1、从IO设备读取数据,保存在系统的缓冲区;
2、从系统缓冲区拷贝到用户的缓冲区。
如果一个读操作的两个步骤都不在用户线程中执行,那么这个读操作就是异步的;只要有一个
步骤在用户线程中执行,这个读操作就是同步的。(写操作类似)

windows下的异步IO模型
windows下提供了一种异步IO模型,即“Overlapped IO”(重叠IO)。以文件设备为例,重叠
IO最基本的用法如下:
1、打开文件,并指定文件属性FILE_FLAG_OVERLAPPED。
2、调用ReadFile/WriteFile并指定一个OVERLAPPED结构指针进行读写。
3、调用GetOverlappedResult,GetQueuedCompletionStatus获取IO结果,或者在回调例程中处理。
但是并不是所有的重叠IO操作都是以异步的方式执行。

什么是立即完成
MSDN中解释ReadFile/WriteFile返回值时指出,如果返回TRUE表示IO立即完成。也就是说,函数
返回时,你的IO操作已经执行完毕,所有的IO步骤都在用户线程中执行。IO立即完成,就是IO操作
以同步的方式执行完毕,也可以称为重叠IO同步化。既然MSDN这么说明,就证明存在某些情况下,
重叠IO会被同步化。

什么情况下,重叠IO会变成同步IO呢?
根据“Microsoft Knowledge Base156932”([1])一文的描述,在以下几种情况下,重叠IO会变成同步IO:
1、文件被压缩了。压缩指的是在NTFS文件系统下,为了节省磁盘空间,系统以压缩的方式存储
用户的文件。
2、文件被加密了。加密同样指NTFS文件系统的加密特性。
3、写操作导致文件大小变大。在XP以后可以先调用SetFileValidData改变文件的合法大小,再调用WriteFile,
就可以避免重叠IO同步化。但是,调用SetFileValidData需要管理员特权SeManageVolumePrivilege。
4、缓存机制。如果需要的数据已经在系统缓存中,系统会认为它可以很快完成这个操作,就以同步的
方式执行该IO操作。
5、需要的数据不在缓存中。系统内部维护了一个工作线程池,用于接收这种IO请求,然后在工作线程中进行真正的IO操作。
大部分情况下,重叠IO会以异步的方式执行。但是当所有工作线程都满负荷的情况下,系统会直接处理这些IO请求。
由于数据不在缓存中,IO请求会引起缺页调度。系统的缺页调度没有异步方式,所以整个IO请求都是以同步的方式执行。

怎么才能使重叠IO真正异步呢?
在以上5种情形中,1、2两种情况不可避免;第3种情况,也只能在特定条件下(获取管理员特权)才能避免。所以,我们
只能尽量做到重叠IO被异步执行,而无法保证一定被异步执行。针对第4、5两种情况,我们只需要在打开文件时,指定
FILE_FLAG_NOBUFFER属性就可以绕过系统的缓存机制,从而尽量保证重叠IO以异步的方式执行。保证重叠IO以异步的方式
执行,方便我们编程。我们使用重叠IO,是为提高整个软件的性能,包括用户交互行为的流畅性。但是异步IO真的好吗?

异步IO真的好吗?
显然,异步IO最大好处是IO操作的执行在系统线程中,整个调用不会阻塞用户线程。在用户线程是界面线程的情况下,这个
优点特别明显。由于不阻塞用户线程,整个界面就能快速、灵敏地响应用户的交互操作。但是,由于线程切换等因素,禁用
缓存机制的重叠IO性能远远差于同步IO([1],[2])。如果只是为了不卡界面,我们完全可以采用IO线程的方法。所有的IO请求都被
打包成命令对象并投递给IO线程,再由IO线程以同步的方式执行。不过,IO线程模型并不适用于所有IO设备,它比较适合于文件设
备。对于套接字等网络设备而言,等待网络数据往往要花费很长时间,IO线程将会变得很低效。

参考文件:
[1] http://support.microsoft.com/kb/156932/en-us
[2] http://www.flounder.com/asynchexplorer.htm
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值