gpt4 book ai didi

c - 使用和不使用 Scatter/Gather 操作的零拷贝

转载 作者:IT王子 更新时间:2023-10-29 00:38:55 24 4
gpt4 key购买 nike

我刚刚读了一篇 article这解释了零拷贝机制。

它讨论了支持和不支持 Scatter/Gather 的零拷贝之间的区别。

不支持SG的网卡,数据拷贝如下

enter image description here

支持SG的网卡,数据副本如下

enter image description here

总之,支持SG的零拷贝可以消除一个CPU拷贝。

我的问题是为什么内核缓冲区中的数据会分散

最佳答案

因为 Linux 内核的映射/内存分配设施默认情况下会创建虚拟连续但可能在物理上不相交的内存区域。
这意味着 sendfile() 在内部执行的从文件系统中读取的内容会转到 内核虚拟内存 中的缓冲区,DMA 代码必须“transmogrify”(因为缺少更好的词)变成网卡的 DMA 引擎可以理解的东西。

由于 DMA(通常但不总是)使用物理地址,这意味着您要么复制数据缓冲区(到一个专门分配的物理连续内存区域,您的套接字缓冲区 以上),或者一次传输一个物理页面

另一方面,如果您的 DMA 引擎能够将多个物理上不相交的内存区域聚合到单个数据传输中(称为“分散-收集”),那么您可以简单地传递一个列表而不是复制缓冲区物理地址(指向内核缓冲区的物理连续子段,即上面的聚合描述符)并且您不再需要为每个物理页面启动单独的 DMA 传输。这通常更快,但能否完成取决于 DMA 引擎的能力。

关于c - 使用和不使用 Scatter/Gather 操作的零拷贝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9770125/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com