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)。名字空间非常重要,因为对于除管道以外的所有形式来说,名字是客户与服务器彼此连接以交换信息的手段。

进程间的通信方式:简介相关推荐

  1. step4 . day7 进程间的通信方式

    进程间的通信方式: 无名管道(pipe) 有名管道 (fifo) 信号(signal) system v5的进程间通信方式 共享内存(share memory) 消息队列(message queue) ...

  2. msgget();msgsnd();msgrcv();msgctl(); 消息队列 Linux进程间的通信方式之消息队列

    Linux进程间的通信方式 ----消息队列. 消息队列和共享内存类似 消息队列它允许一个或多个进程向它写消息,一个或多个进程向它写读消息. 消息队列存在于系统内核中,消息的数量受系统限制. 我们来看 ...

  3. unix进程间的通信方式

    unix进程间的通信方式 (1)管道(Pipe):管道可用于具有亲缘关系进程间的通信,允许一个进程和另一个与它有共同祖先的进程之间进行通信. (2)命名管道(named pipe):命名管道克服了管道 ...

  4. 1、几种进程间的通信方式

    1.几种进程间的通信方式 # 管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用.进程的亲缘关系通常是指父子进程关系. # 有名管道 (named ...

  5. 共享内存(进程间的通信方式)

    目录 1.共享内存的特点 2.函数接口 3.有关共享内存的系统命令 1.共享内存的特点 (1)共享内存是一种最高效的进程间的通信方式,进程可以直接读写内存,而进程之间不需要通过任何数据的拷贝. (2) ...

  6. 进程间基于消息队列的通信_Linux 进程间的通信方式

    (一)进程的概念 进程是操作系统的概念,每当我们执行一个程序时,对于操作系统来讲就是创建一个进程,在这个 过程中伴随着资源的分配和释放,可以认为进程是一个程序的一次执行过程. (二)进程间通信的概念 ...

  7. 进程间的通信方式(二):管道Pipe和命令管道FIFO

    1.概述 管道是最初的Unix IPC通信,可追溯到1973年的Unix第三版.尽管对于许多操作来说很有用,但它们的根本局限于没有名字,只能由亲缘关系的进程使用.这一点随着FIFO的加入System  ...

  8. 几种进程间的通信方式

    # 管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用.进程的亲缘关系通常是指父子进程关系. # 有名管道 (named pipe) : 有名管道也 ...

  9. Linux 进程 | 进程间的通信方式

    文章目录 管道 匿名管道 pipe 命名管道 FIFO 共享内存 共享内存的使用流程: 消息队列 信号量 套接字 在之前的博客中讲过,虚拟空间出现的其中一个目的就是解决 进程没有独立性,可能访问同一块 ...

最新文章

  1. 怎样用java编写日志_用JAVA写一个日志类程序以供大家学习
  2. python3.8.5是python3吗_科学网-Ubuntu16.04安装Python3.8.5问题及解决方法-陈超的博文
  3. C#操作Excel的OLEDB方式与COM方式比较
  4. Codeforces Round #715 (Div. 2)
  5. C/S、B/S的区别
  6. 【转】!C#中的Stream相关
  7. 技嘉注入usb 3.0工具_技嘉怎么安装win10系统 技嘉安装win10系统步骤【图文介绍】...
  8. Python——为什么要在意:模块重载
  9. java简易扑克牌_简易扑克牌游戏(java)
  10. php apd,PHP debug 工具 之 APD
  11. spring4.1.3模块的官方说明
  12. c#制作飘动动画窗体
  13. C++基础:第八章 深入IO
  14. OSPF NSSA forwarding address   深度解析
  15. 三维重建-立体校正(Recitification)
  16. 南京超过广州,4 月程序员工资统计出炉,平均14596元
  17. 如何使用PS修改图片中的数字
  18. Linux笔记:文件共享服务Samba基础使用
  19. python数据分析怎么画_跟小白学Python数据分析——绘制维恩图
  20. Excel基础操作(数据分析)归纳笔记

热门文章

  1. 0. VS2015快捷键
  2. 在java web项目中编写自己的代码生成器
  3. 执行目标文件引发的问题:syntax error: word unexpected (expe...
  4. Hadoop fs命令详解
  5. 如何在XSLT里调用C#的代码
  6. String类中的equals方法与Object类中的equals方法的不同点
  7. 偏心率e用于描述某一轨道与圆轨道的区别
  8. MIT、CMU 美国计算机专业最牛20名学校大点评
  9. java子类有参构造函数吗_为什么我需要在这个Java通用子类中有一个构造函数?...
  10. word2html文档,Word2HTML用户手册.doc