NodeJS:理解非阻塞/事件队列/单线程
NodeJS: understanding nonblocking / event queue / single thread
我是 Node 新手,想了解 Node 的非阻塞特性。
在下图中,我创建了请求的高级图表。
据我了解,来自单个用户的单个应用程序的所有进程 运行 在单个线程上。
我想了解的是事件循环的逻辑如何适合此图。事件循环是否与指令排队的处理器流水线相同?
想象一下,我们将一个应用程序页面加载到 RAM 中,该页面创建了一个供程序读取的流:
readstream.on('data', function(data) {});
创建读取流和等待数据发生的指令:这条指令"hang"在处理器的寄存器中(等待I/O完成)而在多线程环境中,在上一个 I/O 请求的结果返回到 RAM 之前,处理器不会从 RAM 获取新指令?
还是我看这个 entirely/partially 的方式不对?
只是一个补充(相关的,也许是愚蠢的)问题:运行 不同的用户在服务器上的不同线程上,单线程的好处不是只对单个用户有用吗?
我对这类细节不熟悉,所以如果这个问题对您来说不是很清楚,请原谅。但在继续前进之前,理解这一点对我来说似乎至关重要。
线程和 I/O 与操作系统实现和服务有关,而不是 CPU 架构。
涉及 input/output 任何类型设备的操作——大容量存储、网络、串行端口等——被构造为从 CPU 到外部设备的请求,由几个可能的机制,稍后得到满足。
除此之外,操作系统还提供了可供选择的编程模型。在一个模型中,input/output 操作的实际性质本质上是伪装的,因此执行程序被赋予看似同步的 API。在 C 程序中,调用 write()
系统调用将导致整个过程延迟,直到操作完成。
另一种编程模型更接近地暴露了系统的异步现实。这就是 Node 使用的。操作系统提供了启动长时间异步操作的方法,以及进程检查结果或阻塞并等待结果的方法。在 Node 中,运行time 系统可以兼顾许多单独的操作,因为整个模型都是基于 运行ning 代码来响应事件的。一个事件可以是一个合成的东西(例如正在加载的 Node 模块的 "event" 和最初的 运行),或者它可以是实际异步外部事件的结果。在 input/output 操作的情况下,节点 运行 时间等待操作系统通知并将其转换为导致某些 JavaScript 代码为 运行.[=11= 的事件]
事件驱动的非阻塞I/O依赖于现代操作系统有一个'select'方法在O/S级别执行轮询(不浪费CPU 周期)。 select 方法允许您为某些 I/O 事件注册回调。这往往比启用线程的语言中常用的 'thread-per-connection' 模型更有效。有关更多信息,请在 Unix/Linux OS 上执行 'man select'。
我是 Node 新手,想了解 Node 的非阻塞特性。
在下图中,我创建了请求的高级图表。
据我了解,来自单个用户的单个应用程序的所有进程 运行 在单个线程上。
我想了解的是事件循环的逻辑如何适合此图。事件循环是否与指令排队的处理器流水线相同?
想象一下,我们将一个应用程序页面加载到 RAM 中,该页面创建了一个供程序读取的流:
readstream.on('data', function(data) {});
创建读取流和等待数据发生的指令:这条指令"hang"在处理器的寄存器中(等待I/O完成)而在多线程环境中,在上一个 I/O 请求的结果返回到 RAM 之前,处理器不会从 RAM 获取新指令?
还是我看这个 entirely/partially 的方式不对?
只是一个补充(相关的,也许是愚蠢的)问题:运行 不同的用户在服务器上的不同线程上,单线程的好处不是只对单个用户有用吗?
我对这类细节不熟悉,所以如果这个问题对您来说不是很清楚,请原谅。但在继续前进之前,理解这一点对我来说似乎至关重要。
线程和 I/O 与操作系统实现和服务有关,而不是 CPU 架构。
涉及 input/output 任何类型设备的操作——大容量存储、网络、串行端口等——被构造为从 CPU 到外部设备的请求,由几个可能的机制,稍后得到满足。
除此之外,操作系统还提供了可供选择的编程模型。在一个模型中,input/output 操作的实际性质本质上是伪装的,因此执行程序被赋予看似同步的 API。在 C 程序中,调用 write()
系统调用将导致整个过程延迟,直到操作完成。
另一种编程模型更接近地暴露了系统的异步现实。这就是 Node 使用的。操作系统提供了启动长时间异步操作的方法,以及进程检查结果或阻塞并等待结果的方法。在 Node 中,运行time 系统可以兼顾许多单独的操作,因为整个模型都是基于 运行ning 代码来响应事件的。一个事件可以是一个合成的东西(例如正在加载的 Node 模块的 "event" 和最初的 运行),或者它可以是实际异步外部事件的结果。在 input/output 操作的情况下,节点 运行 时间等待操作系统通知并将其转换为导致某些 JavaScript 代码为 运行.[=11= 的事件]
事件驱动的非阻塞I/O依赖于现代操作系统有一个'select'方法在O/S级别执行轮询(不浪费CPU 周期)。 select 方法允许您为某些 I/O 事件注册回调。这往往比启用线程的语言中常用的 'thread-per-connection' 模型更有效。有关更多信息,请在 Unix/Linux OS 上执行 'man select'。