vmsplice
系统调用允许使用“SPLICE_F_GIFT”标志从一组用户级页面实现对管道的零拷贝发送。我的问题是是否存在反向操作,例如,我是否可以在管道的另一端有一个不仅仅是read()
或aio_read()
管道的进程,而是进行简单映射的操作管道数据进入其地址空间?这最终意味着从发送器到接收器进程的存储器映射的传输(移动)而没有任何复制。这可能吗?
编辑:我的用例如下所示。我有两个进程A和B.A生成数据(>兆字节)并希望将其传递给B进行进一步处理然后终止。我想避免复制,只是告诉内核'看我在这里有这些页面,不再需要它们了。请将它们附加到B的地址空间并完成它。'。
简单共享内存对我不起作用,因为A发送的内存可能在其地址空间中的任何位置,除非我限制A使用特定的内存分配器,该分配器适用于共享内存或临时文件,我喜欢避免。
答案 0 :(得分:3)
我认为您正在寻找process_vm_readv
和process_vm_writev
。
这些系统调用在地址空间之间传输数据 调用进程(“本地进程”)和进程 由pid识别(“远程过程”)。数据直接移动 在两个进程的地址空间之间,没有通过 通过内核空间。
有关详细信息,请参见手册页。
答案 1 :(得分:0)
nope没有与vmsplice操作相反的情况,现在有一个项目正在将DBUS放入内核中,你可能想看看它。我也有相同的要求,正在调查这整个vmsplice的事情。