一段时间以来,我一直在大量搜寻以了解在nix机器上实现异步编程/行为的各种方法,并且(如我之前所知)得到证实,因为事实是仍然没有TRULY异步模式(并发)适用于Windows(IOCP)的Linux使用单线程)。

以下是针对Linux的一些替代方案:

  • select/poll/epoll ::无法使用单线程完成,因为epoll仍在阻止 call 。同样,必须以非阻塞模式打开受监视的文件描述符。
  • libaio ::我所知道的是,它的实现很糟糕,并且它的静态通知基于Windows I/O完成端口,而不是基于完成。
  • Boost ASIO ::它在Linux下使用epoll,因此不是真正的异步模式,因为它生成了从用户代码完全抽象的线程,从而实现了proactor设计模式
  • libevent ::如果我更喜欢ASIO,有什么理由呢?

  • 现在问题来了:)
  • 使用epoll编写快速可扩展网络服务器的最佳设计模式是什么(当然,这里必须使用线程:()
  • 我在某处读到“只能在非阻塞模式下打开套接字”,因此epoll仅支持套接字,因此不能用于磁盘I/O。
    上面的说法有多正确?为什么不能使用epoll在磁盘I/O上进行异步编程?
  • Boost ASIO在epoll调用周围使用了一大把锁。我实际上并不了解它的含义以及如何使用asio本身克服它。 Similar question
  • 如何修改ASIO模式以使用磁盘文件?有没有推荐的设计模式?

  • 希望有人也能回答所有问题,并提供很好的解释。还应该感谢任何指向epoll和AIO设计模式的实现细节的源代码链接。

    最佳答案



    这是不正确的。在最新的Linux内核版本上,默认情况下,Asio库使用epoll()。但是,调用io_service::run()的线程将根据需要调用回调处理程序。在Asio库中,只有一个地方可以使用线程来模拟异步接口(interface),这在documentation中有很好的描述:



    正如您所声称的那样,这并不会使库“不是真正的异步模式”,实际上其名称在定义上会与您不同。



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



    epoll react 器使用互斥锁来调度处理程序,尽管实际上这对于大多数应用程序来说并不是大问题。有一些特定于应用程序的方法可以减轻这种行为,例如每个CPU的io_service可以利用数据局部性。有关此主题的类似问题,请参见my answer。还经常在Asio mailing list上进行讨论。



    如您所述,Asio库本身不支持文件I/O。我曾尝试过将其添加到库中,但建议您在mailing list上进行讨论。

    关于c++ - 了解* nix上异步编程的基础,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8776416/

    10-12 20:15