50-进程间通信总览

原创 2017年01月03日 17:48:15

在上一篇里,使用了读写文件的方式来实现进程间通信,使用了信号量完成了进程间的同步,虽然这种实现方式也能够完成任务,但是缺点就在于它需要读写磁盘。所以 linux 系统提供了多种多样的进程间通信的手段,帮助我们实现进程间通信。

不过,在讲解 Linux 进程间通信(后面简称 Linux IPC)之前,需要了解 Linux IPC的分类。

1. Linux IPC 分类

说分类不太准确,不过还是先按照此方式大概讲一下,方便初学者初步理解。linux ipc 大致可以分为下面四类:

  • 最初的 Unix IPC:主要包括无名管道,有名管道,信号(上一个专题讲过)。
  • System V IPC:主要包括 System V 共享内存、System V 消息队列、System V 信号量。
  • 基于 socket IPC:主要使用套接字的方式进行通信。
  • POSIX IPC:POSIX 共享内存、POSIX 消息队列、POSIX 信号量。

初学者可能有点懵圈,怎么有这么多,共享内存还分成 System V 和 POSIX 的?准确的说,Linux 是继承了先辈们的基因,它把 System V IPC 、POSIX 等等 IPC 的方式都实现了。这意味着,在实际编程的时候,你可以根据你自己的口味,选择一款你喜欢的方式。比如,System V 的共享内存和消息队列用起来比较方便,我就喜欢用它,而 System V 信号量用起来麻烦,我可以选择使用 POSIX 信号量,它的接口更加简单。

下面这张图说明了 Linux IPC 的历史(这才是准确的说法,说分类本身不恰当,但是学习的时候可以这样用):


这里写图片描述

linux下的进程通信手段基本上是从Unix平台上的进程通信手段继承而来的。而对Unix发展做出重大贡献的两大主力 AT&T 的贝尔实验室及 BSD(加州大学伯克利分校的伯克利软件发布中心)在进程间通信方面的侧重点有所不同。前者对Unix早期的进程间通信手段进行了系统的改进和扩充,形成了“System V IPC”,通信进程局限在单个计算机内;后者则跳过了该限制,形成了基于套接口(socket)的进程间通信机制。Linux则把两者继承了下来。

2. Linux IPC 常用手段

最后总结一下,Linux 实现 IPC 主要有以下几种方式:

  • 无名管道(pipe)及有名管道(named pipe):无名管道只能用于有亲缘关系的进程,有名管道用于任意两进程间通信。
  • 信号(signal):上一个专题讲的很详细了。
  • 消息(message)队列:包括Posix消息队列system V消息队列。消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。
  • 共享内存(share memory):使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。
  • 信号量(semaphore):主要作为进程间以及同一进程不同线程之间的同步手段。
  • 套接口(Socket):更为一般的进程间通信机制,可用于不同机器之间的进程间通信。起初是由Unix系统的BSD分支开发出来的,但现在一般可以移植到其它类Unix系统上:Linux和System V的变种都支持套接字。

3. 总结

  • 知道 Linux IPC 历史(或者说分类)
  • 知道 Linux IPC 常用手段

参考资料:
[1] 深刻理解Linux进程间通信(IPC)

版权声明:本文为博主原创文章,未经博主允许不得转载。

基础排序算法总览--JAVA

基础排序算法如下: 1 插入类排序,如直接插入,折半插入,希尔排序等。 2 交换类排序,如冒泡排序,快速排序等。 3 选择类排序,如选择排序,堆排序等。 4 归并类排序,如归并排...
  • manu_zhang
  • manu_zhang
  • 2017年04月08日 01:01
  • 312

stl源码剖析 详细学习笔记 算法总览

//****************************基本算法*****************************     /*                 stl算法总览,...
  • boydfd
  • boydfd
  • 2015年03月28日 22:12
  • 764

排序算法——总览

http://zh.wikipedia.org/zh-cn/%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95http://baike.baidu.com/view/297739...
  • liyongjin2009
  • liyongjin2009
  • 2011年03月01日 11:34
  • 203

数据结构总览

数据结构分为 :1.线性结构 2.非线性结构 线性结构分为 :广义表,栈(后进先出),队列(先进先出),串(注意 串的模式匹配); 非线性结构分为:图,树; 图分为: 强连通图 ,连通图; 树...
  • err118
  • err118
  • 2015年10月26日 08:56
  • 228

常见的开发语言(或IT技术)一览

Java、 Android、 iOS、 Web前端、 Python、 .NET、 PHP、 C/C++、 Linux 数据库技术...
  • Jacee0048
  • Jacee0048
  • 2015年07月03日 12:11
  • 885

脚本语言总览

脚本语言总览 -- Zoom.Quiet ::03061820年后,我们用什么样的语言?也许现在谁都不好回答,20年前的程序员们会告诉你用汇编吧,今天人们也许会告诉你用c语言(c++?)吧。那么20年...
  • shipfi
  • shipfi
  • 2004年12月06日 13:31
  • 955

微信小程序一览

微信小程序开始公测了,感觉后面放出来的话会很火。因此也跟风看了看微信小程序是怎么开发的。首先进行微信小程序开发工具的安装,其实这个挺简单的,就是傻瓜式安装。进入官网:https://mp.weixin...
  • wang_Number_1
  • wang_Number_1
  • 2016年11月04日 15:53
  • 616

Html5-快捷键总览(window)

Html5 快捷键总览(window) 基本的快捷键 编辑菜单 Alt + E 文件菜单 Alt + F 视图菜单 ...
  • qq_34543438
  • qq_34543438
  • 2017年05月28日 12:27
  • 247

多线程总览

线程安全的实现方式 线程安全的实现方式 1 一、 什么叫线程安全 1 二、 实现线程安全的方法 2 2.1互斥同步(阻塞,悲观) 2 2.2非阻塞同步(乐观) 2 2.3无同步方案 3 ...
  • ctf_htj
  • ctf_htj
  • 2013年10月31日 16:09
  • 533

分布式系统阅读笔记(四)-----进程间通信

介绍) 进程间通信的方式里包含了非常多的内容,比如用于实现进程间通信需要用到许多协议提供的API,在进程间的远程方法的调用上需要的约定一定的数据格式,这就衍生出了数据集中编组的一种方式。还有多播网络...
  • Androidlushangderen
  • Androidlushangderen
  • 2014年12月22日 21:14
  • 2254
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:50-进程间通信总览
举报原因:
原因补充:

(最多只允许输入30个字)