【问题标题】:Do node.js forked processes share any memory via copy-on-write?node.js 分叉进程是否通过写时复制共享任何内存?
【发布时间】:2023-04-09 00:53:02
【问题描述】:

在(某些?)Unix系统中,当您fork一个进程时,新进程将与其前任共享内存。只要内存未被占用,内存就会被共享。这称为牛,写时复制。

我想知道 Node.js 进程分叉是否有任何来自牛的技术优势。如果确实如此,那么 Node.js 进程究竟共享什么?

【问题讨论】:

  • 我意识到这没有直接关系,但可能有一些有用的信息?如果不忽略我。 github.com/nodejs/node/issues/12902
  • @ste2425 文件太牛了。我说的是内存。密切相关的技术。
  • @freakish nodejs.org/api/… 这个链接说你的 js 代码中的变量不是这种情况。但是,不清楚运行时本身或库是否会被吓倒。
  • @Gherman 对,那是因为 nodejs 的“fork”根本不是 fork。我觉得他们这样命名它很有趣。 dev.to/pi0/nodejs-fork-is-not-what-you-think-of-37ko 似乎不仅所有内容都被复制,而且整个代码都被重新执行。太糟糕了,我实际上无话可说。

标签: node.js fork copy-on-write


【解决方案1】:

NodeJS 的 fork do 通过 libuv 库中的 uv_spawn 函数调用 *nix 的 fork。

NodeJS 分叉进程的过程如下:

  1. 您的 javascript 文件从 nodejs 中的 child_process.js 调用 fork function
  2. 该 fork 函数验证脚本中的参数。如果有效,它会调用spawn function
  3. spawn 函数创建ChildProcess 类作为子进程的进程包装器
  4. 在幕后,ChildProcess 类 bind 本身带有来自 NodeJS 原生部分的 Process
  5. 来自javascript部分调用spawn function from Process class的Spawn函数
  6. 在 Process 类中生成函数,然后从 libuv 库中生成 calls uv_spawn
  7. 如果你在 *nix 系统上运行 NodeJS,那么 libuv utilizes fork function

简而言之:是的,它确实在某些 *nix 机器上进行写时复制,尤其是基于 Linux 的机器。

尽管有节省 RAM 使用的潜力,但由于 NodeJS 内部的 V8 engine 和 NodeJS 本身的复杂性,它相当消耗 CPU。

如果确实如此,那么 Node.js 进程究竟共享什么?

在基于 Linux 的情况下,这些进程在被分叉后共享未修改的部分内存。大多数基于 UNIX 的都这样做。但是在 Windows PC 上,CoW 功能仍然 in research 与 2019 一样。

【讨论】:

    猜你喜欢
    • 2012-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-11
    • 2010-10-10
    • 2018-02-04
    • 1970-01-01
    相关资源
    最近更新 更多