进程间通信就是在不同进程之间传播或交换信息,那么不同进程之间存在着什么双方都可以访问的介质呢?进程的用户空间是互相独立的,一般而言是不能互相访问的,唯一的例外是共享内存区。但是,系统空间却是“公共场所”,所以内核显然可以提供这样的条件。除此以外,那就是双方都可以访问的外设了。在这个意义上,两个进程当然也可以通过磁盘上的普通文件交换信息,或者通过“注册表”或其它数据库中的某些表项和记录交换信息。广义上这也是进程间通信的手段,但是一般都不把这算作“进程间通信”。
IPC是进程间通信的简称,它是运行在某个操作系统上的不同进程间各种消息传递的方式。IPC的方式有如下几种:管道、FIFO(也成有名管道)、消息队列、套接字、远程过程调用(RPC)。其中管道只能在具有共同祖先(指父子进程关系)的进程间使用,但FIFO(有名管道)解决了该问题;消息队列可用在同一主机上有亲缘关系和无亲缘关系的进程间之间;远程过程调用是一个系统(客户主机)上某个程序调用另一个系统(服务器主机)上某个函数的一种方法,是作为显示网络编程的一种替换方法开发的,既然客户和服务器之间通常传递一些信息(被调用函数的参数与返回值),而RPC可用在同一主机上的客户和服务器之间,因此可认为RPC是另一种形式的消息传递。
图 进程间共享信息的三种方式
左边的两个进程共享存留于文件系统中某个文件上某些信息;中间的两个进程共享驻留于内核中的某些信息;右边的两个进程有一个双方都能访问的共享内存区。图中虽然只画了两个进程,但实现中可以是任意数目的进程。一个给定进程内的所有线程共享同样的全局变量(也就是说共享内存区的概念对线程来说是内在的)。然而我们必须关注的是各个线程间对全局数据的同步访问。因此,可以不把同步当作一种IPC形式,而是伴随许多IPC形式使用的,以控制对某些共享数据的访问。
由上面的三种共享信息的三种方式可以看出IPC的三种持续性,即一个IPC对象一直存在多长时间。
图 IPC对象的持续性
IPC类型 |
持续性 |
管道 FIFO |
随进程 随进程 |
Posix读写锁 Posix互斥锁 Posix条件变量 fcntl记录上锁 |
随进程 随进程 随进程 随进程 |
Posix消息队列 Posix有名信号量 Posix基于内存的信号量 Posix共享内存区 |
随内核 随内核 随进程 随内核 |
System V消息队列 System V信号量 System共享内存区 |
随内核 随内核 随内核 |
TCP套接字 UDP套接字 Unix域套接字 |
随进程 随进程 随进程 |
图 各种类型IPC对象的持续性
上图中没有任何类型的IPC具备随文件系统的持续性,Posix IPC的三种类型可能具有该持续性,但取决于实现。其实,向一个文件写入数据提供了随文件系统的持续性,但这不作为一种IPC形式使用。多数形式的IPC并没有在系统重新自举后继续存在的必要,因为进程在自举后就不会存在了。而且,对于一种给定形式的IPC,要求具备随文件系统的持续性可能会使其性能降级,而IPC的一个基本的设计目标时高性能。
参考:
Linux环境编制之IPC进程间通信(一):IPC概述,布布扣,bubuko.com
原文地址:http://blog.csdn.net/to_be_it_1/article/details/28104757