具有共享内存的进程之间的通信结果是零拷贝?

ddo*_*man 9 linux ipc mmap shared-memory zero-copy

我正在使用内核2.6在Linux上编写一个网络守护程序,它有 一个生产者进程和N个消费者进程,它们不会对数据进行任何更改,也不会向生产者创建任何响应.

每当生产者进程生成一个数据对象,其长度从几个10字节变化到几十个K字节时,就必须将数据对象传递给一个可用的消费者进程.

第一次,我考虑使用命名/未命名的PIPE.但是,它们将是内存复制开销.

  1. 生产者的用户空间缓冲区--copy - >内核空间PIPE缓冲区
  2. kernel-space PIPE buffer --copy - > consumer的用户空间缓冲区

由于该程序可能与大量具有低延迟的对等端一起工作,因此复制开销可能是有害的.因此,我决定使用POSIX共享内存和mmap().

我只是想知道使用POSIX共享内存和mmap()的进程之间的共享数据是否不会导致任何内存复制,这与PIPE不同.

此外,还有其他方法可以在进程之间共享数据,但结果是零拷贝吗?该程序将在具有最新版本内核的Linux上运行,并且可能不具备跨平台能力.

我决定不为每个消费者/产品生成/运行一个线程,而是由于设计问题而产生一个过程.

谢谢你的答复.

gpc*_*pcz 5

通常,共享内存专门设计为不会导致复制开销(源:http://www.boost.org/doc/libs/1_46_0/doc/html/interprocess/sharedmemorybetweenprocesses.html#interprocess.sharedmemorybetweenprocesses.sharedmemory.shared_memory_what_is).

如果您正在使用C++,Boost :: Interprocess是一个很棒的库,用于以跨平台的方式实现您所描述的内容 - 您可以将它们的共享内存类与named_upgradable_mutex结合使用.named_upgradable_mutex类支持在资源上提供独占和可共享锁,因此您可以使用它轻松实现您的使用者 - 生产者模型.(来源:http://www.boost.org/doc/libs/1_37_0/doc/html/boost/interprocess/named_upgradable_mutex.html#id2913393-bb)