我是Node的新手,并尝试了解节点的非阻塞特性 在下图中,我创建了一个请求的高级图。
据我了解,单个用户的单个应用程序的所有进程都在一个线程上运行
我想要了解的是事件循环的逻辑如何适合此图。事件循环是否与指令排队的处理器管道相同?
想象一下,我们将一个应用页面加载到RAM中,创建一个流程供程序读取:
readstream.on('data', function(data) {});
创建读取流并等待数据发生的说明:此指令在处理器中“挂起”在寄存器中(等待I / O完成),而在多线程环境中,处理器不执行此操作来自RAM的新指令,直到先前的I / O请求的结果返回到RAM? 或者我认为这完全/部分错误的方式是什么?
只是一个补充(相关的,可能是愚蠢的)问题:在服务器上的不同线程上运行不同的用户,而不是仅针对单个用户的单线程优势?
我是这类细节的新手,请原谅我这个问题对你来说并不完全有意义。但在向前迈进之前,了解这对我来说似乎至关重要
答案 0 :(得分:1)
事件驱动的非阻塞I / O依赖于现代操作系统具有“选择”方法的事实,该方法在O / S级别执行轮询(不浪费CPU周期)。 select方法允许您注册某些I / O事件的回调。这通常比线程启用语言中常用的“每线程连接”模型更有效。有关更多信息,请在Unix / Linux操作系统上执行“man select”。
答案 1 :(得分:0)
线程和I / O与操作系统实现和服务有关,而与CPU架构有关。
涉及任何类型的输入/输出设备的操作 - 大容量存储,网络,串行端口等 - 被构造为从CPU到外部设备的请求,该外部设备通过以下几种可能的机制之一满足。 / p>
除此之外,操作系统还提供其他编程模型。在一个模型中,输入/输出操作的事实性质基本上是伪装的,因此执行程序被赋予看起来是同步的API。在C程序中,对write()
系统调用的调用将导致整个过程延迟,直到操作完成。
另一种编程模型更密切地暴露了系统的异步现实。这就是Node使用的。操作系统提供了启动长时间异步操作的方法,以及进程检查结果或阻塞和等待结果的方法。在Node中,运行时系统可以处理大量单独的操作,因为整个模型基于响应事件而运行的代码。事件可以是合成事物(例如,最初加载和运行的Node模块的“事件”),或者它可能是实际异步外部事件的结果。在输入/输出操作的情况下,Node运行时等待操作系统通知并将其转换为导致某些JavaScript代码运行的事件。