【发布时间】:2012-02-05 06:42:09
【问题描述】:
一段时间以来,我一直在谷歌上搜索很多东西,以了解在 nix 机器上实现异步编程/行为的各种方法,并且(如我之前所知)确认仍然没有真正的异步这一事实模式(使用单线程的并发)适用于 Windows (IOCP)。
以下是 linux 的几个替代方案:
- select/poll/epoll :: 无法使用单线程完成,因为 epoll 仍在阻塞调用。此外,受监控的文件描述符必须以非阻塞模式打开。
- libaio:: 我了解到的是它的实现很糟糕,而且它仍然基于通知,而不是像 Windows I/O 完成端口那样基于完成。
- Boost ASIO :: 它在 linux 下使用 epoll,因此不是真正的异步模式,因为它产生了完全从用户代码中抽象出来的线程以实现前摄器设计模式
- libevent :: 如果我更喜欢 ASIO,有什么理由这样做吗?
现在问题来了:)
- 使用 epoll 编写快速可扩展网络服务器的最佳设计模式是什么(当然,这里必须使用线程:()
- 我在某处读到“只能在非阻塞模式下打开套接字”,因此 epoll 仅支持套接字,因此不能用于磁盘 I/O。 上面的说法有多真实,为什么不能使用 epoll 在磁盘 I/O 上进行异步编程?
- Boost ASIO 在 epoll 调用周围使用了一个大锁。我实际上并不了解它的含义以及如何使用 asio 本身来克服它。 Similar question
- 如何修改 ASIO 模式以处理磁盘文件?有没有推荐的设计模式?
希望有人能够用很好的解释来回答所有问题。任何解释 epoll 和 AIO 设计模式的实现细节的源链接也很感激。
【问题讨论】:
-
所有
select、poll和epoll都有一个可以为零的超时参数,这使得函数立即返回。 -
另外,有通知,就像
aio_*函数的情况一样是异步的。您要求在事件发生时得到通知,然后在内核处理您的 I/O 时继续您的业务。 -
epoll_wait 不一定是阻塞调用;这取决于传递给它的超时参数(“man epoll_wait”了解详细信息)。
-
有什么理由避免线程?你知道性能问题吗?
-
@Joachim:是的,我知道这个事实。这是否意味着我可以使用 epoll 零超时的单线程实现真正的异步设计模式?
标签: c++ c boost-asio epoll aio