区别
IPC,全名Inter Process Communication即进程间通讯,在同一台机器上的两个进程就用IPC,不能跨物理机器,IPC包括共享内存、队列、信号量等几种方式,由于IPC通讯效率之高,所以大量的Unix下软件都用IPC通讯,如oracle
TCP/IP,全名Transmission Control Protocol/Internet Protocol即传输控制协议/网间网协议,TCP/IP可在同一台机子或两台物理机或不同操作平台之间的两个进程进行通讯。
如果两个进程在同一台机子且在同一个操作平台,可选择IPC或TCP/IP两种通讯方式都可以,但IPC效率高于TCP/IP。采用IPC通讯,进程1直接把通讯包发给进程2,采用TCP/IP通讯,进程1将要先把通讯包发给“LO”即本地环路接口,通过“LO”再把通讯包发给进程2
如果两个进程在不同的物理机上或者在不同的操作平台,则不能用IPC,这时用TCP/IP通讯,进程1把通讯包发给本机的物理网卡1,物理网卡1通过网线把通讯包发给进程2所在的机器物理网卡2,网卡2再把通讯包发给进程2。
IPC方式
IPC的方式通常有管道(包括无名管道和命名管道)、消息队列,信号量、共享存储、Socket、Streams等,其中Socket和Streams支持在不同主机上的两个进程IPC
- 管道:通常称为无名管道,它是半双工的(即数据只能在一个方向上流动),它只能用于具有亲缘关系的进程之间的通信(也是父子进程或者兄弟进程之间),它可以看成是一种特殊的文件,但并不属于其他任何文件系统,并且只存在于内存中。是UNIX系统IPC最古老的形式
- FIFO:也称为命名管道,是一种文件类型,可以在无关的进程之间交换数据,FIFO有路径名与之相关联,以一种特殊设备文件形式存放于文件系统中
- 消息队列:是消息的链接表,存放于内核中。一个消息队列由一个标识符(即队列ID)来标识。消息队列是面向记录的,其中的消息具有特定的格式以及特定的优先级,独立于发送和接收进程,进程终止时,消息队列及其内容并不会被删除。消息不一定要以先进先出的次序读取,也可以按消息的类型读取
- 信号量:它是一个计数器,信号量用于实现进程间的互斥与同步,而不是用于存储进程间的通信数据
- 共享内存:指两个或多个进程共享一个给定的存储区,是最快的一种IPC,因为进程是直接对内存进行存取,通常信号量+共享内存结合在一起使用,信号量用来同步对共享内存的访问
五种通讯方式总结:
- 管道:速度慢,容量有限,只有父子进程能通讯
- FIFO:任何进程间都能通讯,但是速度慢
- 消息队列:容量受到系统限制,且第一次读的时候,要考虑上一次没有读完数据的问题
- 信号量:不能传递复杂消息,只能用来同步
- 共享内存区:能够很容易控制容量,速度快,但要保持同步,比如一个进程在写的时候,另一个进程要注意读写的问题,相当于线程中的线程安全,当然,共享内存区同样可以用作线程间通讯,不过没这个必要,线程间本来就已经共享了同一进程内的一块内存