【问题标题】:Interrupt driven vs Event Driven I/O model中断驱动与事件驱动 I/O 模型
【发布时间】:2025-05-21 12:40:01
【问题描述】:

在阅读 Node JS 时,定义说 I/O 模型是事件驱动的。这与多线程环境中的中断有何不同?在多线程环境中,当 I/O 操作完成时,会产生一个中断,等待线程现在被推入读取运行状态。在 Node Js 中,根据 I/O 完成后抛出的事件,将回调处理程序推送到事件队列中。

为什么两者不同?

【问题讨论】:

  • 事件驱动与阻塞线程完全不同。甚至在设计、实现、资源使​​用或您如何编码使用它的相同邮政编码中也不行。事实上,它们与设计范围的极端相反。

标签: javascript node.js multithreading


【解决方案1】:

我不确定我是否理解这个问题,但我的理解是......

这两个概念的不同之处在于它们适用于不同级别的处理。事件在更高级别(系统/代码)上使用,而不是在较低级别(CPU)上发生的中断。因此,即使中断确实发生在 CPU 级别,nodejs 也会将它们抽象化(使用单独的 I/O 线程),如果定义了将执行回调。 多线程环境(例如 Java)所做的是挂起和恢复线程。这与 CPU 级别的中断不同。 Java 确实让程序员像这样实现中断:

for (int i = 0; i < importantInfo.length; i++) {
    // Pause for 4 seconds
    try {
        Thread.sleep(4000);
    } catch (InterruptedException e) {
        // We've been interrupted: no more messages.
        return;
    }
    // Print a message
    System.out.println(importantInfo[i]);
}

但这一点不像 CPU 中断或 nodejs 事件/回调。

虽然说nodejs是单线程的,但它确实使用了多个线程,但是它只使用一个主线程,该主线程旨在花费很少的时间在CPU上,并将其他IO或CPU密集型任务传递给其他任务,所以这可能已准备好处理下一个(通常是 http)请求

一些参考链接:

http://www3.ntu.edu.sg/home/ehchua/programming/java/J5e_multithreading.html

http://docs.oracle.com/javase/tutorial/essential/concurrency/interrupt.html

Difference between interrupt and event

https://softwareengineering.stackexchange.com/questions/298493/nodejs-like-interrupt-handlers

【讨论】: