避免在用户和内核空间之间复制数据,反之亦然

时间:2010-05-03 20:59:04

标签: linux mmap

我正在开发一种用于替换TCP / IP的并行计算的活动消息传递协议。我的目标是减少数据包的延迟。由于环境是局域网,我可以用更简单的协议替换TCP / IP,以减少数据包延迟。我没有编写任何设备驱动程序,我只是想用更简单的东西替换TCP / IP堆栈。现在我想避免将数据包的数据从用户空间复制到内核空间,而反之亦然。我听说过mmap()。这是最好的方法吗?如果是的话,如果你能给出一些例子的链接会很好。我是一个Linux新手,我真的很感谢你的帮助..谢谢...

谢谢, 巴拉

2 个答案:

答案 0 :(得分:3)

你应该使用UDP,这已经非常快了。至少它足够快,W32 / SQLSlammer可以在整个互联网上传播。

关于您的初始问题,请参阅(vm)splicetee Linux系统调用。

从联系手册:

  

三个系统调用splice(2),   vmsplice(2)和tee(2)),提供   完全控制的用户空间程序   在任意内核缓冲区上,   在内核中使用实现   使用的缓冲区类型相同   用于管道。概述,这些系统   调用执行以下任务:

     

剪接(2)

  moves data from the buffer to an arbitrary file descriptor, or vice
     

反之亦然,或从一个缓冲区到另一个缓冲区。

     

三通(2)

  "copies" the data from one buffer to another.
     

vmsplice(2)

  "copies" data from user space into the buffer.
     

虽然我们谈论复制,实际   通常避免复制。该   内核通过实现一个来完成   管道缓冲区作为一组   引用计数指向页面的指针   内核内存。内核创建   “复制”缓冲区中的页面   创建新指针(用于输出   缓冲区)指的是页面,和   增加参考计数   页面:只复制指针,   不是缓冲区的页面。

答案 1 :(得分:0)

  

由于环境是局域网,我可以用更简单的协议替换TCP / IP以减少数据包延迟

通常,即使在局域网中,UDP数据包也会丢失,如果客户端也会丢失 没有足够的时间来消费它......

所以不,不要用其他东西替换TCP(UDP)。因为如果确实需要可靠的传输,TCP将是最快的(因为所有连接到确认和重传的内容都在内核空间中完成)。

通常在正常情况下使用TCP没有延迟缺点(当然不要忘记TCP_NODELAY选项)

关于共享内存。实际上,您分配的所有内存都是使用mmap创建的。因此,在从驱动程序创建数据包的任何情况下,内核都需要以某种方式复制它。

如果你在谈论减少复制,通常是为文件/套接字和 使用sendfile()确实可以防止在内核和用户之间复制数据。但我想 你不需要发送文件。