进程间通信
// 同一进程中的线程因属同一地址空间,可直接通信
IPC (Inter-process communication) 进程间通信技术. 常见的进程间通信技术列表如下:
类型 | 无连接 | 可靠 | 流控制 | 优先级 |
普通 PIPE | N | Y | Y | N |
命名 PIPE | N | Y | Y | N |
消息队列 | N | Y | Y | N |
信号量 | N | Y | Y | Y |
共享存储(内存) | N | Y | Y | Y |
UNIX 流 SOCKET | N | Y | Y | N |
UNIX 数据包SOCKET | Y | Y | N | N |
Node.js 中的 IPC 通信在 windows 下由命名管道(named pipe)实现,*nix 系统(下)则采用 UDS (Unix Domain Socket) 实现.
普通的 socket 是为网络通讯设计的, 而网络本身是不可靠的, 而为 IPC 设计的 socket 则不然, 因为默认本地的网络环境是可靠的, 所以可以简化大量不必要的 encode/decode 以及计算校验等, 得到效率更高的 UDS 通信.
在 IPC 通道建立之前, 父进程与子进程是怎么通信的? 如果没有通信, 那 IPC 是怎么建立的? 这个问题也挺简单, 只是个思路的问题. 在通过 child_process 建立子进程的时候, 是可以指定子进程的 env (环境变量) 的. 所以 Node.js 在启动子进程的时候, 主进程先建立 IPC 频道, 然后将 IPC 频道的 fd (文件描述符) 通过环境变量 (NODE_CHANNEL_FD) 的方式传递给子进程, 然后子进程通过 fd 连上 IPC 与父进程建立连接.