默认情况下:一个 Node 进程

一个 Node 应用启动后,通常对应 一个 Node 进程,这个进程里会包含几类关键执行角色:

1. JS 主线程

这里要注意:“JavaScript 单线程”说的是执行 JS 代码的主线程,不是说整个 Node 进程里只有一个线程。

这点可以和 为什么 js 是单线程 一起理解。

2. V8 引擎相关线程

  • Node 基于 V8 执行 JavaScript
  • 垃圾回收、JIT 编译等底层工作并不等于都在 JS 主线程里完成

如果从面试回答角度,不一定要展开到底层线程细节,但要知道 Node 不是“只有一个线程”的字面意思

3. libuv 线程池 / 辅助线程

  • 一些 I/O、文件读写、DNS、压缩、加密等任务,会交给底层线程池处理
  • 处理完之后,再把回调结果交还给主线程进入 事件循环 Event loop

所以 Node 的高并发能力,并不是“一个线程什么都做”,而是:

  • JS 主线程负责调度和执行回调
  • 底层线程或系统能力负责耗时工作

这和浏览器里“JS 主线程 + Web API/宿主能力”有点像,但整体架构又不同,可以对照 浏览器包含哪些进程 来记。

Node 默认不是什么“多进程架构”

如果不额外做处理,Node 默认不是像浏览器那样:

  • 一个主进程
  • 多个渲染进程
  • GPU 进程
  • 插件进程

Node 默认更接近:

  • 一个进程
  • 这个进程里有一个执行 JS 的主线程
  • 再配合一些底层工作线程

所以如果面试官问“Node 包含哪些进程”,一个很稳妥的回答是:

Node 默认通常只有一个进程;但这个进程内部不是只有一个线程,而是由 JS 主线程、事件循环机制和底层线程池一起协作完成任务。

什么时候 Node 会变成“多进程”

当我们主动使用下面这些方案时,Node 才会扩展成多进程模型:

  • child_process
  • cluster
  • 进程守护/部署工具(例如 PM2 的 cluster 模式)

这时通常会出现:

  • 一个主控进程
  • 多个 worker 子进程

这样做的核心目的通常是:

  • 利用多核 CPU
  • 隔离故障
  • 提升吞吐量

但要注意:这已经不是“Node 默认自带哪些进程”,而是“你主动把 Node 应用扩展成多进程”。

和浏览器做一个对比

浏览器

Node

  • 默认通常只有一个进程
  • 重点不是“有多少进程”,而是“一个进程里如何协调线程、I/O 和 事件循环 Event loop

面试时可以怎么回答

可以直接答:

Node 默认一般只有一个进程,不像浏览器那样天然是多进程架构。
但这个进程内部也不只是一个线程,通常是 JS 主线程负责执行代码和事件循环,底层还有 V8 和 libuv 相关线程协助处理垃圾回收、文件 I/O、网络等任务。
如果使用 child_processcluster 之类能力,Node 才会扩展成多进程模型。

关联笔记