10 进程间通信 | 《操作系统》笔记
这一系列是操作系统 (清华大学向勇、陈渝)视频课的课堂笔记,主要是课堂 PPT 和部分讲授内容的文字版,仅供参考。
概述(Inter Process Communication, IPC)
- 直接通信与间接通信
- 直接通信
- 进程必须正确的命名对方:
- send(P, message) - 发送信息到进程 P
- receive(Q, message) - 从进程 Q 接受消息
- 通信链路的属性
- 自动建立链路
- 一条链路怡好对应一对通信进程
- 每对进程之间只有一个链接存在
- 链接可以是单向的,但通常为双向的
- 进程必须正确的命名对方:
- 间接通信
- 定向从消息队列接收消息
- 每个消息队列都有一个唯一的 ID
- 只有它们共享了一个消息队列,进程才能够通信
- 通信链路的属性
- 只有进程共享一个共同的消息队列,才建立链路
- 链接可以与许多进程相关联
- 每对进程可以共享多个通信链路
- 连接可以是单向或双向
- 操作
- 创建一个新的消息队列
- 通过消息队列发送和接收消息
- 销毁消息队列
- 原语的定义如下
- send(A, message) - 发送消息到队列 A
- receive(A, message) - 从队列 A 接受消息
- 定向从消息队列接收消息
- 直接通信
- 阻塞与非阻塞
- 阻断被认为是同步的
- 非阻塞被认为是异步的
- 通信链路缓冲
- 零容量:发送方必须等待接收方
- 有限容量:发送方必须等待,如果队列满
- 无限容量:专送方不需要等待
信号
- Signal(信号)
- 软件层面的中断
- Examples: SIGFPE, SIGKILL, SIGUSRI, SIGSTOP, SIGCONT
- 接收到信号时会发生什么
- Catch: 指定信号处理函数被调用
- Ignore: 依靠操作系统的默认操作
- Example: Abort, memory dump, suspend or resume process
- Mask: 闭塞信号因此不会传送
- 可能是暂时的(当处理同样类型的信号)
- 不足
- 不能传输要交换的任何数据
管道
- 内存中的一个 buffer
- 把一个程序的输出重定向到另一个程序的输入
- 子进程从父进程(shell)继承文件描述符
- 进程不知道(或不关心)从键盘、文件、程序读取或写入到终端、文件、程序
消息队列
- 管道的缺点
- 没有父进程的参与无法完成
- 传递字节流而非结构化的数据
- 消息队列按 FIFO 的来管理消息
- Message: 作为一个字节序列存储
- Message Queues: 消息数组
- FIFO&FILO configuration
共享内存
- 进程
- 每个进程都有私有地址空间
- 在每个地址空间内,明确地设置了共享内存段
- 优点
- 快速、方便地共享数据
- 不足
- 必须同步数据访问
- 特点
- 最快的方法
- 一个进程写另外一个进程立即可见
- 没有系统调用干预
- 没有数据复制
- 不提供同步:由程序员提供同步
10 进程间通信 | 《操作系统》笔记