2 asd001110 asd001110 于 2016.05.02 23:00 提问

传统内核协议栈为什么不使用零拷贝,也就是内存映射来提升性能? 1C

如题,传统内核协议栈为什么不使用零拷贝,也就是内存映射来提升性能?

内核TCP/IP协议在中断处理阶段将网卡中数据拷贝到内核缓冲区,协议处理完后再将其拷贝到用户态,第一次拷贝很快,第二次拷贝很慢,大约占了整个处理流程的一半时间以上;
现在的零拷贝技术不再进行内核到用户的拷贝,而是直接进行一次内存映射,以此来提升网络性能。

那么,我想问的是:内核协议栈是否可以使用零拷贝技术?若不能,主要原因是什么?

在此,我的一个想法是:是不是因为用户处理的是纯data,即不包括协议头,如果映射,用户无法识别数据区。但是不是很确定,请各位大神指点。

5个回答

caozhy
caozhy   Ds   Rxr 2016.05.02 23:26

协议除了考虑性能还要考虑扩展性。而且是否优化,优化到什么程度要看什么协议。

sxwws
sxwws   2016.05.04 16:14

这个就好比tcpdump和netsniff-ng实现上的区别,内核空间是所有进程共享的区域,传统的方式,将数据放在这个区,方便所有的应用去使用。

但是如果有的应用,强调性能,那么就会使用零拷贝技术,将数据直接从网卡拷贝到用户空间。

这也就是netsniff-ng不丢帧,而tcpdump在流量稍大的情况下有丢帧的原因。

asd001110
asd001110   2016.05.05 01:21

零拷贝是内存映射还是拷贝到用户?

传统内核如果直接映射,数据如何解析?

asd001110
asd001110   2016.05.05 01:21

零拷贝是内存映射还是拷贝到用户?

传统内核如果直接映射,数据如何解析?

sxwws
sxwws   2016.05.05 13:38

更多的细节,我推荐你看篇文章。
http://blog.chinaunix.net/uid-20279362-id-3763236.html

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!