1 进程通信的类型
进程间通信主要分为低级通信和高级通信两类。
- 低级通信:只能传递状态和整数值(控制信息),包括进程互斥和同步所采用的信号量和管程机制。其优点为速度快。但也存在如下缺点:传送信息量小:效率低,每次通信传递的信息量固定,若传递较多信息则需要进行多次通信;编程复杂:用户直接实现通信的细节,编程复杂,容易出错。
- 高级通信:能够传送任意数量的数据,包括:共享存储区、管道、消息等。
(1)共享存储器系统(Shared-memory system):相互通信的进程共享某些数据结构或共享存储区。
一组进程向该公共区中写,另一组进程从公共区中读,又可进一步分为:基于共享数据结构的通信方式基于共享存储区的通信方式基于共享数据结构的通信方式,进程之间能够通过某种类型的数据结构(如有界缓冲区)交换信息,如生产者和消费者问题。操作系统只负责提供共享存储区,而共享数据结构和对进程间的同步处理都是程序员的事。因而,通信效率低,只适合于传递少量信息。基于共享存储区的通信方式,系统在存储中划出一块共享存储区,各进程间可通过对共享存储区中的数据进行读或写来实现通信。进程在通信之前应向系统申请共享存储区中的一个分区,并指定该分区的关键字,若系统已经给其他进程分配了这样的分区,则将该分区的描述符返回给申请者。接着,申请者把获得的共享存储区连接到本进程上,此后就像读写普通存储器一样。该方式主要用于UNIX System V中。
(2)消息系统(Message System)进程间的信息交换以消息或报文为单位,程序员利用系统提供的一组通信命令(原语)实现通信。操作系统隐藏了通信的实现细节,简化了编程的复杂性。分为两种:直接通信方式间接通信方式直接通信方式,发送进程发消息时要指定接收进程的名字,反过来,接收时要指明发送进程的名字。系统提供两条原语:Send (receiver,message)Receive (sender,message)间接通信方式,收发双方进程通过某种中间实体,作为通信进程间的媒介,即信箱(MailBox)。发送进程发消息时不指定接收进程的名字,而是指定一个中间媒介。通常收方和发方的数目可以是任意的。这种方式广泛应用于多机系统和计算机网络中。系统提供两条原语:发送原语:send(MB,Message)接收原语:receive(MB, Message)
(3)利用共享文件的通信方式是基于原有的文件系统形成的一种通信方式,即利用共享文件实现进程间通信。如UNIX中的管道(PIPE)。管道通信方式,必须要考虑管道机制中的同步与互斥,即管道机制必须提供三方面的协调努力:互斥:当一个进程正在对PIPE进行读写时,另一个必须等待(一次只有一个进程可以访问)同步:当写进程把一定量的数据(如4KB)写入PIPE后(创建后,大小是固定字节的),便睡眠等待,直到读进程取走数据后再唤醒它;当读进程读一个空PIPE时,也应睡眠等待,直到写进程将消息写入管道为止,才将它唤醒。对方是否存在。只有已确定对方存在时,方能进行通信