作者:帅地

有一次面试的时候,被问到进程之间有哪些通信方式,不过由于之前没深入思考且整理过,说的并不好。想必大家也都知道进程有哪些通信方式,可是我猜很多人都是靠着”背“来记忆的,所以今天的这篇文章,讲给大家详细着讲解他们是如何通信的,让大家尽量能够理解他们之间的区别、优缺点等,这样的话,以后面试官让你举例子,你也能够顺手拈来。

1、管道

我们来看一条 Linux 的语句

netstat -tulnp | grep 8080

学过 Linux 命名的估计都懂这条语句的含义,其中”|“是管道的意思,它的作用就是把前一条命令的输出作为后一条命令的输入。在这里就是把 netstat -tulnp 的输出结果作为 grep 8080 这条命令的输入。如果两个进程要进行通信的话,就可以用这种管道来进行通信了,并且我们可以知道这条竖线是没有名字的,所以我们把这种通信方式称之为匿名管道。

并且这种通信方式是单向的,只能把第一个命令的输出作为第二个命令的输入,如果进程之间想要互相通信的话,那么需要创建两个管道。

居然有匿名管道,那也意味着有命名管道,下面我们来创建一个命名管道。

mkfifo  test

这条命令创建了一个名字为 test 的命名管道。

接下来我们用一个进程向这个管道里面写数据,然后有另外一个进程把里面的数据读出来。

echo "this is a pipe" > test   // 写数据

这个时候管道的内容没有被读出的话,那么这个命令就会一直停在这里,只有当另外一个进程把 test 里面的内容读出来的时候这条命令才会结束。

cat < test  // 读数据

我们可以看到,test 里面的数据被读取出来了。上一条命令也执行结束了。

从上面的例子可以看出,管道的通知机制类似于缓存,就像一个进程把数据放在某个缓存区域,然后等着另外一个进程去拿,并且是管道是单向传输的。

这种通信方式有什么缺点呢?显然,这种通信方式效率低下,你看,a 进程给 b 进程传输数据,只能等待 b 进程取了数据之后 a 进程才能返回。

所以管道不适合频繁通信的进程。当然,他也有它的优点,例如比较简单,能够保证我们的数据已经真的被其他进程拿走了。我们平时用 Linux 的时候,也算是经常用。

2、消息队列

那我们能不能把进程的数据放在某个内存之后就马上让进程返回呢?无需等待其他进程来取就返回呢?

答是可以的,我们可以用消息队列的通信模式来解决这个问题,例如 a 进程要给 b 进程发送消息,只需要把消息放在对应的消息队列里就行了,b 进程需要的时候再去对应的

消息队列里取出来。同理,b 进程要个 a 进程发送消息也是一样。这种通信方式也类似于缓存吧。

这种通信方式有缺点吗?答是有的,如果 a 进程发送的数据占的内存比较大,并且两个进程之间的通信特别频繁的话,消息队列模型就不大适合了。因为 a 发送的数据很大的话,意味**发送消息(拷贝)**这个过程需要花很多时间来读内存。

哪有没有什么解决方案呢?答是有的,请继续往下看。

3、共享内存

共享内存这个通信方式就可以很好着解决拷贝所消耗的时间了。

这个可能有人会问了,每个进程不是有自己的独立内存吗?两个进程怎么就可以共享一块内存了?

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

4、信号量

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

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

5、Socket

上面我们说的共享内存、管道、信号量、消息队列,他们都是多个进程在一台主机之间的通信,那两个相隔几千里的进程能够进行通信吗?总结

所以,进程之间的通信方式有:

1、管道

2、消息队列

3、共享内存

4、信号量

5、Socket

讲到这里也就完结了,之前我看进程之间的通信方式的时候,也算是死记硬背,并没有去理解他们之间的关系,优缺点,为什么会有这种通信方式。所以最近花点时间去研究了一下,

整理了这篇文章,相信看完这篇文章,你就可以更好着理解各种通信方式的由来的。

更多了解作者:帅地

html 如何实现一条竖线边上有 刻度_记一次腾讯面试:进程之间究竟有哪些通信方式?如何通信? ---- 告别死记硬背||CSDN博文精选...相关推荐

  1. html 如何实现一条竖线边上有 刻度_如何用低技术实现高性能

    Photo by Kevin Jarrett on Unsplash 撰文 | 吴进远 责编 | 夏志坚 随着人类工业技术的迅猛发展,人们可以造出许多高性能的工业装备.仪器设备.智能产品等等.不过有不 ...

  2. html 如何实现一条竖线边上有 刻度_Android H5交互Webview实现localStorage数据存储

    先看看效果图吧-- 实现比较简单,但是第一次用可能会遇到一些坑 首先得有Webview控件: 有人问我是不是需要写布局文件,不写行不行,现在我就告诉你们,不写没问题,需要写就写不写直接创建New一个也 ...

  3. 给 Python 开发者的四条忠告!| CSDN 博文精选

    作者 | 天元浪子 责编 | 屠敏 出品 | CSDN博客 不要纠结于开发工具的选择,简单直接就是最好的 学习一种编程语言,首先要找一款合用的集成开发工具,似乎是自然而然的想法.为什么不呢?IDE可以 ...

  4. div和div之间画横线_HTML如何在两个div标签中间画一条竖线

    近日在画一个界面的时候,遇到一个需求:在界面当中画一条竖线,且这条竖线在高度上需要自动占满整个父div(即这条竖线的高度和两个div中较高的一个等高). 往常我们画一条横线直接用标签 即可,当画一条竖 ...

  5. div和div之间画横线_HTML在两个div标签中间画一条竖线的方法

    HTML在两个div标签中间画一条竖线的方法 发布时间:2020-09-14 11:34:51 来源:亿速云 阅读:170 作者:小新 这篇文章主要介绍HTML在两个div标签中间画一条竖线的方法,文 ...

  6. 计算机屏幕上怎么会有条竖杠,电脑屏幕出现一条竖线

    大家好,我是时间财富网智能客服时间君,上述问题将由我为大家进行解答. 以Windows10为例,电脑屏幕出现一条竖线有两种可能: 1.屏线松动或者连接插针处氧化等,造成接触不良,可以重新插接屏线: 2 ...

  7. Firebug网络面板里的两条竖线表示什么?

    Firebug的网络面板可用来查看网站各个资源的加载时间,以便帮助开发者更有效的提高页面加载速度.在这个面板中,我们会看到一蓝一红两条竖线,这两条竖线各代表什么含义呢? 蓝线表示DOMContentL ...

  8. html一条竖线写法

    html一条竖线写法 <div style="float:left;margin-top: 30px;width: 1px;height: 200px; background: dar ...

  9. HTML插入一条竖线

    处理方式: 1.图片(略) 2.字符:就跟普通的其他字符一样就可以 eg:| 3.边框:border-left或者border-right 4.背景颜色 假如那条竖线是100px的话,使用定位在那个位 ...

最新文章

  1. APP测试和传统软件测试有什么区别?
  2. 火狐中H1到H5都有特定margn
  3. 什么是php数组,php 数组写法是什么
  4. linux - word frequency
  5. 《Python游戏编程快速上手》第十一章猜数字,推理游戏Bagels
  6. pytorch贝叶斯网络_贝叶斯神经网络:2个在TensorFlow和Pytorch中完全连接
  7. python decimal用法_Python decimal模块使用方法详解
  8. 一周文章导读:架构图;服务器;CPU
  9. python中索引和下标_Series下标索引、标签索引、切片索引、布尔索引
  10. v8的垃圾回收机制(二)
  11. 浅谈数据结构之顺序队列(五)
  12. ARM开发6.3.2 基础实训( 2 ) 单个数码 LED 的显示输出系统设计( 2 )--LPC21XX
  13. mysql2005中文版_SQL Server 2005 sp4 简体中文完整免费版下载
  14. C2000系列DSP生成hex/bin文件并使用串口下载程序的方法
  15. 计算机的音乐怎么调,电脑怎么调整音频设备属性
  16. 于的繁体字有几种写法_于的繁体字是什么(行书怎么写)
  17. 解决安装 Bun 之后出现 zsh compinit: insecure directories, run compaudit for list. Ignore insecure directorie
  18. 深度学习第一次作业 - 波士顿房价预测
  19. C++一本通1086(角谷猜想)
  20. StartDT Hackathon | 技术小白独立部署DataSimba,需要多久?

热门文章

  1. 全网唯一一个可以复现成功的光流计算项目
  2. 如何只训练网络中的全连接层
  3. 石墨变为石墨烯的方法
  4. django写项目的详细步骤
  5. 理解Docker——深入引擎室
  6. Block介绍(二)内存管理与其他特性
  7. [转]#pragma once和#pragma comment
  8. 使COUNT(*)查询总数变快
  9. 中国的人生路上是紧跟领导就会有回报
  10. Scala的特质(Trait)介绍