030 进程间通信前言

进程间通信前言

1. 进程间通信的介绍

1. 进程间通信的目的

进程通信的核心目的是在多个独立运行的进程之间传递数据、同步执行、共享资源。即实现多个进程在数据层面的交互。

实际应用需求:

  • 数据共享: 多个进程处理同一批数据,共享同样的资源。
  • 通知事件: 某一进程完成任务后通知其他进程(如进程终止时要通知父进程)。
  • 某种协同: 控制对临界资源的访问,防止竞争。
  • 服务请求与响应: 客户端请求服务器、子进程向父进程返回结果。
  • 进程控制 :有些进程希望完全控制另一个进程的执行(如 Debug 进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变。

[!NOTE]

每个进程本质上是一个 独立的虚拟地址空间(由 MMU/页表保护),天然是“互不相见”的。因为进程独立性的存在,导致进程通信的成本比较高,所以 通信是有成本的!想要通信,必须要构造一个 “公共的资源”(可访问区域)。这个“资源”谁来提供?—— 操作系统

2. “公共资源”为什么不是由一个进程来提供?

如果由 某个进程创建并拥有 这个资源:

  • 该资源的生命周期就依附于该进程。一旦这个进程结束,资源销毁,通信失效。
  • 资源隶属问题,产生资源“纠纷”。
  • 更重要的是,破坏了进程之间的隔离性,打破了操作系统“沙盒式”的管理理念。

所以:必须由 操作系统 来作为中立方、统一提供这类通信资源。

3. 如何访问这个共享资源 —— 通过系统调用接口

通信资源的创建/访问/销毁,都需要进程向操作系统发出系统调用。所以:“进程通信 = 通过系统调用访问 OS 提供的共享资源”

4. 操作系统是如何组织这些通信资源的 —— 先描述,再组织

操作系统内部有专门的“进程通信模块”,有些还隶属于“文件系统子系统”。

5. 为什么和文件系统有关?

很多通信机制是 “文件化”处理的,所以,在 Linux 哲学里,“一切皆文件”,通信资源被抽象为“特殊文件”来管理。


2. 接口标准:System V vs POSIX

标准类型 出现时间 通信接口风格 特点
System V 较早 结构化复杂 功能强,兼容性差,接口繁琐
POSIX 后来 简洁、现代 更现代、跨平台、统一接口规范

3. 基于文件系统的通信方式:管道(Pipe)

最早的 IPC 方式,基于 文件读写模型 构建:

  • 无名管道(pipe):父子进程间通信,内核缓冲区。
  • 有名管道(FIFO):通过路径文件节点访问,允许无关进程通信。

4. 现代进程间通信方式总览

类型 是否主流 是否跨主机 传输方式 使用场景
1. 共享内存(+锁) ✅ 高性能主流 内存映射 + 同步机制 高性能缓存、图像处理、数据库内核
2. 管道(pipe / FIFO) ❌ 较老 内核缓冲区 父子进程,命令行通信
3. 消息队列(mq) ☑️ 中等主流 内核消息缓冲 日志、异步任务、模块解耦
4. Socket / Unix Socket ✅ 主流 网络/本地 客户端-服务端架构、微服务
5. gRPC / Thrift / HTTP RPC ✅ 主流 网络封装 微服务通信、分布式服务调用
6. ZeroMQ / nanomsg / Redis PubSub ☑️ 高级封装 用户态/网络 分布式流式通信,轻量消息传输
7. DBus / Binder / XPC 特殊平台 内核/对象封装 桌面系统、移动系统(Android)

后续的文章则主要涉及下面的内容:

类别 技术 说明
基础 管道(Pipe) 本地进程间通信的经典方式,所有 IPC 的入门基础,Shell 编程中广泛使用
System V 共享内存 高性能场景常用,适用于高速数据通信,常用于数据库、服务与内核之间
进阶 信号量(System V / POSIX) 用于同步共享内存访问,避免多进程并发导致的数据竞争与混乱
POSIX 共享内存 / 互斥量 更现代的共享内存机制,支持线程同步,跨平台性好,新项目使用

5. 总结

进程通信的本质 是:通过 系统调用访问操作系统提供的共享通信资源(通常是一段特殊的内存空间),这个资源是 由内核统一管理,而不是某个进程私有,从而实现了进程之间的协作、数据交换与资源共享。