# Node.js的进程管理

# 操作系统的进程和线程

  • 运行任务的程序叫做“进程”,一个进程只能执行一个任务
  • 进程并发:以多进程形式,允许多个任务同时运行
  • 线程并发:以多线程形式,允许单个任务分成不同的部分运行
  • 操作系统是提供协调机制,防止冲突,共享资源
  • JavaScript是单线程语言,所以多个任务只能排队进行

# 多进程vs多线程

维度 多进程 多线程 比较
数据共享 数据共享复杂,需要用IPC;数据是分开的,同步简单 因为共享进程数据,数据共享简单,同步复杂 各有千秋
资源利用 占用内存多,切换复杂,CPU利用率低 占用内存少,切换简单,CPU利用率高 多线程更好
性能开销 创建销毁,切换复杂,速度慢 创建销毁,切换简单,速度很快 多线程更好
编码实践 编码简单、调式方便 编码、调试复杂 多进程更好
可靠性 进程独立运行,不会相互影响 线程同呼吸共命运 多进程更好
分布式支持 可用于多机多核分布式,易于拓展 只能用于多核分布式 多进程更好

# Event Loop

  • JavaScript 通过EventLoop 的形式解决单线程任务调度问题
  • EventLoop 是一个程序结构,用于等待和发送消息和事件
  • 浏览器的EventLoop和Node的EventLoop是两个概念

# 浏览器的 EventLoop

# Nodejs的 EventLoop

# Nodejs 进程 - process

  • process 是一个全局对象,无需require 直接使用,提供进程描述
  • process对象是 EventEmiter 的实例,暴露了进程事件的钩子
    • exit 监听进程退出
    • uncaughtException 监听异常
  • 提供标准流输出,对应的是进程的 I/O 操作
    • node 版本的 console 底层是由 stdio 实现的
    • 数据流与其他双工数据流不同,同步写会阻塞进程导致性能开销

# Nodejs 进程创建 - child_process/cluster

  • child_process 是 Node.js 的内置模块
    • spawn:适用于返回大量数据,例如图像处理,二进制数据处理
    • exec:适用于小量数据,maxBuffer 默认值为 200 * 1024 超出奔溃
    • fork:衍生新的进程,进程 之间是仙湖独立的,每个进程独立
  • cluster 是 Node.js的内置模块
    • Worker 对象包含了关于工作进程的所有的公共的信息和方法
    • fork:衍生新的进程,进程之间是相互独立的,每个进程独立
    • 使用主从模型轮询处理服务的负载任务,通过IPC通信

# 进程守护

  • 最佳实践说:该挂就挂,挂了怎么自启动?
  • 进程并发:以多进程形式,允许多个任务同时运行
  • 线程并发:以多线程形式,允许单个任务分成不同的部分运行
  • 操作系统提供协调机制,防止冲突,共享资源
  • JavaScript是单线程语言,所以多个任务只能排队进行

使用工具实现进程守护 pm2 forever