事件驱动编程是如何实现的?

6

我正在研究twisted和node.js框架的工作原理,并试图确切地了解操作系统如何使用回调支持I/O操作。

我知道这很好,因为我们需要更少的线程,因为我们不需要阻塞线程等待I/O操作。但是一旦I/O完成,必须有某个东西调用回调函数。

操作系统是如何实现这个功能的?

2个回答

5
一种方法是让操作系统将等待回调的任何人的信息附加到相关数据结构中,例如您正在等待读取通知的文件描述符的内核等效物。当该文件描述符发生变化时,操作系统会扫描等待者以查看是否应该通知任何人。如果应该通知,则操作系统会这样做。您可以在Lemon介绍FreeBSD的kqueue机制的论文中阅读有关此实现的内容。请特别参见第6节“实现”,第3和4小节“事件源上的活动”和“交付”。

3
在操作系统中,可以通过使用“I/O事件通知设施/接口”,例如epoll、poll、kqueue或select来解决此问题。请参考deft,特别是其io/event loop,以了解上述“通知系统”的具体用法。(java.nio.channels.Selector是Java NIO提供此抽象的方式。)
免责声明:我是Deft Committer。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接