进程于线程-3
进程通信
1. 进程通信的定义与分类
进程通信:进程间的信息交换,分为 低级通信(如PV操作,传递少量控制信息)和 高级通信(高效传输大量数据)。
高级通信三大类:共享存储、消息传递、管道通信(信号为特殊机制)。
2. 共享存储(Shared Memory)
核心思想:进程间通过 共享内存区域 直接读写数据(需同步互斥控制)。
- 分类:
✅ 基于数据结构的共享(低级):共享指定数据结构(如数组),灵活性低。
✅ 基于存储区的共享(高级):OS分配共享内存块,进程通过系统调用映射到各自地址空间,用户自行读写数据。 - 特点:
- 最快的通信方式(直接内存访问,无内核中转)。
- 需PV操作保证互斥(如防止同时写共享区)。
- 类比:甲、乙共享一个“布袋”,甲放入物品,乙取出(需约定谁先谁后)。
3. 消息传递(Message Passing)
核心思想:进程通过OS提供的 “发送/接收原语” 传递格式化消息(消息头+数据),隐藏通信细节。
分类:
(1)直接通信 📨:
- 发送进程直接将消息挂到接收进程的 消息缓冲队列。
- 原语:
send(P, msg)
(发送给进程P)、receive(Q, msg)
(接收来自进程Q的消息)
(2)间接通信 📬:
- 消息通过 中间实体(信箱) 转发,接收进程从信箱取消息。
- 适用于网络通信(如电子邮件:发件人→邮箱服务器→收件人)。
特点:
- 灵活,支持多对多通信,无需共享内存。
- 微内核OS的核心通信方式(如微内核与服务器进程通信)。
4. 管道通信(Pipe)
核心思想:通过 特殊共享文件(pipe文件) 实现通信,数据 先进先出(FIFO),按“生产者-消费者”模型工作。
- 机制要求:
- 互斥 🔒:同一时间仅一个进程读写管道。
- 同步 ⏳:
- 管道满时,写进程阻塞,直到读进程取走数据。
- 管道空时,读进程阻塞,直到写进程写入数据。
- 确定对方存在 🤝:通信双方必须都存在。
- Linux中的管道特性:
- 固定大小缓冲区(4KB),不可无限增长。
- 数据读取后立即释放空间(一次性操作)。
- 单向通信:若需双向通信,需创建两个管道。
- 子进程继承父进程的管道,常用于父子进程通信。
5. 信号(Signal)
核心思想:通过 预定义信号 通知进程发生特定事件(如异常、外部请求),是一种 异步通信机制。
信号处理流程:
- 信号发送:
- 内核发送(如非法指令→
SIGILL
信号)。 - 进程发送(通过
kill
函数指定目标PID和信号序号)。
- 内核发送(如非法指令→
- 信号记录:PCB中用 位向量 记录待处理信号(1表示有信号,0表示已处理)。
- 信号处理:
- 默认处理:OS预设动作(如
SIGKILL
终止进程)。 - 自定义处理:进程注册信号处理函数(覆盖默认行为)。
- 默认处理:OS预设动作(如
- 特点:
- 传递简单控制信息(非大量数据),如终止、暂停进程。
- 信号处理在 用户态 执行,处理后返回原进程继续运行。
四大通信方式对比表
方式 | 核心媒介 | 通信效率 | 数据量 | 同步互斥 | 典型应用 |
共享存储 | 共享内存区 | 最高 | 大量 | 需PV操作控制 | 高性能进程间通信 |
消息传递 | 格式化消息(直接/间接) | 中 | 中量 | OS自动实现 | 微内核、分布式系统 |
管道通信 | 特殊共享文件(FIFO) | 中低 | 流式数据 | 内置互斥同步机制 | Linux父子进程通信 |
信号 | 预定义信号(如SIGKILL) | 高(通知) | 少量(事件) | 异步处理 | 异常通知(如除零错) |
考试重点
- 共享存储的同步互斥:必须配合PV操作防止冲突(如写时加锁)。
- 消息传递的直接/间接通信:直接通信需指定目标进程,间接通信通过信箱中转。
- 管道通信的特性:单向、FIFO、固定缓冲区、需双方存在。
- 信号的异步性:信号处理打断进程正常执行,处理后返回原断点。
✨ 一句话总结:进程通信通过共享内存(最快)、消息传递(灵活)、管道(流式)、信号(事件通知)实现,核心是平衡效率、易用性与同步需求! ✨