文章

进程间通信的两种方式

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 进行授权