## Using node with fork(2) > Node.js And ShadowNode
### Why we want them 1. Runtime 冷启动通常需要约 50~100ms 1. 嵌入式设备性能相当紧凑 1. 函数运行时请求响应时间敏感
## 嵌入式环境 1. 多进程适应多使用场景切换 1. 紧凑的设备性能、能耗限制
## 函数运行时 1. 需要良好的运行环境隔离 1. 需要控制每次执行资源使用
## 函数运行时 1. 单进程服务无法隔离运行环境 1. VM Contexts 无法隔离运行时操作 1. WorkerThreads 无法细分单次资源使用
### What we want 1. 更低的 CPU 时间使用 1. 更快到达进程可使用状态 1. 能够良好地隔离运行环境 1. 能够良好地控制运行资源
### What happens on launch 1. 初始化 uv/vm/platform 1. (code-cache/snapshot) 1. bootstrap loader/node/env 1. main/pre_execution 1. user scripts 1. libraries
### 启动时间都消耗在哪儿了 1. Parsing/Compiling 1. Interpreting 1. Repeat
### Alternatives 1. code cache 1. snapshot 1. fork(2)
Preloaded Modules List - 嵌入式系统库 - 函数运行时库
### Prior Arts 1. Zygote
### Recovering from fork(2) 1. 需要重新创建工作线程 1. 需要保护同步原语不被污染 1. 重新初始化 IPC 句柄
### fork(2) with node.js 1. 事件驱动范式 1. 单线程模型不代表单线程实现 1. Native Addon 访问系统 API
### Recover: uv_loop_fork 1. epoll backend fd 2. async backend fd 3. signals
### Recover: node platform 1. Threaded tasks from VM 1. Threaded tasks from JS land 1. Threaded tracing 1. 暂不支持 worker_threads
### Recover: node addons 1. 没有成标准 API 提供 addon 恢复线程工作 1. 同样 builtin 模块线程工作也无法恢复
### Limitations 1. 需要持续运行 seed 进程 1. seed 进程特性使用有较大限制 1. 需要有对系统的权限控制权限
## yodaos-project/hive
using 'node' as runtime... (node v12.8.1)
fork/hive-fork-child-process.js n=100: 5.954ms
fork/node-fork-child-process.js n=100: 27.218ms
fork/node-spawn-child-process.js n=100: 24.239ms
using 'node' as runtime... (node v12.8.1)
require-lodash/hive-fork-child-process.js n=100: 5.872ms
require-lodash/node-fork-child-process.js n=100: 37.843ms
require-lodash/node-spawn-child-process.js n=100: 34.628ms
using 'iotjs' as runtime... (iotjs v0.11.7)
fork-child-process.js n=100: 2.863ms
node-fork-child-process.js n=100: 36.566ms
node-spawn-child-process.js n=100: 25.797ms
### What's next 1. Collect Usage Case 1. Standardize Fork API
Thanks > @legendecas