Appearance
进程间通信
考情分析
IPC 在 408 真题中以选择题为主,考查三种通信方式的特点和区别。属于 🔥🔥 中高频考点。
进程有各自独立的地址空间,一个进程想把数据交给另一个进程,不能像线程那样直接读共享变量。怎么办?操作系统提供了几种"传话"机制。
三种高级通信方式
1. 共享存储(Shared Memory)
两个进程共享一块内存区域,通过读写共享区进行通信。
| 特点 | 说明 |
|---|---|
| 速度 | 最快(直接读写内存,无需内核介入) |
| 同步 | 需要进程自行解决互斥问题(如用信号量) |
| 实现 | 操作系统负责建立共享区映射,之后不再干预 |
共享存储分为两种形式:
- 基于数据结构的共享:共享区中存放特定格式的数据(低级)
- 基于存储区的共享:共享区中可存放任意数据(高级)
2. 消息传递(Message Passing)
进程之间通过发送和接收消息来通信。消息由操作系统负责传递。
直接通信方式
发送方指明接收进程的 ID:
send(B, message) // 进程A 向 进程B 发送消息
receive(A, message) // 进程B 从 进程A 接收消息每对通信进程之间自动建立一条逻辑通信链路。
间接通信方式(信箱通信)
消息通过**信箱(Mailbox)**中转:
send(mailbox, message) // 发送消息到信箱
receive(mailbox, message) // 从信箱接收消息信箱方式更灵活:多个发送者可以向同一个信箱发消息,多个接收者也可以从同一信箱取消息。
3. 管道通信(Pipe)
管道是一个共享文件(pipe 文件),本质上是内存中一个固定大小的环形缓冲区。可以把它想象成一根水管——水只能从一端流向另一端,不能倒流。
进程A(写入) ───► 【管道缓冲区】───► 进程B(读取)
写端 读端| 特点 | 说明 |
|---|---|
| 方向 | 半双工通信(数据只能单向流动) |
| 关系 | 通常用于有父子关系的进程间 |
| 同步 | 管道满时写进程阻塞,管道空时读进程阻塞(自动同步) |
| 互斥 | 多个读/写进程需要互斥访问 |
管道的限制
要实现双向通信,需要建立两个管道。管道通信的数据一旦被读取就从缓冲区中消失(FIFO),不能反复读取。
信号(Signal)
信号是一种用于通知进程某个事件已发生的异步通信机制。每种系统事件对应不同的信号类型,每类信号有一个序号(如 Linux 内核实现了约 30 种信号)。
信号的记录
进程的 PCB 中用一个 n 位向量记录当前待处理的信号:
- 某一位为 1 → 该信号待处理
- 信号被处理后 → 对应位清零
另有一个 n 位向量记录被**阻塞(屏蔽)**的信号——被阻塞的信号暂存,直到解除阻塞才处理。
信号的发送
| 方式 | 说明 |
|---|---|
| 内核发送 | 检测到系统事件时发送(如非法指令 → SIGILL) |
| 进程发送 | 调用 kill() 向指定进程发送信号(需提供目标 PID 和信号序号) |
信号的处理
操作系统从内核态返回用户态时(如系统调用结束),检查是否存在未阻塞的待处理信号:
| 处理方式 | 说明 |
|---|---|
| 默认处理 | 执行 OS 预设的操作(如 SIGILL 默认终止进程) |
| 自定义处理 | 进程为某类信号注册自定义处理函数 |
信号处理程序执行结束后,通常返回到原程序被中断的位置继续执行。
信号 vs 其他 IPC
信号只传递一个信号编号,不携带数据内容,适合通知事件而非传输数据。与共享存储、消息传递、管道属于不同层面的通信机制。
四种通信方式对比
| 方式 | 速度 | 同步机制 | 通信方向 | 典型场景 |
|---|---|---|---|---|
| 共享存储 | 最快 | 需自行处理 | 双向 | 大数据量交换 |
| 消息传递 | 中等 | OS 自动处理 | 双向 | 网络通信、微内核 |
| 管道通信 | 中等 | 自动同步 | 半双工 | 父子进程间 |
| 信号 | 快 | 异步通知 | 单向 | 通知事件(非传数据) |
考研高频考点
- 🔥🔥🔥 四种 IPC 方式的特点和区别
- 🔥🔥 管道是半双工的、自动同步的
- 🔥🔥 共享存储速度最快但需要自行处理互斥
- 🔥 直接通信 vs 间接通信(信箱)的区别
- 🔥 信号只传递编号不传递数据,属于异步通知机制
- 🔥 PV 操作属于低级通信
进程之间能通信了,但多个进程同时抢 CPU 时,该让谁先执行?下一篇进入调度算法的世界。