在Linux上的AIO支持

有没有人知道我可以在哪里得到有关最新的Linux内核上的内核支持aio的状态信息? 谷歌search带来的网页可能是绝望的过时。

编辑:

更具体地说,我感兴趣的是非文件相关的描述符,如pipe道和套接字。 networking上的东西表示没有支持,这是否仍然如此?

编辑2:我正在寻找类似于Windows OVERLAPPED IO

Solutions Collecting From Web of "在Linux上的AIO支持"

AIO支持已经包含在linux内核中。 这就是为什么Google上第一次只提供2.4 Linux内核的补丁。 在2.6和3.0中,它已经在那里。

如果您签出Linux内核源代码,则位于fs / aio.c

在GNU libc手册中有一些文档 ,但是请注意,对于所有类型的Linux文件描述符,aio是不可能的。 大多数的“如何”文档大概是在2006年左右,这是适当的,因为那时Linux的AIO是头条新闻。

请注意,POSIX.1b和Unix98标准没有改变,所以你可以针对这些例子的“过时”性质做一些具体的描述吗?

您不需要POSIX AIO(即man aio)异步使用套接字和管道。 根据man 3 aio这是不可能的。 您应该使用非阻塞文件描述符 ,以及事件通知接口 (如select()poll()epollepoll是Linux专用的,但是比前两个更好。

要以非阻塞模式使用文件描述符,必须在每个文件描述符上设置O_NONBLOCK标志:

 fcntl(fd, F_SETFL, O_NONBLOCK) 

在文件描述符处于非阻塞模式后,像read()write()这样的I / O操作将永远不会被阻塞,但如果操作不能立即完成,将返回EAGAINEWOULDBLOCK 。 一些更具体的操作,如connect() ,必须以非阻塞模式以不同的方式使用; 看相关的手册页。

为了能够正确使用非阻塞文件描述符,您的应用程序需要事件驱动 。 基本上,在main() ,你需要首先初始化东西,然后进入事件循环 。 事件循环重复等待事件(使用事件通知接口,例如epoll_wait() ),然后检查发生了什么事件,并对它们做出响应。

现在当你说了一个read() ,并且在EWOULDBLOCK失败的EWOULDBLOCK ,你将它添加到为了可读性而观察的文件描述符列表中。 当事件提供者指示可读性时,您再试一次。

同样,如果尝试write()并且EWOULDBLOCK失败, EWOULDBLOCK可能需要缓存数据,并在指示可写性时再次尝试。

Linux下有两种 AIO。

一个是内核-AIO。 这是丑陋的,有时不符合文件的行为(例如,它会在一定条件下同步运行,而你不能做些什么,并且在某些条件下不能正确取消在线请求等,等等)。 它不适用于管道。
这些是io_类功能。 请注意,您必须链接到-laio ,您必须单独安装在某些系统上(例如Debian / Ubuntu)。

第二个是纯粹的userland实现(glibc),它根据需要产生线程来处理请求。 它有很好的文档记录,工作得相当好,根据文档,它几乎适用于任何包含管道的文件描述符。
这些是类似的功能。 我会明确推荐使用这些,即使它们是“不完善的用户区实施” – 它们很好地工作。

虽然内核版本仍然没有文档上次我看(但功能是在标题),这两个工作同时作为通知机制的eventfd。

或者像Ambroz Bizjak所指出的那样,根本不用说AIO,因为你所描述的并不是绝对必要的。

编辑:
在另一个说明中,既然你使用了“pipes”和“socket”这两个字,你知道vmsplice和splice吗? 这些是向套接字/管道发送数据的最有效的功能。 不幸的是,这是另一个模糊的文件,难以理解的晦涩难懂的陷阱之一。 你自己承担风险,你已经受到警告。

splice可以让您将数据从套接字(或任何文件描述符)传输到管道,或者以其他方式传输。 vmsplice允许您在应用程序空间和管道之间传输数据。
具有讽刺意味的是, vmsplice地应该做同样的事情(重新映射页面,也就是“玩虚拟机”),一个特定的人作为论据,声称所有BSD开发人员都是白痴,早在2006年。

对于好消息来说,好消息是坏消息是你可以移动多少数据有一个“秘密限制”。 据我记得这是64kB(但可以在/ proc中配置)。 如果你有更多的数据,那么你必须在几个数据块中工作,大概是用几个管道缓冲区来完成的,在读取数据的同时填充另一个数据块,并在完成后重新使用旧的管道缓冲区。
这就是它变得复杂的地方。 如果你浏览coreel Trap的讨论,你会发现即使是Grand Master也不能100%确定何时用几个缓冲区来覆盖旧的缓冲区是安全的。

此外,为了vmsplice 真正的工作(即重新映射页面,而不是复制),你需要使用“GIFT”标志,至少对我来说,从文档不清楚什么成为那种记忆。 按照文件的信件,你将需要泄漏内存,因为你永远不会再被允许再触摸它。 当然,这不可能。 也许我只是愚蠢的。

我最终放弃了这一点,刚刚决定使用epoll进行准备工作,使用非正常write的非阻塞套接字。 这种组合可能不是最好的表演者,但它是有据可查的, 并按照记录工作