摘要
我们在面试中常常被问到进程通信的方式有哪些,感觉与我们平时的开发工作没有关系,其实我们也是一直在用它
进程通信方式
1、管道(pipe)
管道又分为无名管道(即匿名管道)和有名管道
其实我们平时经常用到无名管道,在Linux命令中”|”就是无名管道的使用,
他将一个进程的输出传入到另一个进程中,比如:
1 cat xxxlog | grep "xxx"
有名管道可以通过 mkfifo命令创建
1 mkfifo pipe
2、消息队列
注意,这个消息队列不是我们常说的MQ,Kafka、RocketMQ、RabbitMQ等
消息队列提供了一种从一个进程发送到另一个进程的数据块的方法,
但是像有名管道一样,消息队列的数据最大长度是有限的,这个也是这种进程通信的一个缺点
再多的,我也不清楚了,,,请各路神仙指教了
3、共享内存
共享内存的实质是每个进程都有自己的一个虚拟空间,而不是真实的物理空间,每个线程将自己的虚拟的内存空间指向真实的物理空间,这样其中有一部分的内存空间指向的就是同一块物理空间,这就完成了内存共享的机制;
4、信号量
我们回想内存共享的缺点是什么?就是当多个进程竞争资源怎么办,就类似于多线程的并发问题。
这个时候信号量就派上用场了。
信号量本身是个计数器,用来控制进程之间的互斥和同步,通过信号量的值来控制进程对内存的访问,从而解决了多个进程竞争内存的问题。
5、Socket
套接字就是我们现在在使用的进程通信方式,我们在使用通信工具比如QQ、微信APP和客户端之间的通信就是使用Socket进行通信的。
总结
进程之间的通信方式有几种
- 管道
- 消息队列
- 内存共享
- 信号量
- Socket