通常来将进程之间的通讯根据内容能够划分为两种,一种是传输控制信息,另外一种是传输大量的数据。通常控制信息只有一个或几个字节,用来达到进程控制操做的高速执行(好比利用信号量实现进程同步);大量数据的传输通常用于进程之间信息的交换(CS架构中,客户端和服务器之间大量数据的交互)[4]。php
Linux中进程间通讯(IPC)是从Unix中衍生过来的,最初的Unix具有管道、FIFO、信号,后来通过贝尔实验室和BSD(加州大学伯克利分校的伯克利软件发布中心)的拓展造成了如今的进程通讯基础。html
贝尔实验室对早期的Unix进程通讯方式进行了拓展,造成了“System V IPC”, 通讯局限于单个计算机内;BSD打破了该限制,造成了基于套接字的进程间通讯机制。而Linux将二者间的特点都继承了下来,同时它还兼容POSIX IPC标准(目前POSIX标准更加通用一些)。node
管道是Unix对操做系统的贡献之一,它是一个环形缓冲区,容许两个进程之间以生产者/消费者的模式进行通信,是一个先进先出的队列[2]。linux
管道是一种半双工的通讯方式(消息只能单向传输)。数据传输方式似于流式传输,不提供随机访问,进程之间要约定一套数据协议来解析传输的数据[5]。数据由操做系统缓冲,直到接收方从中读取[1],它能够像文件描述符同样去经过select,poll和epoll函数去监听。docker
管道在创建过程当中须要双方进行协同操做(有些API中打开管道过程当中会阻塞,直到双方都执行了打开操做),不能独立于进程而存在。缓存
管道分为匿名管道和命名管道(Named Pipe):匿名管道只有亲缘关系的进程(父进程与子进程之间,或子进程与子进程之间)能够共享;没有亲缘关系的进程之间只能经过命名管道通讯。服务器
FIFO(first-in first-out special file, named pipe)在Linux中属于一种命名管道。经过绑定文件系统中指定文件来代替标准的输入输出[1],容许多个进程访问。网络
Unix中对管道自动采起互斥保护措施,每次只有一个进程能访问管道[2]。架构
信号是用于向一个进程通知某种事件的发生。除了进程间通讯外还能够发送给进程自己。由于没法利用信号传输数据,因此信号主要用于进程管理上。并发
Unix中内核平等的对待全部的信号,对于同时发生的信号,一次只给进程一个信号,而没有特定的顺序。进程间能够互相发送信号,内核在内部也可能发送信号[2]。
咱们常用的 Ctrl+C 就是发送一个退出的信号给某一进程。
消息队列的功能相似于信箱,它也能够在没有亲缘关系的进程之间去使用,在双方没有直接链接的状况下进行通讯[1]。消息队列是直接面对消息的,消息的发送者指定发送的消息的类型和大小,消息的接收者指定消息接收的方式(先进先出的规则或指定的消息类型)。
克服了信号承载信息量少和管道只能承载无格式字节流的缺点,能够实现进程之间多对一的通讯(C/S模式)。即便是接收者没有打开消息队列,发送者仍然能够打开队列发送消息而不阻塞,不须要额外的同步操做,能够避免管道中的打开和读写阻塞问题。
消息队列中存储的消息数量是有上限的,同时每一条消息的大小也是有上限的。
多个进程将同一个共享的内存段映射到本身的进程资源中,向同一段内存中读写数据来进行数据交互,是进程之间通讯速度最快的一种方式,常常与其余通讯机制(信号量)混合使用来达到进程间通讯的目的[5]。
Pipe和FIFO以及消息队列在交互信息的时候都须要经过内核拷贝的方式--将数据从发送方拷贝到内核缓存,再从内核缓存中拷贝到接收方[6],一次通讯要COPY两次。而共享内存则不须要经过内核拷贝,因此速度上要比Pipe、FIFO和消息队列快一些。
共享内存一般会在实时性要求比较高的业务状况下使用,好比金融系统中,但涉及到分布式的服务,常常须要跨主机的状况共享内存不太适合。
经常使用于跨主机的进程通讯,由BSD最先提供,后来被linux所吸取。它有经过网络端口跨主机通讯的TCP/IP socket(面向流数据)和UDP socket(面向消息),也有UNIX domain socket这种只能在本地使用的类型。
Unix domain socket 相似于TCP/IP互联网套接字,但全部通讯都在内核中进行,使用文件系统做为其地址空间。进程作为inode来使用一个Unix domain socket,而且多个进程能够与同一个套接字进行通讯(docker服务监听本地请求就是经过Unix domain socket)[1]。
进程之间可使用socket进行双向通讯。
用于不一样进程之间,或者同一进程中不一样线程之间同步的通讯机制。采用PV原语来实现。
[1] https://en.wikipedia.org/w/index.php?title=Inter-process_communication&oldid=833805357
[2] 《操做系统与精髓》 6.7 Unix的并发机制
[3] https://www.ibm.com/developerworks/cn/linux/l-ipc/index.html
[4] 《计算机操做系统教程》 清华版 第3版 张尧学 3.7 进程间通讯
[5] https://www.ibm.com/developerworks/cn/aix/library/au-spunix_sharedmemory/