目录

目录

进程通信的目的

Linux 进程间通信(IPC)的发展

linux使用的进程间通信方式

管道( pipe )

信号量( semophore )

消息队列( message queue )

信号 ( singal )

共享内存( shared memory )

套接字( socket )

进程间通信各种方式效率比較


进程通信的目的

1、传输数据

一个进程须要将它的数据发送给还有一个进程。发送的数据量在一个字节到几M字节之间

2、共享数据

多个进程想要操作共享数据,一个进程对共享数据

3、通知事

一个进程须要向还有一个或一组进程发送消息。通知它(它们)发生了某种事件(如进程终止时要通知父进程)。

4、资源共享

多个进程之间共享相同的资源。为了作到这一点,须要内核提供锁和同步机制。

5、进程控制

有些进程希望全然控制还有一个进程的执行(如Debug进程),此时控制进程希望能够拦截还有一个进程的全部陷入和异常,并能够及时知道它的状态改变。

Linux 进程间通信(IPC)的发展

linux下的进程通信手段基本上是从Unix平台上的进程通信手段继承而来的。而对Unix发展做出重大贡献的两大主力AT&T的贝尔实验室及BSD(加州大学伯克利分校的伯克利软件公布中心)在进程间通信方面的側重点有所不同。

前者对Unix早期的进程间通信手段进行了系统的改进和扩充,形成了“system V IPC”。通信进程局限在单个计算机内;

后者则跳过了该限制,形成了基于套接口(socket)的进程间通信机制。

Linux则把两者继承了下来

  • 早期UNIX进程间通信
  • 基于System V进程间通信
  • 基于Socket进程间通信
  • POSIX进程间通信。

UNIX进程间通信方式包含:管道、FIFO、信号。

System V进程间通信方式包含:System V消息队列、System V信号灯、System V共享内存

POSIX进程间通信包含:posix消息队列、posix信号灯、posix共享内存。

因为Unix版本号的多样性,电子电气project协会(IEEE)开发了一个独立的Unix标准,这个新的ANSI Unix标准被称为计算机环境的可移植性操作系统界面(PSOIX)。

现有大部分Unix和流行版本号都是遵循POSIX标准的。而Linux从一開始就遵循POSIX标准;

BSD并非没有涉足单机内的进程间通信(socket本身就能够用于单机内的进程间通信)。

其实,非常多Unix版本号的单机IPC留有BSD的痕迹。如4.4BSD支持的匿名内存映射、4.3+BSD对可靠信号语义的实现等等。

linux使用的进程间通信方式

  1. 管道(pipe),流管道(s_pipe)和命名管道(FIFO)
  2. 信号(signal)
  3. 消息队列(message queue)
  4. 共享内存(shared memory)
  5. 信号量(semaphore)
  6. 套接字(socket)

管道( pipe )

管道这样的通讯方式有两种限制,一是半双工的通信,数据仅仅能单向流动,二是仅仅能在具有亲缘关系的进程间使用。进程的亲缘关系一般是指父子进程关系。

流管道s_pipe: 去除了第一种限制,能够双向传输.

管道可用于具有亲缘关系进程间的通信。命名管道:name_pipe克服了管道没有名字的限制,因此,除具有管道所具有的功能外。它还同意无亲缘关系进程间的通信;

信号量( semophore )

信号量是一个计数器,能够用来控制多个进程对共享资源的訪问。

它常作为一种锁机制。防止某进程正在訪问共享资源时。其它进程也訪问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。

信号是比較复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还能够发送信号给进程本身。linux除了支持Unix早期信号语义函数sigal外,还支持语义符合Posix.1标准的信号函数sigaction(实际上,该函数是基于BSD的,BSD为了实现可靠信号机制。又能够统一对外接口,用sigaction函数又一次实现了signal函数);

消息队列( message queue )

消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。

消息队列克服了信号传递信息少、管道仅仅能承载无格式字节流以及缓冲区大小受限等缺点。

消息队列是消息的链接表。包含Posix消息队列system V消息队列。有足够权限的进程能够向队列中加入消息,被赋予读权限的进程则能够读走队列中的消息。

消息队列克服了信号承载信息量少,管道仅仅能承载无格式字节流以及缓冲区大小受限等缺点。

信号 ( singal )

信号是一种比較复杂的通信方式,用于通知接收进程某个事件已经发生。

主要作为进程间以及同一进程不同线程之间的同步手段。

共享内存( shared memory )

共享内存就是映射一段能被其它进程所訪问的内存。这段共享内存由一个进程创建。但多个进程都能够訪问。共享内存是最快的 IPC 方式,它是针对其它进程间通信方式执行效率低而专门设计的。

它往往与其它通信机制。如信号量,配合使用。来实现进程间的同步和通信。

使得多个进程能够訪问同一块内存空间。是最快的可用IPC形式。

是针对其它通信机制执行效率较低而设计的。往往与其它通信机制,如信号量结合使用。来达到进程间的同步及相互排斥。

套接字( socket )

套解口也是一种进程间通信机制,与其它通信机制不同的是。它可用于不同机器间的进程通信

更为一般的进程间通信机制。可用于不同机器之间的进程间通信。

起初是由Unix系统的BSD分支开发出来的,但如今一般能够移植到其它类Unix系统上:Linux和System V的变种都支持套接字。

进程间通信各种方式效率比較


类型 无连接 可靠 流控制 记录消息类型 优先级
普通PIPE N Y Y   N
流PIPE N Y Y   N
命名PIPE(FIFO) N Y Y   N
消息队列 N Y Y   Y
信号量 N Y Y   Y
共享存储 N Y Y   Y
UNIX流SOCKET N Y Y   N
UNIX数据包SOCKET Y Y N   N

注:无连接: 指无需调用某种形式的OPEN,就有发送消息的能力流控制:

假设系统资源短缺或者不能接收很多其它消息,则发送进程能进行流量控制

各种通信方式的比較和优缺点

  1. 管道:速度慢。容量有限,仅仅有父子进程能通讯
  2. FIFO:不论什么进程间都能通讯,但速度慢
  3. 消息队列:容量受到系统限制,且要注意第一次读的时候,要考虑上一次没有读完数据的问题
  4. 信号量:不能传递复杂消息,仅仅能用来同步
  5. 共享内存区:能够非常easy控制容量,速度快,但要保持同步,比方一个进程在写的时候。还有一个进程要注意读写的问题,相当于线程中的线程安全。当然。共享内存区相同能够用作线程间通讯,只是没这个必要,线程间本来就已经共享了同一进程内的一块内存

假设用户传递的信息较少或是须要通过信号来触发某些行为。前文提到的软中断信号机制不失为一种简捷有效的进程间通信方式。

但若是进程间要求传递的信息量比較大或者进程间存在交换数据的要求,那就须要考虑别的通信方式了。

无名管道简单方便。但局限于单向通信的工作方式.而且仅仅能在创建它的进程及其子孙进程之间实现管道的共享。

有名管道尽管能够提供给随意关系的进程使用。可是因为其长期存在于系统之中。使用不当容易出错。所以普通用户一般不建议使用。

消息缓冲能够不再局限于父子进程。而同意随意进程通过共享消息队列来实现进程间通信,并由系统调用函数来实现消息发送和接收之间的同步,从而使得用户在使用消息缓冲进行通信时不再须要考虑同步问题,使用方便。可是信息的复制须要额外消耗CPU的时间,不适宜于信息量大或操作频繁的场合。

共享内存针对消息缓冲的缺点改而利用内存缓冲区直接交换信息,无须复制。快捷、信息量大是其长处。

可是共享内存的通信方式是通过将共享的内存缓冲区直接附加到进程的虚拟地址空间中来实现的,因此。这些进程之间的读写操作的同步问题操作系统无法实现。必须由各进程利用其它同步工具解决。另外,因为内存实体存在于计算机系统中。所以仅仅能由处于同一个计算机系统中的诸进程共享。不方便网络通信。

共享内存块提供了在随意数量的进程之间进行高效双向通信的机制。

每一个使用者都能够读取写入数据。可是全部程序之间必须达成并遵守一定的协议,以防止诸如在读取信息之前覆写内存空间等竞争状态的出现。

不幸的是,Linux无法严格保证提供对共享内存块的独占訪问,甚至是在您通过使用IPC_PRIVATE创建新的共享内存块的时候也不能保证訪问的独占性。 同一时候,多个使用共享内存块的进程之间必须协调使用同一个键值。

[【转载】 linux进程间通信方式相关推荐

  1. dat关闭某进程_超详细解析!工程师必会的Linux进程间通信方式和原理

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

  2. linux 进程间通信方式

    1. 用户态和内核态进程通信 1)系统调用,最常用, 比如针对IO,有linux同步io接口(libaio最终也是调用linux同步io系统接口),linux aio ,linux io_uring ...

  3. linux进程间通信方式及比较

    进程间的通信方式: 1.管道(pipe)及有名管道(named pipe): 管道可用于具有亲缘关系进程间的通信,有名管道除了具有管道所具有的功能外,它还允许无亲缘关系进程间的通信. 2.信号(sig ...

  4. <Linux进程间通信方式-详细总结>

    文章目录 1.进程间通信(IPC) 2.进程间通信方式一:管道 2.进程间通信方式二:共享内存 3.进程间通信方式三:消息队列 4.进程间通信方式四:信号量 1.进程间通信(IPC) 1.进程间通信方 ...

  5. Linux进程间通信方式

    1. 管道:简单 实现原理: 操作系统的内核借助环形队列机制,使用内核缓冲区实现.特质: 1. 伪文件2. 管道中的数据只能一次读取.3. 数据在管道中,只能单向流动.局限性:1. 自己写,不能自己读 ...

  6. Linux进程间通信方式--本地socket

    先上一个代码 服务端: [cpp] view plaincopy //s_unix.c #include <stdio.h> #include <sys/types.h> #i ...

  7. Linux进程间通信(五)——进程间通信

    一.进程间通信简介 Linux的进程通信方式基本上是从Unix平台上的进程通信方式继承而来的.在Unix发展过程中,贝尔实验室和BSD(加州大学伯克利分校的伯克利软件发布中心)是Unix发展的主要贡献 ...

  8. Linux应用开发【第四章】Linux进程间通信应用开发

    文章目录 4 Linux进程间通信应用开发 4.1 初识进程 4.1.1 进程的概念 4.1.1.1 程序 4.1.1.2 进程 4.1.1.3 进程和程序的联系 4.1.1.4 进程和程序的区别 4 ...

  9. linux进程通信的异同,进程间通信方式的比较

    进程间通信就是在不同进程之间传播或交换信息,那么不同进程之间存在着什么双方都可以访问的介质呢?进程的用户空间是互相独立的,一般而言是不能互相访问的,唯一的例外是共享内存区.但是,系统空间却是" ...

最新文章

  1. 谷歌大脑发布神经网络的「核磁共振」,并公开相关代码
  2. 设计模式--观察者(Observer)模式
  3. 单例模式volatile
  4. 记一次失败的Windows环境编译Nginx源码
  5. leetcode--207. 课程表
  6. [css] CSS3中的transition是否可以过渡opacity和display?
  7. 别让for循环毁了你的程序(二)
  8. LeetCode - 7. Reverse Integer
  9. [转] 解决windows下eclipse中android项目关联android library project失败问题
  10. atm取款流程测试_盘点2020年软件测试新手必看的技术面试指南(下)
  11. python深度学习图像处理CSV文件分类标签图片到各个文件夹
  12. Java实现生成32位UUID工具类
  13. 想以游戏纸娃娃系统专利主张暴雪的暗黑3侵权? 先过暗黑2这关!
  14. [技术随笔(二)] win10 回滚 win7 注意事项
  15. Informatic学习总结_day03
  16. python识别文字并且提示_Python识别文字,实现看图说话|CSDN博文精选
  17. LM3886TF功放制作进展
  18. cupsd进程_CUPS 简介
  19. Multigen VEGA簡介
  20. Windows 10 系统精简方案参考

热门文章

  1. 将serversocket 写在按钮事件中连接不上_看 Netty 在 Dubbo 中如何应用
  2. 项目收获与体会_格创丨项目开发部、ACM训练队、信息运营部
  3. 装cv2加速_手动安装OpenCV下的IPP加速库
  4. 判断字段是否与枚举相同_Scala基础学习九之枚举和Trait了解
  5. js修改id的值_如何修改pytesthtml源码来优化接口自动化测试报告
  6. CMake使用介绍(1)
  7. OpenVINO InferenceEngine 之Grap file
  8. Python中copy,deepcopy,浅拷贝(“=”)和深拷贝(“copy.deepcopy()”)
  9. cycleGAN的整体架构+损失函数理解
  10. win10如何远程连接BCC云服务器?