进程间的通信方式:简介

1.概述

        IPC就是进程间通信(interprocess communication)的简称。传统上该术语描述的是运行在某个操作系统之上的不同进程间的消息传递(message passing)的方式。
        在Unix操作系统过去30年的演变史中,消息传递经历了如下几个发展阶段。
  • 管道:是第一个广泛使用的IPC形式,既可以在程序中使用,也可以在shell中使用。管道存在的问题在于他们只能在具有共同祖先(指父子进程之间)的进程间使用,不过该问题已经被有名管道(named pipe)即FIFO消息队列解决了。
  • System V消息队列(System V message queue):是在20世纪80年代早期加到System V内核中的。他们可以在同一台主机上有亲缘关系或者无亲缘关系的进程之间使用。尽管称呼他们时仍以冠以“System V”前缀,当今多数版本的Unix不论自己是否源自System V都支持他们
  • Posix消息队列是有Posix实时标准加入的。它们可以用在同一台主机上有亲缘关系和无亲缘关系的进程之前使用。
  • 远程过程调用(Remote Procedure Call)出现在20世纪80年代中期,它是从一个系统(客户主机)是某个程序调用另一个系统(服务器主机)上某个函数的一种方法,是作为显示网络编程的一种替换方法开发的。既然客户端与服务器之间通常传递一些信息(被调用函数的参数和返回值),而且RPC可以用在同一主机上的客户和服务器之间,因此可以认为RPC是另一种形式的消息传递

2.进程、线程与信息共享

    按照传统的Unix编程模型,我们在一个系统上运行多个进程,每个进程都有各自的地址空间。Unix进程间的信息共享可以有多种方式。如下图总结所示:

        (1)左边的两个进程共享存留与文件系统中某个文件的信息。为访问这些信息,每个进程都得穿过内核(例如read、write、lseek)。当一个文件有待更新的时候,某种形式的同步是有必须要的,这样可以防止多个进程或者线程并发的写入,防止相互串扰,也可以保护一个或者读个读出者。如果Posix、消息队列、信号量和共享内存区域是使用映射文件实现的(不是必须条件),那么他们就是这种共享存留与文件系统的某个信息。
        (2)中间两个进程共享驻留于内核中的某些信息。 管道是这种共享类型的例子,SystemV 消息队列和System V信号量也是。现在访问共享信息的每次操作涉及对内核的一次系统调用。
        (3)右边的两个进程有一个双方都能访问的 共享内存区域。每个进程一旦设置好该共享内存区域,就能够根本不干涉及内核而访问其中的数据。共享内存区域的进程需要某种形式进行同步。

线程:
    从IPC角度来看,一个给定的进程内所有的线程共享相同的全局变量(也就是说共享内存的概念对这种模型来说是内在的)。然而我们必须关注的是各个线程间对全局数据的同步访问。同步访问尽管不是一种明确的IPC的形式,但它确实伴随许多形式的IPC使用,以控制对某些共享数据的访问。

3.IPC对象的持续性

        我们可以把任意类型的IPC持续性(persistence)定义成该类型的一个对象一直存在多长时间。下图展示了三种类型的持续性:

    (1) 随进程持续的(process-persistent)IPC对象一直存在到打开着该对象的最后一个进程关闭该对象为止。例如管道和FIFO就是这种对象。
    (2) 随内核持续的(kernel-persistent)IPC对象一直存在到内核重新自举或显示删除该对象为止。例如System V的消息队列、信号量和共享内存去就是此类型对象。Posix消息队列、信号量和共享内存去必须至少是随内核持续的,但是也可以随文件系统持续的,具体取决于实现。
    (3) 随文件系统持续的(filesystem-persistent)IPC独显一直存在到显示删除该对象为止。即使内核重新自举了,该对象还是保持其值。Posix消息队列、信号量和共享内存区域如果是使用映射文件实现的(不是必需条件),那么它们就是随文件系统持续的。
        在定义一个IPC对象 的持续性时我们必须要小心,因为他们并不是像看起来的那样。例如管道内的数据是在内核中维护的,但管道具备的随进程的持续性而不是随内核的持续性;最后一个将某个管道打开着用于读的进程关闭管道后,内核将所有的数据并删除该管道。类似的,尽管FIFO在文件系统中有名字,他们也只是具备随进程的特性,因为最后一个将某个FIOF打开的进程关闭FIOF,FIOF中的数据都将丢失。

4.名字空间

        当某个或者多个无亲缘关系的进程使用某种类型的IPC对象来彼此交换信息时,该IPC对象必须有一个某种形式的名字(name)或标识符(identifier),这样其中一个进程(往往是服务器)可以创建IPC对象,其余进程则可以指定同一个IPC对象。
        管道没有名字(因此不能用于无亲缘关系的进程间),但是FIFO有一个在文件系统中的Unix路径名字作为其标识符(因此可用于无亲缘关系的进程间)。对于一个给定的iPC类型,其可能的名字的集合称为它的名字空间(name space)。名字空间非常重要,因为对于除管道以外的所有形式来说,名字是客户与服务器彼此连接以交换信息的手段。

猜你喜欢

转载自blog.csdn.net/qq_21125183/article/details/80629192