4

我想在本地/网络的两个进程之间共享/传输数据。通用 IPC 机制共享内存和消息队列可用于传输数据。但这些机制涉及多个副本。

我遇到了零复制机制,它减少了 CPU 的复制开销。Linux 使用sendfile和支持这一点splice。这些 API 不在 POSIX 中。如何仅使用 POSIX API 实现零拷贝?

4

1 回答 1

8

如果将共享数据保存在共享内存中,则两个进程之间的共享内存是零拷贝。否则必须在某处有一个副本(例如进出共享内存)。如果其中一个进程将共享数据保存在共享内存中,而另一个进程只是从那里读取它,则可以将其减少为一个副本。

Linux 手册页没有提及 POSIX 替代方案,所以我怀疑是否存在sendfile(2)vmsplice(2)要在只有一个副本的进程之间发送数据,请在它们之间建立一个管道,并使用vmsplice零副本将页面放入管道。在接收端,我认为只是read(2)用来将页面从管道中取出。

在网络上,零拷贝更加困难。 为什么 Linux 内核中没有零拷贝网络?有一些评论和答案。接收端很难在通常的套接字 API 之上实现,除非它仅在read(2)套接字上的线程被阻塞时工作。否则,它怎么知道进程的虚拟内存中将数据包放在哪里?

于 2015-09-09T08:34:08.653 回答