我正在开发一种用于替代 TCP/IP 的并行计算的主动消息传递协议。我的目标是减少数据包的延迟。由于环境是局域网,我可以用更简单的协议替换 TCP/IP 以减少数据包延迟。我没有编写任何设备驱动程序,我只是想用更简单的东西替换 TCP/IP 堆栈。现在我想避免将数据包的数据从用户空间复制到内核空间,反之亦然。我听说过 mmap()。这是最好的方法吗?如果是的话,如果您能提供一些示例的链接,那就太好了。我是一个linux新手,我真的很感谢你的帮助..谢谢...
谢谢,巴拉
您应该使用 UDP,这已经非常快了。至少它足以让 W32/SQLSlammer 在整个互联网上传播。
关于您最初的问题,请参阅(vm)splice和teeLinux 系统调用。
从手册页:
三个系统调用 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()确实可以防止在内核和用户之间复制数据。但我假设您不需要发送文件。