零拷贝原理

零拷贝原理:
在实际应用中,如果我们要把磁盘内容发送到远程服务器上,那么它必须要经过几个拷贝的过程。
第一个从磁盘中去读取目标文件的内容拷贝到内核缓冲区
第二个CPU控制器把内核缓冲区中的数据拷贝到用户空间的缓冲区。
第三个在应用程序中调用write()方法,把用户空间缓冲区中的数据拷贝到内核空间的Socket Buffer中
第四个把在内核模式下的SocketBuffer中的数据赋值到网卡缓冲区。
最后网卡缓冲区会把数据发送到目标服务器
从上可以看出数据读取出来到发送出去要经历四次拷贝。在这四次拷贝中有两次拷贝是多余的。
第一从内核空间拷贝到用户空间,第二从用户空间再拷贝到用户空间,除此之外,由于用户空间建和内核空间的切换会带来CPU的上下文切换,对于CPU的性能也会造成影响。
而所谓的零拷贝就是把这两次多余的拷贝给忽略掉,应用程序可以直接把磁盘中的数据从内核中传送给socket,而不需要再去经过用户空间拷贝数据,零拷贝通过DMA,叫Direct Memory Access技术把文件内容复制到内核空间中的Read Buffer,接着把包含数据长度和位置的信息的文件描述符加载到Socket Buffer中,DMA引擎直接可以吧数据从内核空间传递到网卡设备,在这个流程中数据只经历了两次拷贝就把数据发送到网卡中并且减少了两次CPU的上下文切换对于效率是有非常大的提升 。在linux中零拷贝技术依赖于底层的sendfile()方法去实现而在java中是FileChannel.transferTo() 去实现。除此之外还有mmap的文件映射机制,它的原理是把磁盘文件映射到内存用户通过修改内存就可以修改磁盘文件,使用这种方式可以获得很大的I/O提升省去了用户空间到内核空间的开销

posted on   云中哥  阅读(345)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示