事件驱动和异步之间有什么区别?在epoll和AIO之间?

Con*_*ion 40 linux asynchronous epoll aio event-driven

事件驱动和异步通常用作同义词.这两者有什么不同吗?

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

最后,我多次读过Linux中的AIO被严重破坏.究竟是怎么破碎的?

谢谢.

c-s*_*ile 22

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

epoll和aio使用不同的比喻:

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

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

AIO的问题是你的回调函数代码是从系统线程运行的,所以在系统堆栈的顶部.你可以想象的一些问题.


Ste*_*ung 20

它们是完全不同的东西.

事件驱动的范例意味着,只要发生某些事情,就会向程序发送一个称为"事件"的对象,而不必定期轮询该"事物"以发现它是否已经发生.该"事件"可能被程序捕获以执行某些操作(即"处理程序") - 同步或异步.

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

异步意味着操作可以独立于当前的"主"执行流而发生.你要知道,它确实不是意味着"平行"或"不同的线程"."异步"动作实际上可以在主线程上运行,同时阻止"主"执行流.所以不要混淆"异步"和"多线程".

您可以说,从技术上讲,异步操作会自动假定事件 - 至少"已完成","出现故障"或"已中止/已取消"事件(其中一个或多个)被发送给操作的发起人(或者潜在的O/S本身)表示操作已经停止.因此,异步始终是事件驱动的,但不是相反的.

  • 例如,某些软件系统实现协同例程,其允许在同一线程内的执行流之间进行切换.然而,其他系统可以在接收到事件时"抢占"当前操作,运行处理程序,然后继续执行原始流,所有这些都在同一个线程内 - 认为中断.有些系统不支持其中的任何一个,并要求事件"存储",等待主线程完成其当前操作,然后显式"获取"它 - 想想JavaScript和Windows消息循环. (4认同)