NodeJS:理解非阻塞/事件队列/单线程

我是新来的节点,并尝试了解节点的非阻塞性质。
在下面的图片中,我创build了一个高层次的请求图。

在这里输入图像说明

据我所知,一个单一的应用程序的单个用户的所有进程运行在一个单一的线程。
我想要了解的是事件循环的逻辑如何适合这个图。 事件循环是否与指令排队的处理器pipe道相同?
想象一下,我们将一个应用程序页面加载到RAM中,从而创build一个可供程序读取的stream:

readstream.on('data', function(data) {}); 

有关创build读取stream和等待数据发生的指令:该指令是否在处理器中“挂起”在寄存器中(等待I / O完成),而在multithreading环境中,处理器不会从中获取新的指令RAM,直到以前的I / O请求的结果已经返回到RAM?
或者是我看到这完全/部分错误的方式?

只是一个补充(相关的,也许是愚蠢的)问题:在服务器上的不同线程上运行不同的用户,而不是单一线程的好处只有一个用户?

我是新来的这种types的细节,所以请问,如果这个问题不完全对你有意义。 但理解这一点对我来说似乎是必不可less的。

线程和I / O与操作系统实现和服务有关,而不是CPU体系结构。

涉及任何种类的input/输出设备(大容量存储设备,networking,串行端口等)的操作被构造为从CPU到外部设备的请求,通过几种可能的机制之一,稍后得到满足。

除此之外,操作系统提供了另外的编程模型。 在一个模型中,input/输出操作的实际性质本质上是伪装的,使得正在执行的程序被赋予似乎是同步的API。 在C程序中,调用write()系统调用将导致整个进程延迟,直到操作完成。

另一种编程模型更贴近地暴露了系统的asynchronous现实。 这就是Node所使用的。 操作系统提供了启动长时间asynchronous操作的方式,以及处理检查结果或阻止和等待结果的方法。 在Node中,运行时系统可以处理大量单独的操作,因为整个模型基于响应事件运行的代码。 一个事件可以是一个综合的东西(例如最初加载和运行的Node模块的“事件”),也可能是实际asynchronous外部事件的结果。 在input/输出操作的情况下,Node运行时等待操作系统通知并将其转换为导致一些JavaScript代码运行的事件。

事件驱动的非阻塞I / O依赖于现代操作系统具有在O / S级别执行轮询(不浪费CPU周期)的“select”方法的事实。 select方法允许您为某些I / O事件注册callback。 这往往比在线程化语言中常用的“每个连接线程”模型更有效率。 有关更多信息,请在Unix / Linux操作系统上进行“人工select”。