进程之间究竟有哪些通信⽅方式?如何通信?

文章来自帅地玩编程
进程之间究竟有哪些通信⽅方式?如何通信?
1、管道
我们来看⼀一条 Linux 的语句句

netstat -tulnp | grep 8080

 学过 Linux 命名的估计都懂这条语句句的含义,其中”|“是管道的意思,它的作⽤用就是把前⼀一条命令的输出

作为后⼀一条命令的输⼊入。在这⾥里里就是把 netstat -tulnp 的输出结果作为 grep 8080 这条命令的输⼊入。如
果两个进程要进⾏行行通信的话,就可以⽤用这种管道来进⾏行行通信了了,并且我们可以知道这条竖线是没有名字
的,所以我们把这种通信⽅方式称之为匿匿名管道。
并且这种通信⽅方式是单向的,只能把第⼀一个命令的输出作为第⼆二个命令的输⼊入,如果进程之间想要互相
通信的话,那么需要创建两个管道。
居然有匿匿名管道,那也意味着有命名管道,下⾯面我们来创建⼀一个命名管道。

mkfifo - 创建FIFO(命名管道)

makefifo test

这条命令创建了了⼀一个名字为 test 的命名管道。
接下来我们⽤用⼀一个进程向这个管道⾥里里⾯面写数据,然后有另外⼀一个进程把⾥里里⾯面的数据读出来。

 

echo "this is a pipe">test

 

这个时候管道的内容没有被读出的话,那么这个命令就会⼀一直停在这⾥里里,只有当另外⼀一个进程把 test ⾥里里

⾯面的内容读出来的时候这条命令才会结束。接下来我们⽤用另外⼀一个进程来读取

cat < test//读数据

我们可以看到,test ⾥里里⾯面的数据被读取出来了了。上⼀一条命令也执⾏行行结束了了。
从上⾯面的例例⼦子可以看出,管道的通知机制类似于缓存,就像⼀一个进程把数据放在某个缓存区域,然后等
着另外⼀一个进程去拿,并且是管道是单向传输的。
这种通信⽅方式有什什么缺点呢?显然,这种通信⽅方式效率低下,你看,a 进程给 b 进程传输数据,只能等
待 b 进程取了了数据之后 a 进程才能返回。
所以管道不不适合频繁通信的进程。当然,他也有它的优点,例例如⽐比较简单,能够保证我们的数据已经真
的被其他进程拿⾛走了了。我们平时⽤用 Linux 的时候,也算是经常⽤用。
2、消息队列列
那我们能不不能把进程的数据放在某个内存之后就⻢马上让进程返回呢?⽆无需等待其他进程来取就返回呢?
答是可以的,我们可以⽤用消息队列列的通信模式来解决这个问题,例例如 a 进程要给 b 进程发送消息,只需
要把消息放在对应的消息队列列⾥里里就⾏行行了了,b 进程需要的时候再去对应的 消息队列列⾥里里取出来。同理理,b 进
程要个 a 进程发送消息也是⼀一样。这种通信⽅方式也类似于缓存吧。
netstat -tulnp | grep 8080
mkfifo test
echo "this is a pipe" > test // 写数据
cat < test // 读数据
这种通信⽅方式有缺点吗?答是有的,如果 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

posted @ 2020-08-21 14:49  Amber-  阅读(296)  评论(0编辑  收藏  举报