Linux环境编制之IPC进程间通信(一):IPC概述

进程间通信就是在不同进程之间传播或交换信息,那么不同进程之间存在着什么双方都可以访问的介质呢?进程的用户空间是互相独立的,一般而言是不能互相访问的,唯一的例外是共享内存区。但是,系统空间却是“公共场所”,所以内核显然可以提供这样的条件。除此以外,那就是双方都可以访问的外设了。在这个意义上,两个进程当然也可以通过磁盘上的普通文件交换信息,或者通过“注册表”或其它数据库中的某些表项和记录交换信息。广义上这也是进程间通信的手段,但是一般都不把这算作“进程间通信”。

 

IPC是进程间通信的简称,它是运行在某个操作系统上的不同进程间各种消息传递的方式。IPC的方式有如下几种:管道、FIFO(也成有名管道)、消息队列、套接字、远程过程调用(RPC)。其中管道只能在具有共同祖先(指父子进程关系)的进程间使用,但FIFO(有名管道)解决了该问题;消息队列可用在同一主机上有亲缘关系和无亲缘关系的进程间之间;远程过程调用是一个系统(客户主机)上某个程序调用另一个系统(服务器主机)上某个函数的一种方法,是作为显示网络编程的一种替换方法开发的,既然客户和服务器之间通常传递一些信息(被调用函数的参数与返回值),而RPC可用在同一主机上的客户和服务器之间,因此可认为RPC是另一种形式的消息传递。

Linux环境编制之IPC进程间通信(一):IPC概述_第1张图片

图 进程间共享信息的三种方式

左边的两个进程共享存留于文件系统中某个文件上某些信息;中间的两个进程共享驻留于内核中的某些信息;右边的两个进程有一个双方都能访问的共享内存区。图中虽然只画了两个进程,但实现中可以是任意数目的进程。一个给定进程内的所有线程共享同样的全局变量(也就是说共享内存区的概念对线程来说是内在的)。然而我们必须关注的是各个线程间对全局数据的同步访问。因此,可以不把同步当作一种IPC形式,而是伴随许多IPC形式使用的,以控制对某些共享数据的访问。

由上面的三种共享信息的三种方式可以看出IPC的三种持续性,即一个IPC对象一直存在多长时间

Linux环境编制之IPC进程间通信(一):IPC概述_第2张图片

图 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的一个基本的设计目标时高性能。

参考:

 

你可能感兴趣的:(ipc,进程间通信)