我想知道linux内核(或任何其他主流操作系统)没有零拷贝网络功能的原因是什么?我所说的零拷贝是指数据包/数据流不会被拷贝以传递给用户空间中的应用程序,而是使用内存池类型的分配器在内核和用户空间之间共享内存。我自己提出了三个理论:
a) 我想是出于安全考虑。但是,当用户空间和内核只是用作缓冲区时,真的没有办法在它们之间安全共享内存吗?
b) 我想存在稳定性方面的担忧。但是,我们难道不能假设,无论谁使用零拷贝网络,例如,需要为内核调用建立并传递内存池,都知道内存管理吗?有足够的意识来避免泄漏?
c) 只是到目前为止还没有完成/需要它。我真的无法想象没有人要求这个功能,因为每个使用小数据包大小的人通常都会受到"缓慢"TCP堆栈实现的限制,而且有第三方工具可用于0拷贝网络,用于特殊网卡。
请随意发布任何猜测,但请标记您是否假设或对保持StackOverflow质量的原因有更深入的了解:-)
现在有几个零拷贝网络选项:
- PF_RING ZC(零拷贝)
- Linux本机零拷贝TCP
- 英特尔数据平面开发工具包
- 专有硬件的OpenOnload
请注意,使用TCP进行零复制可能不方便,因为TCP段携带标头和有效载荷,但应用程序只关心有效载荷,因此必须将有效载荷而不是标头复制到应用程序的连续缓冲区中。