一、进程通信是什么
进程通信是指 进程之间的信息交换。
协作进程需要一种进程间通信机制(Interprocess Communicatio,IPC)来允许进程相互交互数据与信息。
二、进程通信的类型
1. 共享存储器系统(Shared-Memory System)
在共享存储器系统中,相互通信的进程共享某些数据结构或存储区,然后通过这些空间进行通信。据此,可以将其分为两种类型:
(1)共享数据结构
这种通信方式要求诸进程公用某些数据结构来实现信息交换,非常经典的例子就是生产者—消费者问题中的公共有界缓冲区。
这种方式要求信息交换的格式、类型一定,比如每次只能放一个产品、取一个产品,而且操作系统仅提供共享存储器,进程的同步与互斥都需要程序员去实现,
这种方式仅适用于传递少量的数据,通信效率低下,属于低级通信。
(2)共享存储区
为了大量传输数据,在内存中划出了一块共享存储区,诸进程可以直接读或写该共享区的内容,来实现信息的交换。(可以想象成一个聊天区)
这种方式属于高级通信。
2. 消息传递系统(Message Passing System)
利用系统提供的通信原语,以消息或报文为单位进行信息交换,包括直接/间接通信。
消息的格式: 消息头 + 消息正文(消息头:发送和接收进程名、消息长度、类型等)
进程的同步方式:
在进程之间进行通信时,同样需要进程同步机制,以使诸进程间能协调通信。在完成消息的发送或接收后,有三种情况:
① 发送进程和接收进程均阻塞(用于紧密同步,发送与接收之间无大的时差)
② 发送进程和接收进程均不阻塞
③ 发送进程不阻塞、接收进程阻塞(应用最广,平时发送进程可以一直发送消息,接收进程直到有消息来时才被唤醒)
(1)直接通信方式
发送进程直接把消息发送给目标进程(利用OS提供的发送原语)
直接通信原语:
send ( receiver, message ); // 发送 message 给 receiver
receive ( sender, message ); // 接收 sender 发来的 message
(2)间接通信方式(信箱通信)
发送和接收进程,都通过共享中间实体(称为邮箱)的方式进程消息的发送和接收。
信箱的结构:
信箱头:关于信箱的描述信息,比如信箱标识符、信箱拥有者等
信箱体:由若干个可以存放消息的信箱格组成
信箱通信原语:
① 邮箱的创建和撤销
② 消息的发送和接收
send ( mailbox, message ); // 将一个消息发送到指定邮箱
receive ( mailbox, message ); // 从指定邮箱中接收一个消息
信箱分为三类:
• 私用信箱(Private Mailbox)
用户进程自己创建的邮箱,作为该进程的一部分,进程结束时也随之消失。只有该进程能从邮箱中读取消息,其他进程只能发送信息到该邮箱。
• 公用信箱(Public Mailbox)
由操作系统创建,提供给所有核准进程使用。这些进程既可以读,也可以写。通常在系统运行期间始终存在。
• 共享信箱(Shared Mailbox)
由某进程创建,同时必须指出共享进程的名字,都可取走发给自己的消息。
通信链路(communicaiton link)
• 显式建立 / 隐式建立(发送原语自动构建)
• 单向通信链路 / 双向通信链路
3. 管道通信(Pipe Communication)
(1)管道
是指用于连接一个读进程和一个写进程 以实现它们之间通信的一个共享文件,又名 pipe 文件。
管道是Unix系统的重要特色之一。
(2)共享过程
发送进程以字符流的形式将大量数据送入管道(也就是向文件中写入数据)
接收进程从管道中接收(读)数据
(3)管道的协调能力(特点)
① 互斥: 同一时刻,只能有一个进程对管道进行操作。
② 同步: 当写入一定数量的数据后,写进程需要睡眠等待,直到读进程取走数据后才能把它唤醒。(保证每一次的数据都能被接收)
③ 确定对方是否存在: 只有确定了对方存在时才能进行通信。
④ 单向: 写进程只能写,读进程只能读。