进程通信的方式主要有:
1.管道
2.命名管道
3.信号
4.消息队列
5.共享内存
6.信号量
7.套接字
补充:
1、2、3、5、6 一般是用于同一机器中不同进程间的通信,
4、7可以实现不同机器之间不同进程间的通信。
进程通信:管道
管道,通常指的是无名管道。
- 它是半双工的,即数据只能在一个方向上流动,具有固定的读端和写端。
- 它只能用于具有亲缘关系的进程之间进行通信,如父子进程或者兄弟进程。
- 它可以看做一种存放在内存内,独立于文件系统之外的进程之间的共享文件。
进程通信:命名管道
命名管道,即为FIFO。
- 命名管道可以用于无关的进程进行通信。
- 命名管道以一种特殊设备文件形式存放在文件系统之中。
- 数据采用先进先出的方式进行读写。
进程通信:消息队列
消息队列,如activemq提供了异步通信方式。
- 消息队列是面向记录的,其中的消息具有特定的格式以及特点的优先级。(通常以帧的形式进行传输)
- 消息队列独立于发送与接收进程。进程终止时,消息队列内容不会被删除。
- 消息队列的读取可以不按照“先进先出”的方式,可以根据业务需求进行配置。
进程通信:信号量
信号量,本质上是一个计数器。它是用来进程间的互斥与同步,而不是用来实现进程间数据通信。
- 信号量用于进程间同步,若要进程之间传递数据需要结合共享内存。
- 信号量基于操作系统的PV操作,程序对信号量的操作都是原子操作。
- 每次对于信号量的PV操作不仅仅可以加一或者减一,可以加减任意正整数。
注:
PV操作是实现进程互斥与同步的有效方法。
原子操作指不会被线程调度机制打断的操作;这种操作一旦开始,就一直运行到结束。
进程通信:共享内存
共享内存指的是两个或者多个进程共享一个指定的内存区域。
- 共享内存是一种性能最好的进程通信的方式,因为进程直接从内存中进行数据读写。
- 由于共享内存允许多进程同时进行读写操作,所以要借助信号量进程进程间数据同步。
进程通信:信号
信号,进程之间在通信之前约定,通过信号表,约定特定的信号代表特定的含义。
- 用于通知接受进程有某种事件的发生。
- 除了用于进程间通信外,还能发送信号给进程本身。
进程通信:套接字
套接字,即Socket,根据是否面向连接又可以分成TCP和UDP。
- 一般用于不同机器之间的通信。