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

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

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

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

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

5个回答

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

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

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

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

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

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

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

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

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

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐