本文是对UNIX IPC工具的宏观总结和对比,细节的使用方法请参考相关手册。
UNIX IPC工具分类
通信工具
数据传输
为了进行通信,一个进程将数据写入
到IPC工具中,另一个进程从中读取
数据。这些工具要求在用户内存
和内核内存
之间进行两次数据传输。
一次传输是在写入的时候,从用户内存到内核内存。
另一次传输是在读取的时候,从内核内存到用户内存。
可以进一步将数据传输工具分成以下类别
:
- 字节流
通过管道,FIFO,以及流socket,交换的数据是一个无分隔符的字节流。每个读取操作可能会从IPC工具中读取任意数量的字节,不管写者写入的块的大小是多少。
- 消息
通过System V消息队列,POSIX消息队列,以及数据报socket,交换的数据是以分隔符分隔的消息。每个读取操作读取由写者写入的一整条消息,无法只读取部分消息,而把剩余部分留在IPC工具中,也无法在一个读取操作中读取多条消息。
- 伪终端
伪终端是一种在特殊情况下使用的通信工具。
共享内存
进程通过将数据放到由进程间共享的一块内存中以完成信息的交换。
内核通过将每个进程中的页表条目指向同一个RAM分页来实现这一功能。
一个进程可以通过将数据放到共享内存块中使得其他进程读取这些数据,由于通信无需系统调用(即,没有用户内存和内核内存之间的数据传输),因此共享内存的速度非常快。
大多数现代UNIX系统提供了三种形式
的共享内存。
- System V共享内存
- POSIX共享内存
- 内存映射
使用共享内存时的注意点
:
尽管共享内存的通信速度更快,但速度上的优势是用来弥补需要对共享内存上发生的操作进行同步的不足。例如,当一个进程正在更新共享内存中的一个数据结构时,另一个进程就不应该试图读取这个数据结构,在共享内存中,信号量通常用来作为同步方法。
放入共享内存的数据,对所有共享这块内存的进程可见。这与传输工具中具有的破坏性语义不同。