进程间的通信⽅式有哪些?区别是什么,为什么需要?

进程间的通信⽅式有哪些?区别是什么,为什么需要?

进程间的通信⽅式有哪些?区别是什么,为什么需要?

导图有笔记

https://www.processon.com/view/link/60ef10dae0b34d06fba96f3d

进程的通信有 6 种,分别是:管道、消息队列、共享内存、信号量、socket,信号。

他们的区别,有哪些应⽤,为什么需要这些?

管道

匿名管道:

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

命名****管道:

下面我们来创建一个命名管道。

执行之后会卡住

在另一个进程里面执行输出管道内容就可以了

从上面的例子可以看出,管道的通知机制类似于缓存,就像一个进程把数据放在某个缓存区域,然后等着另外一个进程去拿,并且是管道是单向传输的。这种通信方式效率低下,a 进程给 b 进程传输数据,只能等待 b 进程取了数据之后 a 进程才能返回。

所以管道不适合频繁通信的进程。当然,他比较简单,能够保证我们的数据已经真的被其他进程拿走了。

我们平时用 Linux 的时候,也算是经常用。

消息队列

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

可以用消息队列的通信模式来解决这个问题,例如 a 进程要给 b 进程发送消息,只需要把消息放在对应的消息队列里就行了,b 进程需要的时候再去对应的消息队列里取出来。同理,b 进程要个 a 进程发送消息也是一样。这种通信方式也类似于缓存吧。

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

共享内存

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

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

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

信号量

共享内存:就是多进程竞争内存的问题,就像类似于我们平时说的线程安全问题。

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

Socket

跨主机进程通信

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

1、管道

2、消息队列

3、共享内存

4、信号量

5、Socket

相关推荐

Create Hand Crafting - MC百科
365bet苹果版

Create Hand Crafting - MC百科

📅 10-19 👁️ 3717
陌陌直播最新版
365bet苹果版

陌陌直播最新版

📅 07-22 👁️ 5123
台式电脑没声音怎么调出来 台式电脑音响没有声音解决方法【详解】
万方数据知识服务平台
365bet苹果版

万方数据知识服务平台

📅 08-26 👁️ 4176
宜宾麻将游戏
beat365中国

宜宾麻将游戏

📅 08-29 👁️ 4394
银行卡自动扣款怎么取消?教你三种方法
365外网足球

银行卡自动扣款怎么取消?教你三种方法

📅 09-14 👁️ 8810
欧路词典|英汉-汉英词典 camera是什么意思
365外网足球

欧路词典|英汉-汉英词典 camera是什么意思

📅 09-16 👁️ 6011
点的意思
365外网足球

点的意思

📅 10-08 👁️ 6762
游戏服务器
365外网足球

游戏服务器

📅 07-25 👁️ 5553