进程间通信/IPC/Inter-Process Communication
1.直接通信
1.进程必须正确命名对方
- send(P, message) //进程ID
- receive(Q, message) //进程ID
2.通信链路的属性
- 自动建立链路
- 一条链路恰好对应一对通信进程
- 每对进程只有一个链接存在
- 链接可以是单向的,也可以是双向的
2.间接通信
定向从消息队列接受消息
- 每个消息队列都有一个唯一的ID
- 只有它们共享了一个消息队列,进程才能通信
通信链路的属性
- 只有进程共享同一个队列才能通信
- 链接可以与多个进程相连
- 每对进程可以共享多个通信链路
- 连接可以是单向的,也可以是双向的
操作:
- send(A, message) //发送消息到队列A
- receive(A, message) //从队列A接收消息
消息传递可以是阻塞和非阻塞的(同步和异步)。队列的消息被发送到链路,可为一下三种方式之一:
- 0容量/0 message——发送方必须等待接收方
- 有限容量/n message——若队列满,发送方必须等待
- 无限容量/unlimited message——发送方无需等待
3.信号
软件中断通知事件处理
程序接受到信号后
- catch:指定信号处理函数被调用
- ignore:忽略,不处理
- 缺省的处理:停止运行(自杀)
不足:不能传输要交换的任何数据
实现:修改应用程序的堆栈(栈,函数返回地址)
4.管道
内核中的buffer,字节流
- 子进程从父进程继承文件描述符
- 进程不知道从键盘、文件、程序读取 或 写入终端、文件、程序
例:%ls | more
shell:
- 创建管道
- 为
ls创建一个进程,设置 stdout 为管道写端 - 为
more创造一个进程,设置 stdin 为管道读端
5.消息队列
可传数据结构,间接
- Message:作为一个字节序列储存
- Message Queue:消息数组
- FIFO & FILO configuration
6.共享内存
直接通信
每个进程都有私有地址空间,每个空间内,都明确地设置了共享内存段
优点:快速、方便地共享数据
缺点:必须同步数据访问



Comments | NOTHING