unix/linux下的进程间通信有很多种方法,如:
- 匿名管道(pipe):父子进程间的通信
- 命名管道(fifo):可以和无关联进程的通信
- 共享内存(shm):可以和无关联进程的通信,需要自己处理进程同步,比如和信号量配合。
- unix域套接字(unix socket):可以和无关联进程的通信,使用socket接口。
- 网域套接字(internet socket):可以跨主机通信,使用socket接口。
- 等等
这些方案各有自己的特点:
- 比如通常我们能确定共享内存一定是最快的,因为它通过将虚拟内存映射到相同的物理内存,使得两个进程可以操作相同的内存,但是它只是普通的内存操作,需要我们自己处理同步问题,以及如何通知其他进程。总结起来就是不大好用,并且如果加了同步机制之后,性能还会很快吗?
- 匿名管道很好用,不过只能在有关联的进程间使用(父子进程),命名管道可以在任意进程使用,但的性能到底如何?
- unix套接字的好处是使用相同的socket接口,我们可以设计一个抽象层,把它和TCP/UDP统一起来。前提当然是假设它在本机的进程间通信要好于TCP/UDP。
- 网域套接字的好处更明显了,可以本机(使用回环地址),也可以在网络上通信,一套接口通用性很好。
这些IPC方法的吞吐量到底怎么样呢?github上有一个项目对这些方法作了性能测试,不过有一些小问题,我fork了过来修改了一下,并且加上共享内存的测试,放在这里: https://githu