代码之家  ›  专栏  ›  技术社区  ›  BjoernD

在Linux中,vmsplice()系统调用是否有反向操作?

  •  3
  • BjoernD  · 技术社区  · 11 年前

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

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

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

    2 回复  |  直到 11 年前
        1
  •  3
  •   Ilya Matveychikov    11 年前

    我想你正在寻找 process_vm_readv process_vm_writev .

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

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

        2
  •  0
  •   Ravikumar Tulugu    11 年前

    不,虽然没有vmsplice操作的反向操作,但现在有一个将DBUS放入内核的项目正在进行中,你可能想看看它。我也有同样的要求,并且正在研究整个vmsplice的事情。