2014-09-01 78 views
5

我想實現tcp零拷貝使用提升,但我無法找到谷歌任何東西。我的問題是有可能使用boost庫執行零拷貝,如果是這樣請 給我一些例子或一些鏈接。TCP零拷貝使用提升

+3

'boost :: asio'是零拷貝,因爲它不會複製你通過它的緩衝區。但是,是否通過tcp堆棧使用零拷貝操作 - 這是一個不同的問題。 – Nim 2014-09-01 08:14:03

回答

6

你可以通過Yandex的人看這部BoostCon談話:The Optimization of a Boost.Asio-based Networking Server

我的直覺說,他們(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函數是否以零拷貝方式實現完全取決於OS /平臺。