找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 3666|回复: 6

windows平台异步io的执行顺序

[复制链接]
发表于 2009-10-24 17:16:28 | 显示全部楼层 |阅读模式
1,《Network Programming for Microsoft Windows /2nd ed》第5.2 Socket I/O Models中有一段
All overlapped operations are guaranteed to be executed in the order that the application issued them. However, the
completion notifications returned from a completion port are not guaranteed to be in that same order.

2,《windows via c++》(windows核心编程第5版)第10.5 Basics of Asynchronous Device I/O
Asynchronous Device I/O Caveats

You should be aware of a couple of issues when performing asynchronous I/O. First, the device driver doesn't have to process
queued I/O requests in a first-in first-out (FIFO) fashion. For example, if a thread executes the following code, the device
driver will quite possibly write to the file and then read from the file:
OVERLAPPED o1 = { 0 };
OVERLAPPED o2 = { 0 };
BYTE bBuffer[100];
ReadFile (hFile, bBuffer, 100, NULL, &o1);
WriteFile(hFile, bBuffer, 100, NULL, &o2);
A device driver typically executes I/O requests out of order if doing so helps performance. For example, to reduce head
movement and seek times, a file system driver might scan the queued I/O request list looking for requests that are near the
same physical location on the hard drive.

综合以上两种说法,貌似有点矛盾。我暂时只能这么理解:
read和write之间可能会打乱顺序,但是read和read之间,write和write之间的相对顺序是可以确保的。(比如socket对于read和write有不同的buffer)
 楼主| 发表于 2009-10-24 17:26:11 | 显示全部楼层
ps:我刚开始学windows,Network Programming for Microsoft Windows /2nd ed看完第一遍了,windows via c++刚看到这里。以前对ms没好印象,连带也不喜欢windows,现在觉得确实是个不错的平台,看来人真不能有先入为主的偏见啊。:lol
windows开发平台的好处在于比较彻底的oo理念,连kernel都充满了object(虽然最底层还是c api)。而unix开发人员大多数还是c思维,c++都被很多人bs,更别说java了。当然这只是我的个人偏好而已,并不是说谁对谁错。
发表于 2009-10-25 18:43:21 | 显示全部楼层
对文件系统来说有可能是这样,网络基本上应该不会。特别是针对同一个套接字的发送不会出现先到的后处理。但如果你有两个线程等到取完成消息,有可能会先到的后收到。

针对文件系统,为了优化处理,有可能有的文件系统会先扫描后面的要处理的队列以进行某种寻址优化,这种情况下先请求的操作可能后完成。

我想可能是这样子 的。

[ 本帖最后由 sevencat 于 2009-10-25 18:46 编辑 ]
发表于 2009-10-25 18:47:29 | 显示全部楼层
windows的这种思路应该更接近于“微内核”,功能之间以队列来访问,而不是直接调用。
发表于 2009-10-26 16:04:15 | 显示全部楼层
比较认同sevencat关于网络部分的解释。
 楼主| 发表于 2009-10-26 16:18:12 | 显示全部楼层
原帖由 sevencat 于 2009-10-25 18:43 发表
但如果你有两个线程等到取完成消息,有可能会先到的后收到。

我的理解是,即使一个线程在等待完成通知消息,也有可能后完成的先到。

因为“All overlapped operations are guaranteed to be executed in the order that the application issued them. However, the
completion notifications returned from a completion port are not guaranteed to be in that same order.”
完成顺序是保证的,但是完成通知的顺序不保证。

两者的说法,关于通知顺序不保证是一致的。但是实际执行的顺序是否一致,有矛盾。
两本书都是圣经,不知道听谁的是了。

另外我感觉网络、文件或其他设备,应该都是统一的处理方式。
仔细想想就算是读与读或者写与写之间的顺序也打乱了,好像也没什么问题?
 楼主| 发表于 2009-10-28 14:59:42 | 显示全部楼层
网络传输会不会打乱顺序?我的理解是也可能的
之所以tcp不会打乱ww之间和rr之间的顺序,是因为这是tcp协议保证的。tcp协议栈确保异步io驱动不会做这种打乱顺序的性能优化。
而udp就可能被打乱。
而tcp的,wr之间顺序也是不保证的。socket有一个读缓冲和一个写缓冲。
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-12-23 13:46 , Processed in 0.359618 second(s), 6 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表