Linux Asynch IO – aio.h和libaio.h之间的区别

我已经开始寻找一种我不知道在Linux中称为asynchronousIO的新范例。

我的目标是使用asynchronousIO定位套接字来编写高性能高效的服务器。 原因是我的应用程序是IO绑定的。

在search更多的信息时,我遇到以下两个介绍。

  1. Posix AIO

  2. Linux AIO接口

在asynchronous框架中,我想避免的情况是为每个需要asynchronous处理的通知创build一个新的线程,因为它会终止我的应用程序。

我的问题如下:

  1. 这两个框架的幕后是否可以解决这个问题呢?

  2. 如果是的话,你会build议在sockets上有什么?

问候

AFG

Solutions Collecting From Web of "Linux Asynch IO – aio.h和libaio.h之间的区别"

这些都没有真正的套接字。

POSIX AIO接口创建使用正常阻塞IO的线程。 他们使用缓冲区缓存,原则上甚至应该使用套接字(尽管我承认没有尝试过)。

Linux内核的AIO接口不会创建线程来处理请求。 它完全在“无缓冲”模式下工作。 请注意在某些情况下提交请求时阻塞等非显而易见的行为,您无法预见也无法预防(也不知道除了您的程序行为“怪异”之外)。

你想要的是非阻塞套接字(非阻塞套接字是“一种异步”)和epoll以尽量减少准备通知的开销,并且 – 如果你可以找出几乎不存在的文档 – splicevmsplice减少IO开销。 使用splice / vmsplice您可以直接从磁盘DMA到内核缓冲区,并从那里推送到网络堆栈。 或者,您可以直接将应用程序的地址空间中的页面移动到内核,然后推送到网络。
缺点是文档是稀少的(至少可以这么说),特别是在TCP中,有些问题仍然没有得到解决,例如回收内存是否安全。

为了网络编程的目的,你需要基于事件的I / O,用select(2)调用来实现(以最基本的形式),在一些带有poll()epoll()kpoll()等的系统上

POSIX AIO(其中Linux AIO是一个实现)不一定适用于套接字(它在Linux 2.5代码库中已经做了一些工作,但是我不能肯定它仍然有可能)。

Unix上的高性能套接字I / O是以基于事件的方式完成的,在这种方式下,您可以在循环中处理传入的事件。 一个事件可以是“套接字准备好写”,“套接字有新数据”等,然后对它们作出反应。