进程通信,指的是进程之间相互交换信息。从某种意义上说进程同步和互斥也是一种进程通信,只是交换的数据量小,因此成为低级通信。
目前高级通信方式分位三大类:共享存储器系统、消息传递系统和管道通信系统。
共享存储器系统
这种通信方式要求进程之间共享某些变量,通过这些变量交换信息。但这这些变量要在各进程之间互斥使用。
消息传递系统
广泛应用的一种通信机制。在消息化传递系统中,进程之间交换数据以格式化的方式,又称为报文。按照其实现方式的不同分为直接通信和间接通信。
(1)直接通信:发送进程直接把消息发送给接受进程。并挂在接受进程的消息缓冲队列上,接受进程从缓冲队列中取出来。
(2)间接通信:发送进程把消息发给某个中间实体中,接受进程从中取出消息。这种中间实体叫做信箱。
要支持这种通信方式,操作系统应该提供若干个消息缓冲区,用以存放消息。每当一个进程向另一个进程发送消息时,首先向操作系统申请一个消息缓冲区,并把已制备好的消息从发送区复制到该缓冲区,然后把它复制插入接收进程的消息链中。所有发给同一个进程的消息缓冲区构成该进程的消息链,该进程PCB中的mq指针指向该链表头。
信箱通信:是消息缓冲通信的一种改进,是一种间接通信方式。可由发送进程创建一个连接两个进程的信箱,通信时发送进程只需要把它的信件投入信箱,接收进程就可以在任何时间取走信件,不会丢失。
管道通信
所谓管道就是用于连接读进程和写进程之间的一个共享文件。向管道(共享文件)提供输入的发送进程,以字符流的形式将大量的数据写入管道。而接收管道(共享文件)输出的接收进程从管道中接收数据。
Linux进程通信
(1)管道:半双工,数据只能单向流动,而只能在具有亲缘关系的进程间使用。管道是一种特殊的文件,这个文件只存在与内存中。管道只能承载无格式字符流以及缓冲区大小等缺点。
(2)命名管道:半双工,允许无亲缘关系的进程间使用。命名管道是一个设备文件,只需要给出访问路径就行了。
(3)信号量:信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程在访问资源时,其他资源也来访问。
(4)消息队列:消息队列是消息的链表,存放在内核中并由消息队列标示符标识。消息队列传递的消息量少。
(5)信号:信号是一种比较复杂的通信方式,用于通知某个进程某个时间发生。
(6)共享内存:共享内存时映射一段能被其他进程所访问的内存,这段内存由一个进程创建但是多个进程都可以访问。共享内存时最快的IPC方式。
(7)socket通信:可与不同机器之间的进程实现进程通信。