概述
(a)是一种间接通信。A把消息发到内核,内核再转到B
(b)直接通信。
直接通信:
进程必须正确的命名对方:
send(P,message) - 发送信息到进程P
receive(Q,MESSAGE) - 从进程Q接收消息
通信链路的属性
自动建立链路
一条链路恰好对应一对通信进程
每对进程之间只有一个链接存在
链接可以是单向的,但通常为双向的
间接通信:
定向从消息队列接收消息
每个消息队列都有一个唯一的ID
只有它们共享了一个消息队列,进程才能够通信
通信链路的属性
只有进程共享一个共同的消息队列,才建立链路
链接可以与许多进程相关联
每对进程可以共享多个通信链路
链接可以是单向或双向
操作
创建一个新的消息队列
通过消息队列发送和接收消息
销毁消息队列
原语定义如下
send(A,message) - 发送信息到队列A
receive(A,MESSAGE) - 从队列A接收消息
消息传递可以是阻塞或非阻塞:
阻塞被认为是同步的。发送一个消息,如果没发送完成,要阻塞在那儿,只有发送完成后,才能正常返回干下面的事情。
非阻塞被认为是异步的。
通信链路缓冲。
队列的消息被附加到链路;可以是一下3种方式之一:
1. 0 容量
发送方必须等待接收方
2. 有限容量 - n messages的有限长度
如果队列满,发送方必须等待
3. 无限容量 - 无限长度
发送方不需要等待。只管发就行了
信号Signal:
软件中断通知事件
Examples:SIGFPE, SIGKILL, SIGUSR1, SIGSTOP, SIGCONT
接收到信号时会发生什么:
Catch:指定信号处理函数被调用
Ignore:依靠操作系统的默认操作
Example:Abort,memory dump,suspend or resume process
Mask:闭塞信号因此不会传送
可能是暂时的(当处理同样类型的信号)
不足:不能传输要交换的任何数据
实现:
便捷,快速
管道:
子进程从父进程继承文件描述符
一头输入,一头输出
ls,more有个共同的父进程shell
shell:
创建管道
为ls创建一个进程,设置stdout为管道写端
为more创建一个进程,设置stdin为管道读端
管道里的数据是字节流
消息队列:
消息队列按FIFO的来管理消息
Message:作为一个字节序列存储
Message Queues:消息数组
FIFO & FILO configuration
消息队列的数据不是字节流,是一块一块有意义的数据结构
当buffer满或空的时候,send,receive也会有sleep出现
共享内存:
进程
每个进程都有私有地址空间
在每个地址空间内,明确的设置了共享内存段
优点:快速、方便地共享数据
不足:必须同步数据访问
最快的方法
一个进程写另外一个进程立即可见
没有系统调用干预
没有数据复制
不提供同步,由程序员提供同步