零拷贝的原理

一、传统数据拷贝方式
在这里插入图片描述
①一个read系统调用后,DMA执行了一次数据拷贝,从磁盘到内核空间
②read结束后,发生第二次数据拷贝,由cpu将数据从内核空间拷贝至用户空间
③send系统调用,cpu发生第三次数据拷贝,由cpu将数据从用户空间拷贝至内核空间(socket缓冲区)
④send系统调用结束后,DMA执行第四次数据拷贝,将数据从内核拷贝至协议引擎
⑤另外,这四个过程中,每个过程都发生一次上下文切换

二、零拷贝-sendfile 对应到java中
FileChannel.transferTo(long position, long count, WritableByteChannel target)//将数据从文件通道传输到了给定的可写字节通道
在这里插入图片描述

①DMA从拷贝至内核缓冲区
②cpu将数据从内核缓冲区拷贝至内核空间(socket缓冲区)
③DMA将数据从内核拷贝至协议引擎
④这三个过程中共发生2次上下文切换,分别为发起读取文件和发送数据

以上过程发生了三次数据拷贝,其中有一次为cpu完成

三、linux内核2.4以后,socket缓冲区做了调整,DMA带收集功能,如下图:

在这里插入图片描述
①DMA从拷贝至内核缓冲区
②将数据的位置和长度的信息的描述符增加至内核空间(socket缓冲区)
③DMA将数据从内核拷贝至协议引擎

零拷贝-mmap 对应到java中
MappedByteBuffer//文件内存映射
数据不会复制到用户空间,只在内核空间,与sendfile类似,但是应用程序可以直接操作该内存。——

————————————
版权声明:本文为CSDN博主「EvanKevin」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u013018618/article/details/80146617

猜你喜欢

转载自blog.csdn.net/weixin_39195030/article/details/103696867