目前,我想了解剪接/ vmsplice的价值。 关于IPC的使用情况下,我偶然发现在计算器如下回答: https://stackoverflow.com/a/1350550/1305501
问:如何使用vmsplice而不复制数据(即零拷贝)从一个进程传递内存页到另一个进程?
上面提到的答案声称,它是可能的。 但是,它不包含任何的源代码。 如果我理解的文档vmsplice
正确,下面的函数将转移的内存页到管道(内核缓冲区)不复制,如果内存分配正确并对齐。 处理省略为便于表述的错误。
// data is aligned to page boundaries,
// and length is a multiple of the page size
void transfer_to_pipe(int pipe_out, char* data, size_t length)
{
size_t offset = 0;
while (offset < length) {
struct iovec iov { data + offset, length - offset };
offset += vmsplice(pipe_out, &iov, 1, SPLICE_F_GIFT);
}
}
但是,如何才能将内存页面从用户空间而不复制访问? 显然,下面的方法不起作用:
-
vmsplice
:这个功能也可用于相反的方向。 但根据在评论内核源代码 ,数据将被复制。 -
read
:我能想象,这个功能确实有些神奇,如果内存是正确对齐,但我对此表示怀疑。 -
mmap
:在管道不可能的。 但是否有某种虚拟的文件,它可以用来代替,即splice
的内存页到虚拟文件和mmap
呢? - ...?
难道就没有可能在所有vmsplice
?