进程间通信方法汇总
前言
进程间的通信方式,其实我们一直在用它,但是我们都不会去注意它。如果碰到面试官问你知道多少种进程间的通信方式,估计很多人都会有点懵。今天我们就来总结下进程间的通信方式有哪些。
管道
管道,英文为pipe。这是一个我们在学习Linux命令行的时候就会引入的一个很重要的概念。它的发明人是道格拉斯.麦克罗伊,这位也是UNIX上早期shell的发明人。他在发明了shell之后,发现系统操作执行命令的时候,经常有需求要将一个程序的输出交给另一个程序进行处理,也因此,管道应运而生了。
管道可以分为两类:匿名管道和命名管道。
常见的Linux命令 "|" 其实就是匿名管道,表示把一个进程的输出传输到另外一个进程,如:
echo "Happyjava" | awk -F 'j' '{print $2}'
# 输出 ava
复制代码
另外,我们可以通过 mkfifo <pipename> 命令创建一个命名管道,如:
mkfifo pipe
复制代码
一个进程往管道输入数据,则会阻塞等待别的进程从管道读取数据:
如果我另外一个窗口没有执行 cat < pipe 命令,则左边的窗口(echo 'Happyjava' > pipe)会一直阻塞。
消息队列
注意,此消息队列不是我们常用的MQ,如kafka,rabbitmq,rocketmq等。
消息队列提供了一种从一个进程向另一个进程发送一个数据块的方法。 每个数据块都被认为含有一个类型,接收进程可以独立地接收含有不同类型的数据结构。我们可以通过发送消息来避免命名管道的同步和阻塞问题。但是消息队列与命名管道一样,每个数据块都有一个最大长度的限制。
使用消息队列进行进程间通信,可能会收到数据块最大长度的限制约束等,这也是这种通信方式的缺点。如果频繁的发生进程间的通信行为,那么进程需要频繁地读取队列中的数据到内存,相当于间接地从一个进程拷贝到另一个进程,这需要花费时间。
共享内存
共享内存这个通信方式就可以很好着解决拷贝所消耗的时间了。系统加载一个进程的时候,分配给进程的内存并不是实际物理内存,而是虚拟内存空间。那么我们可以让两个进程各自拿出一块虚拟地址空间来,然后映射到相同的物理内存中,这样,两个进程虽然有着独立的虚拟内存空间,但有一部分却是映射到相同的物理内存,这就完成了内存共享机制了。
信号量
共享内存最大的问题是什么?没错,就是多进程竞争内存的问题,就像类似于我们平时说的线程安全问题。如何解决这个问题?这个时候我们的信号量就上场了。
信号量的本质就是一个计数器,用来实现进程之间的互斥与同步。例如信号量的初始值是 1,然后 a 进程来访问内存1的时候,我们就把信号量的值设为 0,然后进程b 也要来访问内存1的时候,看到信号量的值为 0 就知道已经有进程在访问内存1了,这个时候进程 b 就会访问不了内存1。所以说,信号量也是进程之间的一种通信方式。
Socket
这个就是我们一直在用的进程间的通信方式了,如我们的微信APP跟微信服务器通信,其实就是使用的Socket套接字进行通信的。
总结
这里总结下,进程(Linux)间的通信方式有:
1、管道
2、消息队列
3、共享内存
4、信号量
5、Socket
上一篇: 进程间通信(IPC)
下一篇: 图表 | 流程之间如何相互通信
推荐阅读
-
算法系列--Linux 下的共享内存函数,实现进程间通信并封装为一个类(I)--主要函数说明
-
现代操作系统说明 - 进程间通信
-
进程间通信(I):竞争条件和互斥方案
-
现代操作系统 - 进程间通信问题
-
进程和线程(同步、互斥、通信方法等)
-
我的第一个微信小程序 "Hello World"(超详细)--我的解决方法是使用快捷键Ctrl+shift+Esc打开任务管理器,将打开的微信开发者工具内部的所有进程关闭,然后右键点击桌面上的微信开发者工具,以管理员身份运行微信开发者工具就可以成功打开微信开发者工具登录界面了!以下是开发者创建微信开发者工具登录界面的步骤汇总
-
Linux 进程间通信 - 消息队列 (I)
-
IPC 进程间通信】常用进程间通信方法汇总
-
进程间通信的方式--信号、管道、消息队列、共享内存
-
谈谈进程间通信和线程间通信的几种方式和区别