我已经开始研究一种我不知道在Linux中称为asynch IO的新范例。
我的目标是使用异步IO目标套接字来编写高性能的高效服务器。原因是我的应用程序是IO绑定的。
在搜索更多信息时,我遇到了以下两个介绍。
在异步框架中,我想避免的情况是为每个需要异步处理的通知创建一个新线程,因为它会杀死我的应用程序。
我的问题如下:
这两个框架的幕后工作是否解决了这个问题?
如果是,你会建议考虑插座吗?
此致
AFG
答案 0 :(得分:8)
这些都不是真正用于套接字的。
POSIX AIO接口创建使用常规阻塞IO的线程。他们使用缓冲区缓存, 原则上甚至可以使用套接字(尽管我没有尝试过)。
Linux内核AIO接口不会创建处理请求的线程。它在“无缓冲”模式下独占。要注意非显而易见的行为,例如在某些情况下提交请求时阻止,你既不能预见也不能阻止(除了你的程序表现得很“奇怪”之外)。
你想要的是非阻塞套接字(非阻塞套接字是“一种异步”)和epoll
以将就绪通知的开销降至最低,并且 - 如果你能找出几乎不存在的文档 - splice
和vmsplice
以减少IO开销。使用splice
/ vmsplice
,您可以直接从磁盘DMA到内核缓冲区并从那里推送到网络堆栈。或者,您可以直接将页面从应用程序的地址空间移动到内核,然后推送到网络
缺点是文档很少(至少可以说),特别是TCP,一些问题仍未得到解决,例如什么时候回收记忆是安全的。
答案 1 :(得分:1)
出于网络编程的目的,您需要基于事件的I / O,通过 select(2)调用以及在某些系统上实现(以大多数基本形式) poll(), epoll(), kpoll()等。
POSIX AIO(其中Linux AIO是一个实现),不一定适用于套接字(它在Linux 2.5代码库中的某些时候做过,但我不能确定它仍然可行)。
Unix上的高性能套接字I / O 是基于事件的方式完成的,您可以在循环中处理传入的事件。事件可以是“套接字已准备好写入”,“套接字有新数据”等,然后对它们作出反应。