首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Linux aio.h和libaio.h的区别

Linux aio.h和libaio.h的区别
EN

Stack Overflow用户
提问于 2012-07-08 19:34:55
回答 2查看 5.4K关注 0票数 8

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

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

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

  1. Posix AIO
  2. Linux AIO接口

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

我的问题如下:

  1. 这两个框架的幕后是否解决了这个问题?
  2. 如果是的话,你会建议把插座放在心里吗?

问候

AFG

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-08 19:58:59

这些都不是真正为套接字设计的。

POSIX AIO接口创建使用普通阻塞IO的线程。它们与缓冲区缓存一起工作,原则上甚至应该使用套接字(尽管我确实没有尝试过)。

Linux内核AIO接口不创建线程来处理请求。它只在“不缓冲”模式下工作。注意一些不明显的行为,如在某些情况下提交请求时阻塞,这既不能预见也不能阻止(也不知道程序的行为“怪异”)。

您想要的是非阻塞套接字(非阻塞套接字是“某种异步的”)和epoll,以将就绪通知的开销降到最低,并且--如果您能够找出几乎不存在的文档-- splicevmsplice来减少IO开销。使用splice/vmsplice,您可以直接从磁盘直接DMA到内核缓冲区,然后从那里推送到网络堆栈。或者,您可以直接将页面从应用程序的地址空间移动到内核,并推送到网络。

缺点是文档很少(至少可以这么说),特别是对于TCP,有些问题仍然没有得到解决,例如什么时候恢复内存是安全的。

票数 8
EN

Stack Overflow用户

发布于 2012-07-08 19:58:44

为了进行网络编程,您将需要基于事件的I/O,使用select(2)调用(以最基本的形式)实现,在某些系统上使用poll()epoll()kpoll()等。

POSIX AIO ( Linux是其中的一个实现)并不一定能在套接字上工作(在Linux2.5代码库中的某个时候,它确实工作过,但我不能确定它是否仍然可行)。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11386043

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档