【问题标题】:What's the difference between event-driven and asynchronous? Between epoll and AIO?事件驱动和异步有什么区别?在 epoll 和 AIO 之间?
【发布时间】:2011-08-16 05:47:58
【问题描述】:

事件驱动和异步经常被用作同义词。两者有区别吗?

另外,epollaio 有什么区别?它们如何组合在一起?

最后,我多次读到 Linux 中的 AIO 严重损坏。到底是怎么破的?

谢谢。

【问题讨论】:

  • 想象一下允许异步行为独立于使用事件驱动架构的线程。事件驱动架构通常允许程序“存在于一个容器中”(例如,一个线程、一个进程等可以使某些任务保持简单),但不排除其他“跨容器”异步技术。

标签: linux asynchronous epoll event-driven aio


【解决方案1】:

事件驱动是为特定场景注册事件的单线程。当遇到这种情况时,会触发事件。然而,即使在那个时候,每个事件都以顺序方式触发。它没有什么异步的。 Node.js (webserver) 使用事件来处理多个请求。

异步基本上是多任务处理。它可以产生多个线程或进程来执行某个功能。它与事件驱动完全不同,因为每个线程都是独立的,几乎不会以简单的响应方式与主线程交互。 Apache(网络服务器)使用多个线程来处理传入的请求。

【讨论】:

    【解决方案2】:

    事件是实现异步执行的范例之一。 但并非所有异步系统都使用事件。那是关于这两者的语义 - 一个是另一个的超实体。

    epoll 和 aio 使用不同的比喻:

    epoll 是一个阻塞操作 (epoll_wait()) - 你阻塞线程直到某个事件发生,然后你将事件分派到代码中的不同过程/函数/分支。

    在 AIO 中,您将回调函数(完成例程)的地址传递给系统,系统会在发生某些事情时调用您的函数。

    AIO 的问题是您的回调函数代码运行在系统线程等系统堆栈顶部。您可以想象到一些问题。

    【讨论】:

      【解决方案3】:

      它们是完全不同的东西。

      事件驱动范式意味着每当某事发生时,一个称为“事件”的对象就会发送给程序,而不必定期轮询该“某事”以发现它是否已发生。该“事件”可能会被程序捕获以执行某些操作(即“处理程序”)——同步或异步。

      因此,事件的处理可以是同步的也可以是异步的。例如,JavaScript 使用同步事件系统。

      异步意味着动作可以独立于当前的“主”执行流发生。请注意,它确实 NOT 表示“并行”或“不同线程”。 “异步”操作实际上可能在主线程上运行,同时阻塞“主”执行流。所以不要把“异步”和“多线程”混为一谈。

      您可能会说,从技术上讲,异步操作会自动假定事件——至少“完成”、“故障”或“中止/取消”事件(其中一个或多个)是发送给操作的发起者(或底层 O/S 本身)以发出操作已停止的信号。因此,异步始终是事件驱动的,但反之则不然。

      【讨论】:

      • 您说-“请注意,这并不意味着“平行”或“不同线程”。”你能用一个例子来解释更多吗?如果事件是在主线程中处理的,它如何独立于当前的主执行流?
      • 某些软件系统实现了协同程序,例如,允许在同一线程内的执行流之间切换。然而,其他系统可能会在接收到事件时“抢占”当前操作,运行处理程序,然后恢复原始流的执行,所有这些都在同一个线程内——想想中断。一些系统不支持其中任何一个,并要求将事件“存储起来”,等待主线程完成其当前操作,然后显式“获取”它——想想 JavaScript 和 Windows 消息循环。
      • 嗨,斯蒂芬,我认为 linux 信号处理程序是这种情况下协程的一个实例。对吗?
      【解决方案4】:

      最后,我多次读到 Linux 中的 AIO 严重损坏。到底是怎么破的?

      AIO as done via KAIO/libaio/io_submit comes with a lot of caveats 如果您希望它表现得好而不是 静默 阻塞(例如,仅适用于某些类型的 fd,当使用文件/块设备时仅适用于直接I/O,但这些只是冰山一角)。它最终确实获得了indicate file descriptor readiness with the 4.19 kernel) 的能力,这对于使用套接字的程序很有用。

      POSIX AIO on Linux is actually a userspace threads implementation by glibc 并有其自身的局限性(例如,它被认为很慢并且不能很好地扩展)。

      这些天(2020 年)希望在 Linux 上执行任意异步 I/O 并减少痛苦和权衡来自 io_uring...

      【讨论】:

        猜你喜欢
        • 2020-10-20
        • 2020-03-28
        • 2016-03-17
        • 2020-04-27
        • 2020-01-02
        • 2017-06-21
        • 2023-03-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多