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

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

谢谢,巴拉

Solutions Collecting From Web of "避免在用户和内核空间之间复制数据,反之亦然"

你应该使用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. 

虽然我们谈论复制,但通常会避免实际的复制。 内核通过将管道缓冲区实现为内核内存页面的一组引用计数指针来实现这一点。 内核通过创建指向页面的新指针(用于输出缓冲区)来创建页面的“副本”,并增加页面的引用计数:只复制指针,而不是缓冲区的页面。

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

一般情况下,即使在局域网中,UDP数据包往往会丢失,如果客户端没有足够的时间消耗它们,它们也会丢失。

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

一般情况下,在正常情况下不存在使用TCP的延迟缺陷(当然不要忘记TCP_NODELAY选项)

关于共享内存。 实际上你分配的所有内存都是用mmap创建的。 所以当内核从驱动程序创建数据包时,内核需要以某种方式复制它。

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