进程间的通信方式,说白话 就是两个进程间的数据如何传输的?
1.管道pipe(无名管道)
看一条常见linux命令 ps -ef | grep java
其中中间的这条 “ | ” 就是管道,
上述这条命令由两部分构成可以看作是两个进程 ps和grep,ps 得到的结果通过管道传递给 grep
优点:简单简洁
缺点:只能单向传输,只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。
2.有名管道
命令: mkfifo myPipe // 我们手动创建一个名为"myPipe" 的管道
echo "this is a pipe" > myPipe //echo进程向其中写数据myPipe
cat < myPipe // cat进程读出管道中数据
有名管道类似于一种缓存, 它允许无亲缘关系进程间的通信。
3.消息队列
A进程要给B进程发送消息
A将消息写至消息队列,B从消息队列读消息
缺点:原理就是从A的内存拷贝到消息队列,再从消息队列拷贝到B的内存空间。拷贝消耗性能
4.共享内存
A进程与B进程通过共享内存的方式实现数据交互
共享内存的原理也就是通过二者的虚拟内存指向同一块物理内存
虚拟内存可以参考这篇 虚拟内存与Linux层级结构
缺点:多个进程共享内存可能会出现并发安全问题
5.信号量
信号量的本质就是一个计数器,用来实现进程之间的互斥与同步。
信号量本身不是一种消息发送的方式,而是作为共享内存的并发解决办法
可以把信号量看作是一把锁,初始值为1
当有进程访问时,设置为0,其他进程通过判断信号量二实现串行化访问内存,也就解决并发问题了
6.Socket
Socket套解字也是一种进程间通信机制,代表不同机器间的进程通信方式