各种进程间通信效率比較
类型 | 无连接 | 可靠 | 流控制 | 记录消息类型 | 优先级 |
---|---|---|---|---|---|
普通PIPE | N | Y | Y | N | |
流PIPE | N | Y | Y | N | |
命名PIPE(FIFO) | N | Y | Y | N | |
消息队列 | N | Y | Y | Y | |
信号量 | N | Y | Y | Y | |
共享存储 | N | Y | Y | Y | |
UNIX流SOCKET | N | Y | Y | N | |
UNIX数据包SOCKET | Y | Y | N | N |
注:无连接: 指无需调用某种形式的OPEN,就有发送消息的能力流控制:,假设系统资源短缺或者不能接收很多其它消息,则发送进程能进行流量控制
各种通信方式的比較和优缺点
-
管道:速度慢,容量有限,仅仅有父子进程能通讯(有半双工的pipe以及全双工的socketpair,使用环境几乎一致)
-
FIFO:不论什么进程间都能通讯,但速度慢,用于一些效率不高的场合,比如发一些命令给别的进程。
-
消息队列:容量受到系统限制,且要注意第一次读的时候,要考虑上一次没有读完数据的问题,并且长度类型一定是要long 类型,否则msgrcv 会阻塞无法成功接收。
-
信号量:不能传递复杂消息,仅仅能用来同步。
-
共享内存区:速度快,但是没有同步机制,通常用于一些进程间交换大数据的场合,比如视频、文件复制之类。
-
socket 本地域通信:和不同机器之间socket通信方式大致相同,功能强大,目前在很多开源程序上很常见,比如wpa_supplicant和wpa_cli通信机制,目前如果对销量要求较高,相对复杂,数据量不是十分大的,推荐采用socket IPC。