进程间通信

进程间通信的几种方式

1.进程间通信原理
进程通信,是指进程之间交换信息。从这个意义上讲,进程之间的同步、互斥也是一种信息交换,也是一种通信。但是,这里所说的“通信”是指进程之间交换较多的信息这样一种情况,特别是在由数据相关和有合作关系的进程之间,这种信息交换是十分必要和数量较大的。

进程间通信是协调解决多个进程之间的约束关系,实现进程共同进展的关键技术,是多道系统中控制进程并发执行必不可少的机制。

(1)进程的通信方式:
a.直接通信是指信息直接传递给接收方,如管道。在发送时,指定接收方的地址或标识,也可以指定多个接收方或广播式地址, send(Receiver, message)。在接收时,允许接收来自任意发送方的消息,并在读出消息的同时获取发送方的地址, receive(Sender,message)。

b.间接通信:借助于收发双方进程之外的共享数据结构作为通信中转,如消息队列。这种数据结构称为缓冲区或信箱。通常收方和发方的数目可以是任意的。

(2)进程间通信的类型:
a.管道通信:管道是一条在进程间以字节流方式传送的通信通道。它由OS核心的缓冲区(通常几十KB)来实现,是单向的;在实质上,是一个有OS维护的特殊共享文件,常用于命令行所指定的输入输出重定向和管道命令。在使用管道前要建立相应的管道,然后才可使用。

b.消息队列机制:在消息传递系统中,进程间的数据交换以消息为单位,用户直接利用系统提供的一组通信命令(原语)来实现通信。

c.共享存储器系统:基于共享数据结构的通信方式:只能传递状态和整数值(控制信息),包括进程互斥和同步所采用的信号量机制。速度快,但传送信息量小,编程复杂,属于低级通信;基于共享存储区的通信方式:能够传送任意数量的数据,属于高级通信。

(3)管道通信机制
a.匿名管道一般用于具有亲缘关系的两个进程间通信。其中,一个进程发出某种数据信息,另外一方接受数据信息,这些数据信息通过一个共享的存储空间进行传递。

b.命名管道以先进先出形式的文件存在于文件系统中。因此,只要可以访问该文件路径,就能够彼此通过命名管道相互通信。

(4)消息队列机制
消息队列通信机制,首先由美国Hansan提出。在这种通信机制中,发送进程利用send原语将消息直接发送给接收进程,接收进程则利用receive原语接收消息。其中,消息是一个格式化的可变长信息单位。消息机制允许一个进程向任何其他进程发送一个消息。具有写入权限的进程可以往消息队列中写入一个消息,具有读出权限的进程则可以从消息队列中读出一个消息。消息的发送不需要接收方准备好,随时可发送。

(5)共享内区机制
共享内存是一种简单而高效的进程间通信方法。共享内存就是两个进程共同拥有同一片内存,这部分内存中的任何内容,二者均可以访问。要使用共享内存进行通信,一个进程首先创建一片内存空间专门作为通信用,其他进程可以将该片内存映射到自己的虚拟地址空间。这样,读写自己地址空间中对应共享内存的区域时,就是在和其他进程进行通信。

2.实现进程间的匿名管道通信。
其中,一个进程(源)通过管道向另一个进程(目的地)发送一个信息,目的进程接收该信息。

3.使用消息队列来实现进程和进程之间的通信。
接收进程首先创建一个消息队列,随后发送进程可以打开消息队列,从而实现消息的发送和接收。实现时,发送进程在利用发送原语发送消息之前,先在自己的内存空间设置一发送区,把待发送的消息正文等信息填入其中,然后调用发送原语,把消息发送给接收进程。发送原语建立一缓冲区,把发送区中的消息复制到缓冲区,并将该缓冲区挂在接收进程的消息队列上。接收进程调用接收原语,从消息队列中摘下第一个消息,将其复制到消息接收区中。

4.使用共享存储区来实现两个进程之间的通信。
进程通信前,发送进程先向系统申请获得共享存储区中的一个分区(共享区),并指定该分区的关键字。然后,由申请者把获得的共享区连接到本进程上。此后,便可像读写普通存储器一样进行读、写该共享区。接收进程同样可像发送进程一样将共享区连接到自己的进程上,进行读、写操作。