为什么称之为 Overlapped I/O?

15

我只能找到关于如何使用重叠I/O的教程,但我找不到为什么它被称为重叠I/O。

这是因为例如我可以从套接字中读取一些内容,然后在第一个读取返回读取的字节数之前读取其他内容吗?


4
其他人都称之为“异步I/O”。 - user1804599
1
好的,你可以发出读取请求(或者对于相同或不同的套接字发出多个读取请求)。实际的读取将由系统完成,并在完成后通知你。 - Martin James
2
这是因为您可以同时执行多个I/O操作,即它们彼此重叠。 - Harry Johnston
3个回答

14

经典意义上的 Overlapped I/O 追溯到 1960 年代(或更早)。它指的是多个 I/O 转移(通常是每个 I/O 到不同设备)可以同时进行(比如从磁带并发读取和写入到磁盘)。另一个经典名称是 Concurrent I/O。这可以通过中断和/或类似 DMA 的硬件实现(在那些日子里,一些 DMA 硬件实现更像一组小型处理器)来完成。

IBM 主机的示例文章:

Overlapped I/O - IBM


8

我认为20年前的想法是,你可以开始一个IO,执行一些计算或其他工作,然后等待结果。今天很少这样做。我认为这个想法来自于一个时代,当时selectpoll被认为是最先进的技术。

更好的名称应该是异步IO。这是其他所有平台似乎都这么称呼它。事实上,MSDN文档混淆了这两个术语。


Windows也使用“异步I/O”这个短语,例如:https://msdn.microsoft.com/en-us/library/windows/desktop/aa365683%28v=vs.85%29.aspx - Harry Johnston
@usr,今天的最高水平是什么?你是说selectpoll已经过时了吗? - Rich
1
@Rich,它们并没有被正式弃用,但是由此产生的编程模型存在灵活性、代码质量、可扩展性和绝对性能等问题。使用 epoll 或 kqueue 并不难,只需使用一个库即可。我不明白为什么一个知情人不会选择这条路而选择 select/poll。然后你仍然可以选择使用线程来代替异步 IO,这是一个更复杂的权衡。 - usr

5

Overlap操作在Microsoft Windows中的意思与其他操作系统语言中的异步(asynchron)操作没有任何区别。

以您的例子为例,您启动了一个套接字的读取操作,并不等待成功,而是做完全不同的事情(也许在另一个套接字上进行读取)。然后询问第一个操作是否完成。您也可以为此设置事件处理程序或提供CALLBACK函数,在完成时调用该函数。在这种情况下,第一次调用“重叠”了您其余的操作。

还可以参考wikipedia

我猜Microsoft之所以称其为“重叠”,是因为它不像启动线程那样,更像在没有标准名称的情况下启动异步任务。它更像std::async而不是std::thread


“做完全不同的事情”,好吧,如果你愿意,你可以做同样的事情。在任何完成通知被处理之前,您可以对相同或不同的套接字发出多个读取请求。 - Martin James

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接