Linux 什么';事件驱动和异步的区别是什么?在epoll和AIO之间?

Linux 什么';事件驱动和异步的区别是什么?在epoll和AIO之间?,linux,asynchronous,epoll,event-driven,aio,Linux,Asynchronous,Epoll,Event Driven,Aio,事件驱动和异步通常用作同义词。这两者之间有什么区别吗 另外,epoll和aio之间有什么区别?它们如何组合在一起 最后,我读过很多次,Linux中的AIO被严重破坏。它到底是怎么坏的 谢谢。事件驱动是为特定场景注册事件的单个线程。当面对该场景时,将触发事件。然而,即使在那个时候,每个事件都是以顺序方式触发的。这没有什么不同步的。Node.js(Web服务器)使用事件处理多个请求 异步基本上就是多任务处理。它可以产生多个线程或进程来执行某个函数。它与事件驱动完全不同,因为每个线程都是独立的,几乎不

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

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

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


谢谢。

事件驱动是为特定场景注册事件的单个线程。当面对该场景时,将触发事件。然而,即使在那个时候,每个事件都是以顺序方式触发的。这没有什么不同步的。Node.js(Web服务器)使用事件处理多个请求


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

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

epoll和aio使用不同的隐喻:

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

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


AIO的问题是回调函数代码在系统线程上运行,等等,在系统堆栈的顶部运行。正如你所能想象的那样,这有一些问题

它们是完全不同的东西

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

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

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

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

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

如果您希望它能够正常运行而不是以静默方式阻塞(例如,仅适用于某些类型的fd,而使用文件/块设备实际上仅适用于直接I/O,但这些只是冰山一角),则很难很好地使用它。它最终获得了一种能力,即(对使用套接字的程序非常有用)

并且有其自身的局限性(例如,它被认为速度慢,扩展性不好)


如今(2020年),在Linux上进行任意异步I/O的希望越来越少,取舍也越来越少。想象一下,线程允许异步行为独立于使用事件驱动的体系结构。事件驱动体系结构通常允许程序“生活在一个容器中”(例如,一个线程、一个进程等,这可以使某些任务保持简单),但不排除其他“跨容器”异步技术。您会说:“请注意,这并不意味着“并行”或“不同的线程”。“您能用一个例子解释更多吗?”。如果事件是在主线程内处理的,那么它如何独立于当前的主执行流呢?例如,某些软件系统实现了协同例程,可以在同一线程内的执行流之间进行切换。然而,其他系统可能在接收到事件时“抢占”当前操作,运行处理程序,然后恢复原始流的执行,所有这些都在同一个线程内——比如中断。有些系统不支持任何这些,需要将事件“存储起来”,等待主线程完成其当前操作,然后显式地“获取”它——想想JavaScript和Windows消息循环。嗨,Stephen,我认为linux singal handler是这种情况下协程的一个实例。是这样吗?