共享内存(首选)

两个进程通过mmapshmget/shmat或POSIXshm_open共享一块物理内存。常用于数据库缓冲区、视频播放器编解码和渲染器之间。

优点:

  • 直接在同一块内存区读写,不需要内核反复拷贝,最快。
  • 特别适合大文件传输、大矩阵/图像/音视频流

缺点:

  • 需要额外同步机制(信号量/互斥锁/自旋锁)来保证读写有序

内存映射文件

两个进程通过mmap将同一文件映射到自己的虚拟地址空间。常用于日志文件共享、大规模只读数据加载

优点:

  • 适合大文件共享,只在缺页时才加载,减少不必要的拷贝
  • 在文件系统支持下可实现持久化

缺点:

  • 需要磁盘I/O(虽然有页缓存优化)

管道

数据通过内核缓冲区传输,单向流式通信。常用于命令行进程链ls | grep | sort

优点:

  • 简单,使用方便

缺点:

  • 内核态到用户态有拷贝,效率远低于共享内存
  • 缓冲区有限,不适合超大数据

嵌套字(Socket,本地Unix Domain Socket)

两个进程通过socketpairAF_UNIX通信。常用于Nginx、数据库客户端与服务端通信

优点:

  • 接口统一,可拓展到分布式(TCP/UDP)
  • 本地Unix Scoket支持零拷贝

缺点:

  • 相比共享内存,仍有内核开销

消息队列

进程通过内核消息队列传递结构化消息。常用于控制消息(小数据包),比如RPC通知

优点:

  • 支持消息边界,方便管理

缺点:

  • 大数据会分块发送,仍存在内核缓冲区拷贝,不适合大规模数据

信号

异步通知。典型场景:告诉另一个进程有新数据了。

优点:

  • 轻量级

缺点:

  • 仅适合事件通知,不适合传输数据

对比总结

方式 是否适合大数据 速度/开销 是否需要同步机制 场景举例
共享内存 最适合 最高效 需要(锁/信号量) 图像/视频/矩阵计算
内存映射文件 适合 较快 部分需要 大型数据文件共享
管道/FIFO 小数据为主 中等 不需要 进程链
消息队列 小消息为主 中等 内置同步 RPC/任务调度
Uinx Socket 可用 中等偏快 不需要 客户端-服务端
信号 事件通知用 轻量 不涉及 状态变化通知