每个进程都有自己的地址空间,所以一个进程内的数据对其他进程来说是独立的。 要想在进程间交换数据就需要通过内核完成。 在内核中开辟一块缓冲区,一个进程把数据拷贝到内核缓冲区,另一个进程再把数据从缓冲区读取出来。 内核提供的这种进程间交换数据的机制就叫进程间通信。
管道/匿名管道有如下特点:
-
管道是半双工的,数据只能向一个方向流动。因此当双方互相通信时,需要建立2个通道。
-
匿名管道由于没有命名,所以只能用于具有亲缘关系的父子进程或兄弟进程之间。
-
管道的实质是内核缓冲区,它可以被看做一个FIFO先进先出的队列, 管道一端的进程将数据写入队列尾部,另一端进程从头部读取数据。
-
管道发送的是无数据格式的字节流,这就要求进行管道通信的2端进程需要预先定义好数据格式。
管道通信模型:
命民管道提供一个路径名与之关联,并以文件的形式存于文件系统中。 这样即使进程之间不存在亲缘关系,只要进程可以访问到该路径,就可以通过命名管道进行通信。
信号是用于进程间互相通信,通知进程某个事件已经发生的一种机制。 比如在Linux 信号驱动IO模型中,当内核准备好数据后,便发送信号通知用户应用进程数据已准备好。
信号量是一个计数器,通常作为多进程访问共享数据的同步机制。
消息队列有如下特点:
-
消息队列是消息链表,具有特定的格式,它存放在内核中并由消息队列标识符标识。
-
消息队列也是队列,也遵循FIFO先进先出的原则。
为了进程间的数据交换,内核在内存中分了一块内存,并允许多个进程操作这一块内存空间,它的效率非常高。 但由于多个进程共享一份内存,所以需要依靠某种同步机制来实现进程间的同步与互斥,如:信号量等。
套接字是一种通信机制,客户端进程与服务端进程可以通过套接字进行双向通信。 即可以使2台机器的进程完成通信。
Socket通信模型: