1. 概述
进程间通信的原因:
进程之间要保持独立, 也需要通信, 保证相对独立性的同时还需要去确保进程间的沟通.
1.1 通信模型
IPC facility提供2个操作:
- send(message) -- 消息大小固定或者可变
- receive(message)
如果P和Q想通信, 需要:
- 在它们之间建立通信链路
- 通过 send/receive交换消息
通信链路的实现:
- 物理(例如, 共享内存, 硬件总线)
- 逻辑(例如, 逻辑属性)
1.2 直接及间接通信
假如进程A, B需要进行通信, 有以下两种方式:
- 进程A把消息先发给内核, 由内核再转发给进程B.
- 进程A和B直接进行通信.
那么第一种方式就是间接通信, 第二种方式是直接通信.
为了能够实现有效正确的通信, 直接/间接通信需要有以下注意事项:
直接通信:
- 进程必须正确的命名对方:
- send(P, message) -- 发送信息到进程P
- receive(Q, message) == 从进程Q接受消息
- 通信链路的属性
- 自动建立链路
- 一条链路恰好对应一对通信进程
- 每对进程之间只有一个链接存在
- 链接可以是单向的, 但通常为双向的
间接通信:
- 定向从消息队列接收消息
- 每个消息队列都有一个唯一的ID
- 只有它们共享了一个消息队列, 进程才能够通信
- 通信链路的属性
- 只有进程共享一个共同的消息队列, 才建立链路
- 链路可以与许多进程相关联
- 每对进程可以共享多个通信链路
- 连接可以是单向或双向
- 操作
- 创建一个新的消息队列
- 通过消息队列发送和接收消息
- 销毁消息队列
- 原语的定义如下:
send(A, message) --- 发送消息到队列A
receive(A, message) --- 从队列A接受消息
1.3 阻塞与非阻塞
消息传递可以是阻塞或非阻塞
阻断被认为是同步的:
- Blocking send has the sender block until the message is received
- Blocking receive has the receiver block until a message is available
非阻断被认为是异步的:
- Non-blocking send has the sender send the message and continue
- Non-blocking receive has the receiver receive a valid message or null
1.4 通信链路缓冲
队列的消息被附加到链路, 可以是以下3种方式之一:
- 0容量 - 0 messages, 发送方必须等待接收方(阻塞传递)
- 有限容量 - n messages的有限长度, 如果队列满了那么发送方就必须等待
- 无限容量 - 无限长度, 发送方不需要等待
2. 信号
Signal:
- 软件中断通知事件处理
- Example: SIGFPE, SIGKILL, SIGUSR1, SIGTOP, SIGCONT
接收到信号时会发生什么:
- Catch: 指定信号处理函数被调用
- Ignore: 依赖操作系统的默认操作(Example: Abort, memory, dump, suspend or resume process)
- Mask: 闭塞信号因此不会传送, 可能是暂时的(当处理同样类型的信号)
不足:
不能传输要交换的任何数据
3. 管道
管道是用来进行数据交换的.
4. 消息队列
消息队列按FIFO来管理消息:
- Message: 作为一个和字节序列存储
- Message Queues: 消息数组
- FIFO & FIFO configuration
5. 共享内存
进程:
- 每个进程都有私有地址空间
- 在每个地址空间内, 明确地设置了共享内存段
优点:
- 快速, 方便地共享数据
不足:
- 必须同步数据访问