3

vmsplice系统调用允许使用“SPLICE_F_GIFT”标志实现从一组用户级页面到管道的零复制发送。我的问题是是否存在反向操作,例如,我是否可以在管道的另一端有一个进程,它不只是简单地read()aio_read()管道,而是执行一个简单地将管道数据映射到其地址空间的操作?这最终意味着将内存映射从发送方传输(移动)到接收方进程而无需任何复制。这可能吗?

编辑:我的用例如下所示。我有两个进程 A 和 B。A 生成数据(> 兆字节)并希望将其传递给 B 进行进一步处理,然后终止。我想避免复制,只是告诉内核'看我这里有这些页面,不再需要它们了。请将它们附加到 B 的地址空间并完成它。'。

简单的共享内存对我不起作用,因为 A 发送的内存可能位于其地址空间中的任何位置,除非我限制 A 使用适用于共享内存或临时文件的特定内存分配器,我想避免这种情况。

4

2 回答 2

3

我认为您正在寻找process_vm_readvand process_vm_writev

这些系统调用在调用进程(“本地进程”)的地址空间和由 pid 标识的进程(“远程进程”)之间传输数据。数据直接在两个进程的地址空间之间移动,不经过内核空间。

有关详细信息,请参见手册页。

于 2013-04-17T14:54:47.623 回答
0

不,vmsplice 操作没有反向操作,现在有一个项目正在进行,用于将 DBUS 放入内核中,您可能想看看它。我也有同样的要求,正在调查这整个 vmsplice 的事情。

于 2013-04-17T13:11:19.673 回答