进程间的通信方式,其实我们一直在用它,但是我们都不会去注意它。如果碰到面试官问你知道多少种进程间的通信方式,估计很多人都会有点懵。今天我们就来总结下进程间的通信方式有哪些。

一、概念

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

进程间通信(IPC,Interprocess communication)是一组编程接口,让程序员能够协调不同的进程,使之能在一个操作系统里同时运行,并相互传递、交换信息。这使得一个程序能够在同一时间里处理许多用户的要求。因为即使只有一个用户发出要求,也可能导致一个操作系统中多个进程的运行,进程之间必须互相通话。IPC接口就提供了这种可能性。每个IPC方法均有它自己的优点和局限性,一般,对于单个程序而言使用所有的IPC方法是不常见的。

IPC方法包括管道(PIPE)、消息队列、共享内存、信号量及套接字(Socket)。

二、进程间通信的目的

  • 数据传输
    一个进程需要将其数据发送给另一进程,发送的数据量在一个字节到几M字节之间。
  • 共享数据
    多个进程操作共享数据
  • 事件通知
    一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程)。
  • 资源共享
    多个进程之间共享同样的资源。为了作到这一点,需要内核提供锁和同步机制
  • 进程控制
    有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变。

二、进程间通信方式介绍

1.管道

英文为pipe。这是一个我们在学习Linux命令行的时候就会引入的一个很重要的概念。它的发明人是道格拉斯.麦克罗伊,这位也是UNIX上早期shell的发明人。他在发明了shell之后,发现系统操作执行命令的时候,经常有需求要将一个程序的输出交给另一个程序进行处理,也因此,管道应运而生了。

管道可以分为两类:匿名管道和命名管道。匿名管道只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。命名管道:name_pipe克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信。

常见的Linux命令 "|" 其实就是匿名管道,表示把一个进程的输出传输到另外一个进程,如:

[root@xxx ~]# ps -ef | grep java

2.消息队列

注意,此消息队列不是我们常用的MQ,如kafka,rabbitmq,rocketmq等。

消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法。是由消息组成的链表,存放在内核中并由消息队列标识符标识。 每个数据块都被认为含有一个类型,接收进程可以独立地接收含有不同类型的数据结构。我们可以通过发送消息来避免命名管道的同步和阻塞问题。但是消息队列与命名管道一样,每个数据块都有一个最大长度的限制。

使用消息队列进行进程间通信,可能会收到数据块最大长度的限制约束等,这也是这种通信方式的缺点。如果频繁的发生进程间的通信行为,那么进程需要频繁地读取队列中的数据到内存,相当于间接地从一个进程拷贝到另一个进程,这需要花费时间。

3.共享内存

共享内存这个通信方式就可以很好着解决拷贝所消耗的时间了。系统加载一个进程的时候,分配给进程的内存并不是实际物理内存,而是虚拟内存空间。那么我们可以让两个进程各自拿出一块虚拟地址空间来,然后映射到相同的物理内存中,这样,两个进程虽然有着独立的虚拟内存空间,但有一部分却是映射到相同的物理内存,这就完成了内存共享机制了。

共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号量配合使用,来实现进程间的同步和通信

4.信号量

共享内存最大的问题是什么?没错,就是多进程竞争内存的问题,就像类似于我们平时说的线程安全问题。如何解决这个问题?这个时候我们的信号量就上场了。

信号量的本质就是一个计数器,用来实现进程之间的互斥与同步。可以用来控制多个进程对共享资源的访问。例如信号量的初始值是 1,然后 a 进程来访问内存1的时候,我们就把信号量的值设为 0,然后进程b 也要来访问内存1的时候,看到信号量的值为 0 就知道已经有进程在访问内存1了,这个时候进程 b 就会访问不了内存1

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

5.套接字

套解字也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同机器间的进程通信。如我们的微信APP跟微信服务器通信,其实就是使用的Socket套接字进行通信的。

四、进程间通信方式比较

  1. 管道:速度慢,容量有限,只有父子进程能通讯
  2. FIFO:任何进程间都能通讯,但速度慢
  3. 消息队列: 容量受到系统限制,且要注意第一次读的时候,要考虑上一次没有读完数据的问题,消息队列可以不再局限于父子进程,而允许任意进程通过共享消息队列来实现进程间通信,并由系统调用函数来实现消息发送和接收之间的同步,从而使得用户在使用消息缓冲进行通信时不再需要考虑同步问题,使用方便,但是信息的复制需要额外消耗CPU的时间,不适宜于信息量大或操作频繁的场合。此种方法不太常用
  4. 信号量: 不能用来传递复杂消息,只能用来同步
  5. 共享内存:利用内存缓冲区直接交换信息,无须复制,快捷、信息量大是其优点。共享内存块提供了在任意数量的进程之间进行高效双向通信的机制。每个使用者都可以读取写入数据,但是所有程序之间必须达成并遵守一定的协议,以防止诸如在读取信息之前覆写内存空间等竞争状态的出现

类型

无连接

可靠

流控制

记录

消息类型优先级

普通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

五、进程间通信方式的选择

  • 常适用于两个进程间的通信
  • 共享内存用来实现进程间共享的、非常庞大的、读写操作频率很高的数据;这种方法适用于多进程间的通信
  • 其他考虑用socket。主要应用在分布式开发中

六、总结

这里总结下,进程间的通信方式有:

  1. 管道
  2. 消息队列
  3. 共享内存
  4. 信号量
  5. Socket

我的微信公众号:架构真经(id:gentoo666),分享Java干货,高并发编程,热门技术教程,微服务及分布式技术,架构设计,区块链技术,人工智能,大数据,Java面试题,以及前沿热门资讯等。每日更新哦!

参考资料:

  1. https://www.cnblogs.com/zgq0/p/8780893.html
  2. https://baike.baidu.com/item/%E8%BF%9B%E7%A8%8B%E9%97%B4%E9%80%9A%E4%BF%A1/1235923?fr=aladdin
  3. https://www.jianshu.com/p/8e4f9978e5b8

操作系统(4)-进程间通信相关推荐

  1. 【操作系统】进程间通信

    多个进程可以共享系统中的各种资源,但其中许多资源一次只能为一个进程使用,我们把一次仅允许一个进程使用的资源成为临界资源.许多物理设备都属于临界资源,如打印机等. 对临界资源的访问,必须互斥的进行在,在 ...

  2. 操作系统:进程间通信与线程间同步

    进程线程通信方式之间的差异 每个进程有自己的地址空间.两个进程中的地址即使值相同,实际指向的位置也不同.进程间通信一般通过操作系统的公共区进行.   同一进程中的线程因属同一地址空间,可直接通信. 不 ...

  3. 【操作系统】进程间通信的五种方式

    引言 1.进程对白:管道.记名管道.套接字 1.管道 2.虫洞:套接字 3.信号 4.信号旗语:信号量 5.进程拥抱:共享内存 引言 进程作为人类的发明,自然免不了脱离人类的习性,也有通信需求.如果进 ...

  4. 详解操作系统之进程间通信 IPC (InterProcess Communication)

    进程间通信(IPC,Inter-Process Communication),指至少两个进程或线程间传送数据或信号的一些技术或方法. 进程是计算机系统分配资源的最小单位(严格说来是线程).每个进程都有 ...

  5. 操作系统实验--进程间通信

    进程间通信 一.实验名称 进程间通信 二.实验内容 学生独立设计并实现消息传递系统进程间交换数据的任务. 三.实验原理和设计思路 在Linux系统下用signal()函数进行进程间通信,pipe()函 ...

  6. 终于有人将进程间通信讲明白了

    使用多进程协作来实现应用和系统是一种被广泛使用的开发方法.多进程协作主要有以下三点优势. 将功能模块化,避免重复造轮子. 增强模块间的隔离,提供更强的安全保障. 提高应用的容错能力. 进程间通信(In ...

  7. Linux 进程间通信(IPC)---大总结

    目录 前言 进程间通信方式 管道 匿名管道(PIPE) 如何创建匿名管道 管道的读写特性 命令行管道符的实现 命名管道(FIFO) 管道特性 共享内存 共享内存的操作流程 如何创建共享内存 如何将共享 ...

  8. linux系统线程通信的几种方式,Linux进程间通信-线程间通信

    Linux作为一种新兴的操作系统,几乎支持所有的Unix下常用的进程间通信方法:管道.消息队列.共享内存.信号量.套接口. 1.管道 管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动 ...

  9. Android 操作系统基础

    Android操作系统 什么是操作系统 操作系统的作用 操作系统的共性 面向下层:管理硬件包含CPU,内存,Flash各种I/O等等. 面向上层:为用户提供人机交互界面.还为第三方程序研发提供便捷可靠 ...

  10. Linux学习笔记8—进程间通信

    - 本人的LeetCode账号:魔术师的徒弟,欢迎关注获取每日一题题解,快来一起刷题呀~ 本人Gitee账号:路由器,欢迎关注获取博客内容源码. 文章目录 一.进程间通信引出 二.进程间通信的目的 三 ...

最新文章

  1. 学习OpenCV——配置CUDA环境
  2. 阮一峰react demo代码研究的学习笔记 - demo5 debug
  3. Python类的实例属性详解
  4. g++ 安装python_以后再也不用“教程”:让人举一反三的python配置环境过程 + 超简单原理概括!...
  5. nodepad 关闭语法检查
  6. Python之math库
  7. SpringBoot动态切换数据源-快速集成多数据源的启动器
  8. python基础:re模块匹配时贪婪和非贪婪模式
  9. hdu--1181--变形课
  10. python配色方案_python 生成18年写过的博客词云
  11. 电子科技大学软件工程大一到大二课程
  12. 浅谈权限设计(从接口权限到数据权限)
  13. 关于js的match用法
  14. 拆素数【找规律,数学】
  15. 工业机器人调运角度_工业机器人的应用案例
  16. 游戏开发九宫格战斗架构解析具体解释
  17. Web安全技术—常见的攻击和防御
  18. 【2023年最新版】Kali安装详细教程
  19. 圆的周长,面积,球的体积和表面积
  20. day25/RegexDemo1.java

热门文章

  1. Topology and Geometry in OpenCascade-Face
  2. Jakarta Commons:巧用类和组件三(转)
  3. Vista初级使用技巧及故障总结
  4. Java编程思想—第八九章
  5. python基本原理概论_优学院《2020年马克思主义基本原理概论题库(高职类)》查题教程2020高校邦《Python程序设计基础【实境编程】》答案完整...
  6. PHP接收到的$_POST数据里的邮箱符号@变成了%40
  7. PHP mysql_real_escape_string() 函数防止数据库攻击
  8. Spring Cloud 微服务实战系列-Eureka注册中心(一)
  9. JVM优化系列-详解常用的虚拟机调优参数
  10. 整洁架构设计分析--架构设计的本质是什么?