在UNIX进程之间交换大量数据(多兆字节,但不是千兆字节)的最佳方法是什么?
我认为,这是内存映射文件,因为大小限制seem tolerable enough.
我需要双向通信,所以常见的管道无济于事。对于套接字和UDP,存在大小限制,据我所知(另见here)。
不确定,如果TCP在fork()
的子进程和父进程之间进行通信是个好主意。
阅读this等相关问题,有些人推荐使用共享内存/ mmap,其他人推荐使用套接字。
还有什么我应该研究的吗?例如,是否有一些更高级别的库通过提供例如IPC来帮助IPC。 XML序列化/反序列化数据?
由于评论而编辑:
在我的特殊情况下,有一个父/控制器进程和几个子进程(不能使用线程)。控制器根据请求为孩子提供一些可能适合一个UDP包的关键数据。儿童根据关键数据采取行动,并根据钥匙向控制人提供信息(信息大小可以是10-100MB)。
问题:响应数据的大小,通知父级密钥请求的机制,同步 - 父级必须在传递给子级后从其列表中删除密钥,不应发生重复的密钥处理。
不得使用Boost和其他第三方库(不幸的是)。我或许可以使用SunOS 5.10系统提供的库。
答案 0 :(得分:4)
套接字。在使用锁或其他方式编写或读取内存时,您不必保护内存,以使其并行执行安全。另一个好处是,您可以非常轻松地将代码拆分为两个单独的可执行文件,并使用套接字通信代码在不同的计算机上执行这些可执行文件。
在我看来,主要的缺点是你必须找到一个方案来(取消)序列化你的数据并将数据块拆分/组装成几个数据包。
答案 1 :(得分:2)
共享内存很快,但让所有负责协调对您内存的访问。您可能需要设置(至少)一个互斥锁,以确保在任何给定时间只有一个进程写入共享内存(显然,确保两个进程都正确使用该互斥锁。)
除此之外,您(可能)还需要在内存中设置一些结构,以便接收进程知道已写入的新数据,它所在的位置等等。
套接字限制了可以在单个数据包中发送的数据量,但不限制您可以发送的总数量。另请注意,Unix域套接字基本上是共享内存,所有协调都在内核中处理,所以它通常完全快。
有很多用于IPC序列化的库/协议 - Boost Serialization,Sun XDR,Google协议缓冲区等。鉴于您正在交换相当多的数据,我倾向于倾向于XML以外的东西。 XML编码和解析往往相对较慢,并且通常也会扩展数据。
答案 2 :(得分:1)
共享内存。您可以非常快速地读/写它,并且它始终可用于双方,无需请求响应。
http://en.wikipedia.org/wiki/Shared_memory
更重要的是,您只需保留一份数据集副本,这样就不会有2份副本加上飞行中的数据 - 如果您买不起2份副本,则可能需要流式传输与其他解决方案多次使用相同的数据。