50

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

epoll另外,和 和有什么区别aio?它们是如何组合在一起的?

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

谢谢。

4

4 回答 4

28

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

epoll 和 aio 使用不同的比喻:

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

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

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

于 2011-04-30T22:43:38.887 回答
28

它们是完全不同的东西。

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

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

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

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

于 2011-05-01T15:22:19.500 回答
3

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

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

于 2011-04-30T22:16:30.460 回答
2

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

通过 KAIO// 完成的 AIOlibaio带有io_submit很多警告,如果您希望它能够正常运行而不是静默阻塞,则很难很好地使用它(例如,仅适用于某些类型的 fd,当使用文件/块设备时,实际上仅适用于直接I/O,但这些只是冰山一角)。它最终确实获得了使用 4.19 内核指示文件描述符就绪的能力,这对于使用套接字的程序很有用。

Linux 上的 POSIX AIO 实际上是 glibc 的用户空间线程实现,并且有其自身的局限性(例如,它被认为很慢并且不能很好地扩展)。

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

于 2020-04-24T05:08:00.540 回答