知识卡片
六种进程间通信机制按数据量与跨机能力递进
内容
解决[[本地方法调用的四个步骤在跨进程后为何全部失效]]提出的”跨进程传数据” 问题,操作系统提供了六种手段,它们按”能传多少数据”“能不能跨机器”两条线索 递进分层:管道/具名管道只能传少量字符流,且普通管道限于亲缘进程;信号只是 通知”发生了某事”而不携带实质数据(如kill发送SIGKILL);信号量是进程间同步 协作用的特殊变量(wait/notify),本身不传业务数据;消息队列解决了前三者 数据量受限的问题,但实时性打折扣;共享内存效率最高,允许多进程直接访问同一 内存空间,但只能用于单机;本地套接字接口(Unix Domain Socket)则是唯一 天然可扩展到跨机器网络通信的方式——本机场景下它被优化过、不经网络协议栈, 只是把数据从一个进程复制到另一个进程。理解这个递进关系的意义在于:早期 “透明RPC”的设计者正是把Socket接口看作能同时支撑本地与远程通信的统一入口, 才萌生出让远程调用与本地调用编码完全一致的设想,也正是这个设想后来暴露出 问题(见[[透明RPC范式的争议催生分布式计算八宗罪]])。
参考来源
- 位置:《凤凰架构:构建可靠的大型分布式系统》第2章"访问远程服务"2.1.1节
"进程间通信"(源文件:_epub-src对应OEBPS/Text/chapter14.xhtml)
- 结论依据:原文逐一介绍管道、信号、信号量、消息队列、共享内存、本地套接字
接口六种IPC手段的能力边界,并特别指出套接字接口是网络栈的统一接口、能
支持跨机通信,为下一节"透明调用"的设想埋下伏笔,直接支撑本卡片的递进
关系归纳。
- 原始内容:套接字接口则是更普适的进程间通信机制,可用于不同机器之间的
进程通信……当仅限于本机进程间通信时,套接字接口是被优化过的,不会经过
网络协议栈……只是简单地将应用层数据从一个进程复制到另一个进程。