如何在POSIX中实现零拷贝机制?

ani*_*han 4 linux posix zero-copy

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

我遇到了零复制机制,这减少了CPU上的复制开销.Linux支持使用sendfilesplice.这些API不在POSIX中.如何仅使用POSIX API实现零拷贝?

Pet*_*des 8

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

Linux手册页sendfile(2)vmsplice(2)没有提到POSIX替代品,所以我怀疑有一个.要在只有一个副本的进程之间发送数据,请在它们之间设置管道并用于vmsplice将页面放入管道中并进行零拷贝.在接收端,我认为只是read(2)用来将页面从管道中取出.

通过网络,零拷贝更难. 为什么Linux内核中没有零拷贝网络?有一些评论和答案.接收端很难在通常的套接字API之上实现,除非它仅在read(2)套接字上阻塞线程时才起作用.否则,它如何知道进程的虚拟内存中放置数据包的位置?