为什么需要 IPC?信息共享、加速计算(利用多核 CPU)、模块化(不同进程各司其职)。
Chrome 的多进程例子:
浏览器进程与渲染进程、插件进程通过 IPC 沟通。渲染进程放在沙箱运行,减少安全风险(无法访问磁盘等)。
主要有两种形式:
基础模型:生产者与消费者:
角色:进程 P,进程 Q,及它们之间的通讯链路(communication link)。
逻辑上需要实现两个操作:send()
/ receive()
。关心的元素有:
直接通讯:
send(P, message)
:发送一个消息到进程 Preceive(Q, message)
:接收一个进程 Q 发来的消息这要求 对称的寻址(symmetry in addressing),即 Q 发给 P 时需要指明 P,P 收 Q 消息时需要指明 Q。不灵活。改进方式是使其变成 非对称的(asymmetry),即 P 收消息时不需要指定发送方,而是在消息中包含了发送方信息。
更好的方法是 间接通讯。给定一个邮箱 A,让收方双方都对邮箱做操作:
send(A, message)
receive(Q, message)
还有一些细节,需要具体的实现方式去权衡。比如是否可以多个进程收取同个消息。
邮箱可以被一个进程所拥有。但是更好的方法是由操作系统所有。
同步 / 异步,也称 阻塞(blocking) / 非阻塞(nonblocking)。分几种情况:
如果通讯链路不支持 buffering,即它没有 buffer(一般是消息队列)来存放信息,这要求 blocking send。否则没有此限制。
见 OS: Process: IPC: Shared Memory。