一、高级通信原语
为解决低级通信(如PV操作)存在的编程复杂、易死锁、效率低下等问题,操作系统引入了更高级的进程通信机制,主要包括以下三种模式:
-
共享存储模式:
多个进程通过访问同一块共享内存区域进行数据交换。该方式要求进程对共享数据结构有明确约定,通常需配合同步机制(如互斥锁)使用,以避免竞争条件。 -
消息传递模式:
进程间通过发送和接收消息来通信,无需共享地址空间。系统提供原语如Send(A, message)和Receive(A, message),适用于分布式环境。可进一步分为直接通信(点对点)和间接通信(通过信箱或端口)。 -
管道通信(Pipe):
利用一个特殊的共享文件(pipe 文件)连接两个相关进程(通常是父子进程),数据以字符流形式按顺序传输,常用于进程流水线协作。管道分为无名管道(临时、单向)和命名管道(FIFO,持久化)。
二、管程(Monitor)
为克服PV操作分散在程序各处导致的死锁风险与维护困难,由汉森(Brinch Hansen)和霍尔(C.A.R. Hoare)于1974-1975年提出“管程”概念,是一种高级同步构造。
核心机制:
- 将共享资源及其操作封装成一个模块,包含:
- 共享数据结构
- 对这些数据的操作过程(函数/方法)
- 初始化代码
- 访问控制权限(仅允许一个进程进入管程)
- 使用条件变量实现进程同步,例如:
wait(condition):使当前进程阻塞并释放管程signal(condition):唤醒等待该条件的一个进程
作用:
- 集中管理共享资源,提高代码可读性和安全性
- 避免死锁和竞态条件,支持多进程安全访问抽象数据类型
补充说明:
上述机制是操作系统中处理并发控制的核心技术,广泛应用于多任务调度、资源共享、进程协作等场景,构成了现代操作系统并发管理的基础。
消息传递模式中的直接通信与间接通信主要区别在于通信双方的耦合方式、地址指定机制以及通信的灵活性:
-
直接通信:
- 通信双方必须显式指明接收者或发送者。例如,进程 A 调用
Send(B, message)明确向进程 B 发送消息。 - 接收方也需调用
Receive(A)明确从 A 接收消息。 - 特点是点对点强耦合,发送和接收进程需要彼此知道对方的身份(ID 或名称)。
- 常用于父子进程或固定协作关系的进程之间。
- 通信双方必须显式指明接收者或发送者。例如,进程 A 调用
-
间接通信:
- 引入中间实体——信箱(Mailbox)或端口(Port),进程通过信箱收发消息。
- 发送方调用
Send(mailbox_id, message)将消息放入指定信箱,接收方调用Receive(mailbox_id, message)从中取走消息。 - 发送者和接收者无需知道对方身份,只需共享同一个信箱即可,实现松耦合通信。
- 支持一对多、多对一、多对多通信模式,适用于复杂系统和分布式环境。
总结对比:
| 对比项 | 直接通信 | 间接通信 |
|---|---|---|
| 地址指定 | 明确指定进程 ID | 使用信箱/端口标识 |
| 耦合度 | 高(强绑定) | 低(松耦合) |
| 灵活性 | 较差 | 高,支持多种通信模式 |
| 应用场景 | 简单、固定的进程间通信 | 复杂系统、客户-服务器架构等 |


6万+

被折叠的 条评论
为什么被折叠?



