Skip to content

进程间通信

考情分析

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 时,该让谁先执行?下一篇进入调度算法的世界。

真题练习

相关真题(1题)

2014Q31选择题2分

管道通信:读空管道和写满管道都会被阻塞