进程间通信简介

  • 通信:关注进程之间的数据交换。

    • 数据传输工具:为了进行通信,一个进程将数据写入到 IPC 工具中,另一个进程从中读取数据。这些工具要求在用户内存和内核内存之间进行两次数据传输:一次传输是在写入的时候用户内存到内核内存,另一次传输是在读取的时候从内核内存到用户内存。

      • 尽管一个数据传输工具可能会有多个读取者,但读取操作是具有破坏性的,读取操作会消耗数据,其他人进程将无法获取所消耗的数据,内核自动处理读者和写者之间的流控以及同步。
    • 共享内存:共享内存允许进程通过将数据放到由进程间共享的一块内存中以完成信息的交换(内核通过将每个进程中的页表项指向同一个RAM分页来实现这一功能),一个进程可以通过将数据放到共享内存块中使得其他进程读取这些数据。由于通信无需系统调用以及用户内存和内核内存之间的数据传输,因此共享内存的速度非常快。
      • 尽管共享内存的通信速度更快,但速度上的优势是用来弥补需要对在共享内存上发生的操作进行同步的不足的。在共享内存中,信号量通常用来作为同步方法。
      • 放入共享内存中的数据对所有共享这块内存的进程可见。
  • 同步:关注进程和线程操作之间的同步。
    • 文件锁:文件锁是设计用来协调操作同一文件的多个进程的动作的一种同步方法。它也可以用来协调对其他共享资源的访问。文件锁分为两类:读锁和写锁,可以对文件/文件上某一区域进行上锁操作。
  • 信号:尽管信号的主要作用并不在此,但在特定场景下仍然可以将它作为一种同步技术。更罕见的是信号还可以作为一种通信技术:信号编号本身是一种形式的信息,并且可以在实时信号上绑定数据(一个整数或指针)。

在执行进程间同步时通常需要根据功能需求来选择工具,当协调对文件的访问时文件记录加锁通常是最佳的选择,而对于协调对其他共享资源的访问来讲,信号量通常是更佳的选择。一般来讲,所有数据传输工具都可以用来同步,只是同步操作是通过在工具中交换消息来完成的。

自内核 2.6.22 起,Linux 通过 eventfd() 系统调用额外提供了一种非标准的同步机制,这个系统调用创建了一个 eventfd 对象,该对象拥有一个相关的由内核维护的 8 字节无符号整数,它返回一个指向该对象的文件描述符。可以使用 poll()、select() 以及 epoll() 来测试对象值是否为零,如果是非零的话就表述文件描述符可读取,否则 read 操作阻塞。

两个进程和一个文件的同一区域的共享映射:

UNIX IPC 工具分类:

IPC 工具比较

  1. IPC 对象标识和打开对象的句柄:
工具类型 用于识别对象的名称 用于在程序中引用对象的句柄
管道 文件描述符
FIFO 路径名 文件描述符
UNIX domain socket 路径名 文件描述符
Internet domain socket IP地址+端口号 文件描述符
System V 消息队列 System V IPC 键 System V IPC 标识符
System V 信号量 System V IPC 键 System V IPC 标识符
System V 共享内存 System V IPC 键 System V IPC 标识符
POSIX 消息队列 POSIX IPC 路径名 mqd_t(消息队列描述符)
POSIX 命名信号量 POSIX IPC 路径名 sem_t*(信号量指针)
POSIX 无名信号量 sem_t*(信号量指针)
POSIX 共享内存 POSIX IPC 路径名 文件描述符
匿名映射
内存映射文件 路径名 文件描述符
flock() 文件锁 路径名 文件描述符
fcntl() 文件锁 路径名 文件描述符
  1. 功能:

在确定使用何种工具时需要考虑不同 IPC 工具的功能差异,下面对数据传输工具和共享内存之间的差异进行总结。

  • 数据传输工具提供了读取和写入操作,传输的数据只供一个读者进程消耗。内核会自动处理读者和写者之间的流控以及同步(这样当读者试图从当前为空的工具中读取数据时将被阻塞)。
  • 一个进程通过共享内存能够使数据对共享同一内存区域的所有进程可见。通过操作是比较简单的——进程可以像访问自己的虚拟地址空间中的内存那样访问共享内存中的数据。另一方面,同步处理(可能还会有流控)会增加共享内存设计的复杂性。在需要维护共享状态(如共享数据结构)的应用程序中,这个模型表现得好。
  • 一些数据传输工具以字节流的形式传输数据(管道、FIFO以及流socket),另一些则是面向消息的(消息队列和数据报socket)。到底选择何种方法需要依赖于应用程序。
  • 与其他数据传输工具相比,System V 和 POSIX 消息队列特有的一个特性是它们能够给消息赋一个数值类型的优先级,这样递送消息的顺序就可以与发送消息的顺序不同了。
  • 管道、FIFO以及socket是使用文件描述符实现的。这些 IPC 工具都支持 I/O 模型:I/O多路复用、信号驱动的 I/O、以及 epoll API。这些技术的主要优势在于它们允许应用程序同时监控多个文件描述符以判断是否可以在某些文件描述符上执行 I/O 操作。与之相比,System V 消息队列没有文件描述符,因此并不支持这些技术。
  • POSIX 消息队列提供了一个通知工具,当一条消息进入了一个之前为空的队列中时可以使用它来向进程发送信号或实例化一个新线程。
  • UNIX domain socket 提供了一个特性允许在进程间传递文件描述符。这样一个进程就能够打开一个文件并使之对另一个本来无法访问该文件的进程可用。
  • UDP socket 允许一个发送者向多个接受者广播或组播一条消息。
  1. 网络通信:

在 UNIX IPC 工具中,只有 socket 允许进程通过网络来通信。socket 一般用于两个域中:一个是 UNIX domain,它允许位于同一系统上的进程进行通信;另一个是 Internet domain,它允许位于通过 TCP/IP 网络进行连接的不同主机上的进程进行通信。

  1. 可移植性:

System V IPC 优于 POSIX IPC。

  1. 可访问性:
  • 对于一些IPC工具(如FIFO和socket),对象名位于文件系统中,可访问性是根据相关的文件权限掩码(指定了所有者、组和其他用户的权限)来确定的。
  • 一些 ICP 工具(管道、匿名内存映射)被标记成只允许相关进程访问。相关指的是通过 fork() 关联的。为了使两个进程能够访问同一个对象,其中一个必须要创建该对象,然后调用 fork(),而 fork() 调用的结果就是子进程会继承引用该对象的一个句柄,这样两个进程就能够共享对象了。
  • POSIX 的未命名信号量的可访问性是通过包含该信号量的共享内存区域的可访问性来确定的。
  • 为了给一个文件加锁,进程必须要拥有一个引用该文件的文件描述符。
  1. 性能:

在一些场景中,不同的 IPC 工具的性能可能存在显著差异,一般不会对不同的 IPC 工具进行性能比较,原因如下:

  • 在应用程序的整体性能中,IPC 工具的性能的影响因素可能不是很大,并且确定选择何种 IPC 工具可能不仅仅需要考虑其性能因素。
  • 各种 IPC 工具在不同 UNIX 实现或 Linux 的不同内核中的性能可能是不同的。
  • 最重要的是,IPC 工具的性能可能会受到使用方式和环境的影响。相关的因素包括每个 IPC 操作交换的数据单元的大小、IPC 工具中未读取数据量可能很大、每个数据单元的交换是否需要进行进程上下文切换、以及系统上的其他负载。

如果 IPC 性能是至关紧要的,并且不存在应用程序在于目标系统匹配的环境中运行的性能基准,那么最好编写一个抽象软件层来向应用程序隐藏 IPC 工具的细节,然后在抽象层下使用不同的 IPC 工具来测试性能。

进程间通信(IPC 工具介绍)相关推荐

  1. 进程间通信(IPC)介绍

    达者为先  师者之意 进程间通信(IPC)介绍 1 管道 2 创建命名管道(FIFO) 3 消息队列 4 共享内存 5 Linux 信号 6 信号量 进程间通信(IPC,InterProcess Co ...

  2. IPC(进程间通信方式的介绍)

    进程间通信(IPC)介绍 进程间通信(IPC,InterProcess Communication)是指在不同进程之间传播或交换信息. IPC的方式通常有管道(包括无名管道和命名管道).消息队列.信号 ...

  3. Android中进程间通信(IPC)方式总结

    IPC为进程间通信或跨进程通信,是指两个进程进行进程间通信的过程.在PC和移动设备上一个进程指的是一个程序或者一个应用,所以我们可以将进程间通信简单理解为不同应用之间的通信,当然这种说法并不严谨. 在 ...

  4. Unix/Linux编程:进程间通信(IPC)总结

    IPC工具分类 如上,Unix系统上IPC根据功能可以分为三类 通信:这些工具关注进程间的数据交换 同步:这些进程关注进程和线程操作之间的同步 信号:虽然信号的主要作用不为此,但是在特定场景下仍然可以 ...

  5. 漫谈QNX(架构/进程,线程,同步,进程间通信IPC)

    (1)架构 说起Blackberry的QNX操作系统, 想必大家都听说过,但到底为什么QNX能如此有名?难道微软的Windows和Linux都不能与之抗衡? 美国NASA的太空接驳飞船也使用QNX操作 ...

  6. linux crash,系统崩溃 - crash工具介绍

    工欲善其事,必先利其器.本文主要介绍linux下crash工具常用命令的功能和使用. 背景知识 crash是redhat的工程师开发的,主要用来离线分析linux内核转存文件,它整合了gdb工具,功能 ...

  7. Linux系统编程学习笔记(九)进程间通信IPC

    进程间通信IPC: 我们以前介绍过进程控制原语,看到怎么创建多个进程.但是进程之间交互信息的方式只介绍了通过fork或者exec继承父进程的打开文件或者通过文件系统. 经典的进程通信方式有:管道.FI ...

  8. 软件包管理 之 软件在线升级更新yum 图形工具介绍

    作者:北南南北 来自:LinuxSir.Org 提要:yum 是Fedora/Redhat 软件包管理工具,包括文本命令行模式和图形模式:图形模式的yum也是基于文本模式的:目前yum图形前端程序主要 ...

  9. IDEA IntelliJ 开发工具介绍

    IntelliJ IDEA 开发Java的IDE 官网:https://www.jetbrains.com/ 下面是该工具介绍,有兴趣的可以看下,基本一堆废话: 集成开发环境(IDE,Integrat ...

最新文章

  1. exchange2007 灾难恢复E00.log(虚拟环境实验)
  2. [转]项目经理面试指南
  3. python列表下表_Python 列表下标操作
  4. C++检测步骤与示例
  5. 获国际架构顶会ATC2021最佳论文!Fuxi2.0去中心化的调度架构详解
  6. helm安装_Helm部署和体验jenkins
  7. 一些在Android中的小设置~~~持续添加
  8. linux Memcached服务
  9. 软件系统性能优化策略--SQL优化
  10. switch的处理方法
  11. tplink 2.4g弱信号剔除_解疑答惑 | 使用无线路由器上网,应使用2.4G频段还是5G频段?...
  12. php+分针和时针重合,关于时针和分钟重合次数的计算
  13. Unity3D脚印6——模型动画
  14. 将PDF文件进行文件的编辑需要利用什么软件
  15. C++实践之华氏温度转摄氏温度
  16. 计算机图形学最新发展的技术,浅析计算机图形学应用及技术发展趋势.doc
  17. canvas教程8-小球连线之碰壁则返
  18. 【JDM】弯道王子,最强马6,马自达Mazda 6 MPS
  19. 这种股权结构一定要远离!
  20. 群狼调研开展景区旅游服务质量暨游客满意度调查

热门文章

  1. flink 教程 Window
  2. LCD 调试总结(ZZ加实践)
  3. c++简单项目——连点器
  4. 华为NE40路由器手册
  5. 【推荐了解】IPFS--点对点高效传输实践
  6. 商场节日美陈策划方案
  7. 大学的计算机专业英文,计算机专业大学生英文简历模板
  8. 教你用晨曦记账本记账,设置多功能打印账目
  9. IE 8 下载控件出错
  10. 多层感知机+代码实现