进程间通信
进程地址空间隔离,协作必须走 IPC。面试主线:各方式机制、适用场景、性能对比。
IPC 方式总览
五种 IPC: 机制与方向
| 方式 | 机制 | 特点 | 适用 |
|---|---|---|---|
| 管道 | 内存缓冲,单向字节流 | 简单,半双工,无名管道限父子 | 父子进程、shell 管道 |
| 命名管道(FIFO) | 文件系统入口的管道 | 无亲缘关系可用 | 简单流式通信 |
| 消息队列 | 内核消息链表,按类型读 | 有界、消息化,跨进程解耦 | 短消息、解耦场景 |
| 共享内存 | 同一物理页映射到多进程 | 最快(无拷贝),要自己同步 | 大数据量、性能敏感 |
| 信号 | 异步通知事件 | 不传数据,只是通知 | 事件通知、kill |
| Socket | 内核缓冲,网络协议栈 | 可跨机器、全双工 | 网络通信、RPC |
管道 vs 共享内存
- 管道:数据要经过内核缓冲(写→内核→读),两次拷贝,慢但安全(内核同步)
- 共享内存:直接读写同一块物理内存,零拷贝,最快,但同步自己做(配信号量/互斥锁)
面试话术:共享内存是性能之王,管道是安全之选。性能敏感大流量用共享内存+信号量,一般场景管道/消息队列足够。
信号
- 异步通知:进程收到信号中断当前执行,跑处理器
- 常见信号:SIGKILL(强制杀,不可捕获)、SIGTERM(请求退出)、SIGINT(Ctrl+C)、SIGHUP(终端断开)
- 应用场景:优雅退出、定时器(alarm)、父子进程通知
Socket 与本地通信
- Unix domain socket:本机进程通信,不走网络栈,比 TCP socket 快
- TCP socket:可跨机器,是分布式系统的基础(见网络分类)
- 本质:一切 IPC 在网络化后都是 socket
面试追问
- 最快的 IPC 是什么? 共享内存:零拷贝直接读写。代价是同步自己管(信号量/锁)
- 管道为什么慢? 数据经内核缓冲两次拷贝。安全(内核同步)换性能
- 共享内存要配什么? 信号量/互斥锁:多进程并发读写同一块内存,同步必须自己做
- 信号能传数据吗? 不能,只是异步通知。传数据用管道/消息队列/共享内存
- 本机高性能通信用什么? Unix domain socket 或共享内存。TCP 有网络栈开销,跨机才需要