首页 > 其他分享 >程之间究竟有哪些通信方式

程之间究竟有哪些通信方式

时间:2022-10-18 18:55:09浏览次数:58  
标签:方式 哪些 通信 信号量 管道 内存 进程 究竟

记一次面试:进程之间究竟有哪些通信方式? ---- 告别死记硬背

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

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

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

答是必须的,这个时候 Socket 这家伙就派上用场了,例如我们平时通过浏览器发起一个 http 请求,然后服务器给你返回对应的数据,这种就是采用 Socket 的通信方式了。

总结

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

1、管道

2、消息队列

3、共享内存

4、信号量

5、Socket

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

唠叨一下,最近有点对不住各位,好久没写原创文章了。有点偷懒,哈哈。不过呢,我接下来会好好写文章的了,希望大家多多支持。

 

 

标签:方式,哪些,通信,信号量,管道,内存,进程,究竟
From: https://www.cnblogs.com/jyc123/p/16803671.html

相关文章

  • React组件通信
    react因为组件化,使得组件间通信十分的重要。本文就来简单介绍一些常见的react组件间传递的内容。我将归纳为以下几种关系来详述:父组件与子组件之间,子组件与父组件之间,发......
  • 数字化转型后企业的管理模式有哪些改变呢?
    数字化转型后的企业在管理模式上整体呈现的就是数字化的管理,这是因为数字化转型的主题就是要构建“业务数字化、数字资产化、资产服务化、服务业务化”闭环,通过数字化技......
  • Java常用框架有哪些?
    原文链接:https://blog.csdn.net/mt776333/article/details/123432030全新java前后端开发需掌握的框架及技术:https://blog.csdn.net/qq_41134427/article/details/11833366......
  • 线程并发、同步、通信
    线程并发和同步并发:并发是为了解决多个线程在同一个时刻访问共享资源而带来的数据的不安全性,不稳定性等。同步:为了解决并发问题,给某个线程赋予指定权限来进行执行。同步......
  • Linux系统中查看进程端口常用命令有哪些?
    在Linux系统中,熟练掌握各种各样的Linux命令是非常关键的,它的功能十分强大,几乎能摆平所有状况,是我们开展工作、提升工作效率的重中之重。本篇文章为大家详细介绍一下Linu......
  • 多线程间的5种通信
    一、使用volatile关键字基于volatile关键字来实现线程间相互通信是使用共享内存的思想。大致意思就是多个线程同时监听一个变量,当这个变量发生变化的时候,线程能够感......
  • Java中正则表达式使用以及asPredicate结合集合与lambda的使用(筛选字符串集合哪些符合
    场景Java支持正则表达式,正则表达式表示的是用于扫描和匹配文本的搜索模式。java中使用Pattern类(java.util.regex包中)表示正则表达式,但是,此类不能直接实例化,只能使用静......
  • 哪些数据类岗位不容易(被优化)失业?
    哪些数据岗位不属于螺丝钉的工作呢?哪些数据岗位更能对抗被优化的风险呢?哪些数据类岗位不容易失业?不失一般性,非研发类企业的数据岗位,其抗风险的能力取决于两个因素,即价值创......
  • 企业数字化转型,要从哪些维度选择合适的系统咨询、开发合作公司呢?
    企业在做数字化转型时,选择合适的系统咨询开发合作公司非常重要,这是因为数字化转型成功的三大要件(企业一把手的大力支持、专业的转型顾问、优秀的数字化工具系统)其占了两个,及......
  • 工业互联网对推动工业产业数字化有哪些作用?
    工业互联网是数字化的重要组成部分,脱离工业互联网是谈不上数字化的!数字化,实质上就是物理形式的工业实体在数字空间的投射,并基于此来实现的以人机物(Human,Machines,Things)泛在......