在*nix上了解异步编程的基础知识

Aru*_*nmu 16 c c++ epoll aio boost-asio

一段时间以来,我一直在谷歌上搜索有关在nix机器上实现异步编程/行为的各种方法,并且(正如我之前所知)已经确认仍然没有TRULY异步模式(并发)使用单线程)Linux适用于Windows(IOCP).

以下是linux提供的几种替代方案:

  1. select/poll/epoll ::无法使用单个线程完成,因为epoll仍然阻止调用.此外,必须以非阻塞模式打开受监视的文件描述符.
  2. libaio ::我所了解的是,它的实现很糟糕,它仍然是基于通知而不是基于Windows I/O完成端口的完成.
  3. 提升ASIO ::它在linux下使用epoll,因此不是真正的异步模式,因为它产生的线程完全从用户代码中抽象出来以实现proactor设计模式
  4. libevent ::如果我喜欢ASIO,有什么理由可以选择吗?

现在问题来了:)

  1. 使用epoll编写快速可扩展网络服务器的最佳设计模式是什么(当然,这里必须使用线程:()
  2. 我曾在某处读过"只能在非阻塞模式下打开套接字",因此epoll仅支持套接字,因此不能用于磁盘I/O. 上述声明的真实性以及使用epoll无法在磁盘I/O上进行异步编程的原因是什么?
  3. Boost ASIO使用一个围绕epoll呼叫的大锁.我实际上并没有理解它的含义是什么以及如何使用asio本身克服它.类似的问题
  4. 如何修改ASIO模式以使用磁盘文件?有没有推荐的设计模式?

希望有人能够用很好的解释回答所有问题.任何链接到源,其中epoll和AIO设计模式的实现细节是开辟的也是赞赏.

Sam*_*ler 12

提升ASIO ::它在linux下使用epoll,因此不是真正的异步模式,因为它产生的线程完全从用户代码中抽象出来以实现proactor设计模式

这是不正确的.Asio库epoll()默认使用最新的Linux内核版本.但是,线程调用io_service::run()将根据需要调用回调处理程序.在Asio库中只有一个位置用于模拟异步接口,在文档中有详细描述:

每个io_service的附加线程用于模拟异步主机解析.该线程是在第一次调用ip::tcp::resolver::async_resolve()或 创建时创建的 ip::udp::resolver::async_resolve().

这并不会使您所声称的库"不是真正的异步模式",实际上它的名称根据定义不同意您的意思.

1)使用epoll编写快速可扩展网络服务器的最佳设计模式是什么(当然,这里必须使用线程:()

我建议使用Boost Asio,它使用proactor设计模式.

3)Boost ASIO围绕epoll呼叫使用一个大锁.我实际上并没有理解它的含义是什么以及如何使用asio本身克服它

epoll反应器使用互斥锁来发送处理程序,但实际上这对大多数应用程序来说并不是一个大问题.有一些特定于应用程序的方法可以缓解此行为,例如io_service每个CPU可以利用数据位置.请参阅对此主题的类似问题的回答.它也经常在Asio邮件列表上讨论.

4)如何修改ASIO模式以使用磁盘文件?有没有推荐的设计模式?

如您所述,Asio库本身不支持文件I/O. 有几次尝试将它添加到库中,我建议在邮件列表上讨论.