Appearance
2.23 进程间通信
P、V操作可否用于进程通信?
- PV操作用于进程的同步与互斥,是低级进程通信
P、V操作对于哪些进程通信不适用?
- 网络进程通信
- 数据交换量较大的单机进程通信
如何解决?
- 共享寄存器
- 消息传递
- 管道
一、共享寄存器
共享存储器系统
基于共享数据结构的通信方式
公用某一个数据结构实现信息交换
- 缺点?(难,低效,数据量较少)
基于共享存储区的通信方式(邮箱)
- 划分一块存储空间作为公用
二、消息传递
直接消息传递
两个或多个进程利用系统调用相互发送消息
Send(Destination, &message)
Receive(Source, &message)
- 安全问题
- 消息丢失、对象假冒、消息篡改……
- 安全问题
各有什么优缺点
- 阻塞Send,阻塞Receiver
- 无阻塞Send,阻塞Receiver
- 无阻塞Send,无阻塞Receiver
间接消息传递
不直接发给消息的接收者,而是发到某个共享空间。
消息的接收者和发送者之间的关系是不定的
- 一对一
- 多对多
- 一对多
- 多对一
共享空间的所有权问题
三、管道
管道通信
- 连接两个进程:读进程,写进程
- 写进程以字符流形式输入管道
- 读进程以字符流形式接收输入
注意事项
- 互斥
- 同步
- 互相确定对方存在则开始通信
Unix中的管道
Unix系统中管道的限制
以半双工方式工作
使用管道的进程具有共同的祖先
由Pipe函数创建管道
#include <unistd.h>
int pipe(int fd[2])
fd[2]
为两个文件描述符,0为读,1是写,fd[1]
的输出是fd[0]
的输入如果成功返回0,否则返回-1