Boost使用零拷贝的TCP

6

我正在尝试使用boost实现tcp零拷贝,但是在google上找不到相关内容。我的问题是,使用boost库是否可以执行零拷贝操作?如果可以,请发送给我一些示例或链接。


3
boost::asio 是零拷贝的,它不会复制您通过它传递的缓冲区。然而,是否会通过 TCP 协议栈使用零拷贝操作是一个不同的问题。 - Nim
1个回答

7
您可以通过观看Yandex团队的BoostCon演讲来了解此内容:一个基于Boost.Asio的网络服务器的优化。我的直觉告诉我,他们(Yandex团队)在这方面有点过度工程化。我认为根本的解决方案在于只使用预先分配的固定缓冲区(可能是每个线程),并使用Asio中的MutableBufferSequence概念将它们粘在一起。这种方法被称为Scatter-Gather,在Asio文档中只简要描述了一下。这里可能会有一个相关的示例:http://www.boost.org/doc/libs/1_56_0/doc/html/boost_asio/examples/cpp11_examples.html#boost_asio.examples.cpp11_examples.buffers
正如@Nim已经评论的那样,默认情况下,Asio以“零拷贝”模式工作(因为它从不拥有缓冲区,也不代表调用者分配)。因此,它应该相当简单地使其工作。当然,内核/ libc函数是否以零拷贝方式实现完全取决于操作系统/平台。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接