我一直在研究 twisted 和 node.js 框架是如何工作的,并且试图准确地了解操作系统如何使用回调支持 I/O 操作。
我理解这很好,因为我们需要更少的线程,因为我们不需要阻塞线程等待 I/O 操作。但是一旦 I/O 完成,就必须调用回调。
操作系统是如何实现的?
我一直在研究 twisted 和 node.js 框架是如何工作的,并且试图准确地了解操作系统如何使用回调支持 I/O 操作。
我理解这很好,因为我们需要更少的线程,因为我们不需要阻塞线程等待 I/O 操作。但是一旦 I/O 完成,就必须调用回调。
操作系统是如何实现的?
一种方法是让操作系统附加有关等待回调相关数据结构的任何人的信息,例如您正在等待读取通知的文件描述符的内核等效项。当该文件描述符发生问题时,操作系统会扫描服务员以查看是否应该通知任何服务员。如果他们应该这样做,那么它就会这样做。您可以在Lemon 的介绍 FreeBSDkqueue
机制的论文中了解其中的一种实现。具体参见第 6 节“实施”、第 3 和第 4 小节“事件源活动”和“交付”。
这在 OS 中通过使用“I/O 事件通知工具/接口”来解决,例如epoll、poll、kqueue或 select。
看一下deft,尤其是它的io/event loop以了解如何使用上述“通知系统”的具体示例。(java.nio.channels.Selector是 java nio 为此提供抽象的方式。)
免责声明:我是一个灵巧的提交者