3

在 UNIX 进程之间交换中等大量数据(数兆字节,但不是千兆字节)的最佳方法是什么?

我认为,这将是内存映射文件,因为大小限制似乎足够容忍。

我需要双向通信,所以普通管道无济于事。据我所知,套接字和 UDP 存在大小限制(另见此处)。不确定,如果 TCP 在fork().

阅读诸如此类的相关问题有人推荐共享内存/mmap,而其他人则推荐套接字。

还有什么我应该研究的吗?例如,是否有一些更高级别的库通过提供数据的 XML 序列化/反序列化来帮助 IPC?

由于评论而编辑:

在我的特殊情况下,有一个父/控制器进程和几个子进程(不能使用线程)。控制器根据请求为孩子提供一些可能适合一个 UDP 包的关键数据。儿童对密钥数据进行操作,并根据密钥向控制器提供信息(信息大小可以为 10-100MB)。

问题:响应数据的大小,在密钥请求时通知父级的机制,同步 - 父级在传递给子级后必须从其列表中删除密钥,不应发生重复的密钥处理。

不得使用 Boost 和其他第三方库(很遗憾)。我也许可以使用 SunOS 5.10 系统提供的库。

4

3 回答 3

4

插座。您不必在使用锁或其他方式写入或读取内存时保护内存,以使其并行执行安全。另一个好处是您可以非常轻松地将代码拆分为两个单独的可执行文件,并在不同的机器上执行它们,也可以使用套接字通信代码进行网络通信。

在我看来,主要的缺点是您必须找到一种方案来(反)序列化您的数据并将数据块拆分/组装到/从多个数据包中。

于 2013-07-04T05:43:49.857 回答
2

共享内存速度很快,但所有协调访问内存的负担都落在了您身上。您可能需要(至少)设置一个互斥锁,以确保在任何给定时间只有一个进程写入共享内存(并且,显然,确保两个进程都正确使用该互斥锁)。

除此之外,您(再次,可能)需要在内存中设置一些结构,以便接收进程知道写入了哪些新数据,它驻留在哪里等。

套接字限制可以在单个数据包中发送的数据量,但不限制您可以发送的总量。另请注意,Unix 域套接字基本上是共享内存,所有协调都在内核中处理,因此通常非常快。

有很多用于 IPC 序列化的库/协议——Boost Serialization、Sun XDR、Google 协议缓冲区等。鉴于您要交换相当多的数据,我倾向于使用 XML 以外的东西。XML 编码和解析往往相对较慢,并且通常也会对数据进行相当多的扩展。

于 2013-07-04T05:53:32.097 回答
2

共享内存。您可以非常快速地读取/写入它,并且它始终可供双方使用,无需请求响应。

http://en.wikipedia.org/wiki/Shared_memory

更重要的是,您只需要保留数据集的一份副本,因此您最终不会得到 2 个副本加上正在运行的数据 - 如果您买不起 2 个副本,您可能不得不流式传输相同的数据多次与其他解决方案。

于 2013-07-04T05:39:46.743 回答