【发布时间】:2023-05-03 23:48:02
【问题描述】:
我正在用内核 2.6 在 Linux 上编写一个网络守护程序,它有 一个生产者进程和N个消费者进程,不会对数据进行任何更改,也不会对生产者产生任何响应。
每当生产者进程产生一个数据对象,其长度从几个 10 字节到几个 10 K 字节不等,它必须将数据对象传递给一个可用的消费者进程。
第一次,我考虑使用命名/未命名的 PIPE。然而, 它们将是内存复制开销。
- 生产者的用户空间缓冲区 --copy--> 内核空间 PIPE 缓冲区
- 内核空间 PIPE 缓冲区 --copy--> 消费者的用户空间缓冲区
由于该程序可能会以低延迟与大量对等点一起工作, 复制开销可能是有害的。因此,我决定将 POSIX 共享内存与 mmap() 一起使用。
我只是想知道,与 PIPE 不同,使用 POSIX 共享内存和 mmap() 在进程之间共享数据是否不会导致任何内存复制。
另外,有没有其他方法可以在进程之间共享数据,但结果是零拷贝? 该程序将在具有最新版本内核的 Linux 上运行 并且可能不必具备跨平台能力。
我决定不为每个消费者/生产者生成/运行一个线程,而是一个进程 由于设计问题。
感谢回复。
【问题讨论】:
标签: linux ipc shared-memory mmap zero-copy