进程通信(IPC,Inter-Process Communication)是操作系统中让独立进程交换数据、同步协作的核心机制,用于打破进程间内存隔离,实现多进程协同。

一、核心目标
- 数据传输:在进程间传递字节流、结构化数据或文件数据。
- 同步协作:协调执行顺序,避免资源竞争。
- 资源共享:共享内存、文件等,减少数据拷贝。
二、主流通信方式(原理 + 特点 + 场景)
1. 管道(Pipe)

- 匿名管道 :内核缓冲区实现,半双工、单向 ,仅用于父子 / 兄弟进程 ,遵循 FIFO。
- 优点:简单、系统原生、开销小。
- 缺点:单向、仅亲缘进程、缓冲区有限。
- 场景:Shell 命令串联(
ls | grep)。
- 命名管道(FIFO) :以文件形式存在于文件系统,无亲缘进程也可通信 ,仍单向、FIFO。
- 优点:突破亲缘限制、持久化存在。
- 缺点:单向、需处理阻塞。
- 场景: unrelated 进程间简单数据传递。
2. 消息队列(Message Queue)

- 原理:内核维护消息链表,消息含类型 + 数据,可按类型过滤,支持异步。
- 优点:结构化消息、异步、支持优先级、多进程读写。
- 缺点:两次拷贝、消息大小受限、需手动清理。
- 场景:订单 - 支付、任务分发等结构化消息场景。
3. 共享内存(Shared Memory)


- 原理:将同一块物理内存映射到多个进程地址空间,零拷贝、直接读写。
- 优点:性能最高、适合大数据量、低延迟。
- 缺点:无内置同步,需搭配信号量 / 互斥锁防竞争。
- 场景:实时图像处理、高速数据交换。
4. 信号量(Semaphore)
- 原理:计数器 + 等待队列,用于同步与互斥,控制临界区访问。
- 优点:解决竞态、支持多进程同步。
- 缺点:仅用于同步,不传输数据、编程复杂。
- 场景:配合共享内存、资源池访问控制。
5. 信号(Signal)

- 原理:软件中断,内核向进程发送信号(如
SIGINT、SIGKILL),进程注册处理函数。

- 优点:轻量、异步、系统原生、开销极低。
- 缺点:仅传信号类型、无数据、不可靠。
- 场景:进程终止、异常通知、简单控制。
6. 套接字(Socket)
- 原理:通用 IPC,支持本地(Unix Domain Socket)与跨网络(TCP/UDP) ,全双工。
- TCP:面向连接、可靠、字节流。
- UDP:无连接、不可靠、数据报、快。
- 优点:跨主机、双向、通用、成熟生态。
- 缺点:本地通信有两次拷贝、网络有额外开销。
- 场景:Web 服务、客户端 - 服务器、分布式系统。
三、选择建议
- 追求极致性能、大数据 :选共享内存 + 信号量。
- 本地结构化、异步消息 :选消息队列。
- 简单父子进程数据流 :选匿名管道。
- 无亲缘进程简单通信 :选命名管道。
- 跨网络 / 通用场景 :选Socket(TCP/UDP)。
- 仅需通知 / 控制 :选信号。