wishel 发表于 2009-10-24 17:16:28

windows平台异步io的执行顺序

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;
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)

wishel 发表于 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了。当然这只是我的个人偏好而已,并不是说谁对谁错。

sevencat 发表于 2009-10-25 18:43:21

对文件系统来说有可能是这样,网络基本上应该不会。特别是针对同一个套接字的发送不会出现先到的后处理。但如果你有两个线程等到取完成消息,有可能会先到的后收到。

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

我想可能是这样子 的。

[ 本帖最后由 sevencat 于 2009-10-25 18:46 编辑 ]

sevencat 发表于 2009-10-25 18:47:29

windows的这种思路应该更接近于“微内核”,功能之间以队列来访问,而不是直接调用。

modern 发表于 2009-10-26 16:04:15

比较认同sevencat关于网络部分的解释。

wishel 发表于 2009-10-26 16:18:12

原帖由 sevencat 于 2009-10-25 18:43 发表 http://www.acejoy.com/bbs/images/common/back.gif
但如果你有两个线程等到取完成消息,有可能会先到的后收到。

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

因为“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.”
完成顺序是保证的,但是完成通知的顺序不保证。

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

另外我感觉网络、文件或其他设备,应该都是统一的处理方式。
仔细想想就算是读与读或者写与写之间的顺序也打乱了,好像也没什么问题?

wishel 发表于 2009-10-28 14:59:42

网络传输会不会打乱顺序?我的理解是也可能的
之所以tcp不会打乱ww之间和rr之间的顺序,是因为这是tcp协议保证的。tcp协议栈确保异步io驱动不会做这种打乱顺序的性能优化。
而udp就可能被打乱。
而tcp的,wr之间顺序也是不保证的。socket有一个读缓冲和一个写缓冲。
页: [1]
查看完整版本: windows平台异步io的执行顺序