vmsplice
系统调用允许使用“SPLICE_F_GIFT”标志实现从一组用户级页面到管道的零复制发送。我的问题是是否存在反向操作,例如,我是否可以在管道的另一端有一个进程,它不只是简单地read()
或aio_read()
管道,而是执行一个简单地将管道数据映射到其地址空间的操作?这最终意味着将内存映射从发送方传输(移动)到接收方进程而无需任何复制。这可能吗?
编辑:我的用例如下所示。我有两个进程 A 和 B。A 生成数据(> 兆字节)并希望将其传递给 B 进行进一步处理,然后终止。我想避免复制,只是告诉内核'看我这里有这些页面,不再需要它们了。请将它们附加到 B 的地址空间并完成它。'。
简单的共享内存对我不起作用,因为 A 发送的内存可能位于其地址空间中的任何位置,除非我限制 A 使用适用于共享内存或临时文件的特定内存分配器,我想避免这种情况。