进程间通信的两种方式
IPC(进程间通信)有共享内存和消息传递两种方式,前者高效但需同步,后者安全易用适合跨平台。
进程间通信的两种方式
进程间通信的两种方式
什么是进程间通信(IPC)?
进程(Process)是程序在操作系统中的运行实例,具有独立的:
- 代码段
- 数据段(内存空间)
- 文件描述符
- IO 资源等
操作系统为安全性默认对进程进行隔离,但在实际开发中,进程之间往往需要协作与数据共享,于是就有了 IPC。
IPC(Inter-Process Communication)就是进程之间交换信息的机制。
为什么需要 IPC?
典型场景包括:
- 并行计算加速:多个进程并发处理子任务,提高效率;
- 模块化架构:将不同功能封装为独立进程(例如浏览器的渲染与主进程);
- 跨语言/跨平台协作:不同编程语言编写的进程通过通用通信协议交互;
- 分布式系统:不同机器上的进程也要通信(如微服务);
两种主流 IPC 机制对比
特性 | 共享内存(Shared Memory) | 消息传递(Message Passing) |
---|---|---|
是否共享地址空间 | 是 | 否 |
通信效率 | 非常高(几乎等于内存访问) | 较低(依赖系统调用) |
是否易于使用 | 不易(需同步机制) | 更易(内核帮你处理同步) |
是否支持跨主机通信 | 否 | 是(如使用 Socket) |
是否依赖系统调用 | 初始需要,后续无需 | 每次都需(Send/Receive) |
示例应用 | 数据库、游戏引擎、Chrome浏览器等 | 客户端-服务端、远程调用等 |
共享内存机制详解(Shared Memory)
共享内存是性能最优的方式,两个或多个进程共享一块内存区域,通过读写该区域交换数据。
进程地址空间隔离图
+--------------------+ +--------------------+
| 进程 A | | 进程 B |
| ------ ||--------------------|
| 代码段 | | 代码段 |
| 数据段 | | 数据段 |
| 堆栈 | | 堆栈 |
| 共享内存 (映射) ◄────────►共享内存 (映射) |
+--------------------+ +--------------------+
示例:生产者 - 消费者模型
// 假设共享内存中是 int buf[100];
生产者写入数据:[10, 20, 30, ...]
消费者读取数据:[10, 20, 30, ...]
但如果:
- 生产者写入
int32
- 消费者错误读取为
uint8
结果会完全错乱!
注意事项
- 进程需对数据格式达成一致;
- 需自己实现同步机制(如信号量、互斥锁);
- 避免“同时写入”或“读写冲突” → 否则可能产生竞态条件(Race Condition)。
优势
- 快!极快!通信速度几乎等于内存访问;
- 适合高频数据交换、大量数据流传输场景。
消息传递机制详解(Message Passing)
不使用共享内存,而是操作系统提供一种“邮箱”机制,进程通过系统调用 send()
/ receive()
来传递消息。
通信过程简图
1
2
3
4
5
6
7
+--------------------+ send(msg) +--------------------+
| 进程 A | ────────────▶ | 内核 Mailbox |
+--------------------+ | (队列结构) |
| |
+--------------------+ receive() +--------------------+
| 进程 B | ◀─────────────── 从内核拷贝消息
+--------------------+
示例:客户端 - 服务端 通信
客户端:send(request)
服务器:receive(request) → 处理 → send(response)
客户端:receive(response)
这种模型与网络 Socket 通信几乎一致。
衍生机制
- 管道(pipe)
- 消息队列(message queue)
- Socket(支持跨主机)
- RPC(远程过程调用)
Socket 通信原理示意(双向)
机器 A(Client) 机器 B(Server)
+-------------------+ +-------------------+
| 客户端进程 | | 服务器进程 |
| 发送请求 | | 接收请求 |
| recv(response) ◄──── Socket 通道 ────► send(response) |
+-------------------+ +-------------------+
| |
localhost 127.0.0.1 或远程 IP 监听端口如 80、8080
什么时候选哪种 IPC?
场景 | 推荐方式 | 理由 |
---|---|---|
高速数据传输 | 共享内存 | 极致性能 |
跨主机通信 | 消息传递(Socket) | 网络支持 |
简单应用 | 消息传递 | 编程简单、低出错 |
大规模数据处理 | 共享内存 | 传输开销极低 |
多语言服务交互 | 消息传递(gRPC) | 跨语言支持好 |
本文由作者按照 CC BY 4.0 进行授权