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

时间:2012-07-08 19:34:55

标签: linux sockets asynchronous linux-kernel

我已经开始研究一种我不知道在Linux中称为asynch IO的新范例。

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

在搜索更多信息时,我遇到了以下两个介绍。

  1. Posix AIO

  2. Linux AIO interface

  3. 在异步框架中,我想避免的情况是为每个需要异步处理的通知创建一个新线程,因为它会杀死我的应用程序。

    我的问题如下:

    1. 这两个框架的幕后工作是否解决了这个问题?

    2. 如果是,你会建议考虑插座吗?

    3. 此致

      AFG

2 个答案:

答案 0 :(得分:8)

这些都不是真正用于套接字的。

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

Linux内核AIO接口不会创建处理请求的线程。它在“无缓冲”模式下独占。要注意非显而易见的行为,例如在某些情况下提交请求时阻止,你既不能预见也不能阻止(除了你的程序表现得很“奇怪”之外)。

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

答案 1 :(得分:1)

出于网络编程的目的,您需要基于事件的I / O,通过 select(2)调用以及在某些系统上实现(以大多数基本形式) poll() epoll() kpoll()等。

POSIX AIO(其中Linux AIO是一个实现),不一定适用于套接字(它在Linux 2.5代码库中的某些时候做过,但我不能确定它仍然可行)。

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