零拷贝技术是什么? 什么是零拷贝?

刘波

听到“零拷贝”这个名字,你可能会想:拷贝就拷贝,怎么还能是“零”呢?它到底是怎么做到的,又能带来多大的好处?别急,今天我们用3分钟时间,彻底讲明白一个高性能编程里非常关键的技术——零拷贝。

想象一下,你的电脑是一个大仓库,里面有两个隔间:一个叫“用户空间”,是咱们自己写的应用程序的地盘;另一个叫“内核空间”,是操作系统核心的地盘,管理着所有硬件,比如硬盘和网卡。这两个空间之间有道“墙”,不能随便串门。

QQ截图20251211235511.png

现在,你的任务是把硬盘上的一个文件通过网卡发出去。在传统的文件传输方式下,这个过程有多繁琐呢?第一次拷贝:CPU发出指令,让硬盘把这个文件先搬到内核空间的一个临时中转区——页缓存。为什么不能直接搬?因为应用程序没权限直接操作硬件,必须通过操作系统这个“大管家”。第二次拷贝:文件到了内核的中转区,但你的应用程序在用户空间看不见也摸不着,所以CPU还得再辛苦一趟,把这个文件从内核的中转区再搬到用户空间应用程序自己的地盘上,即应用程序缓冲区。第三次拷贝:现在,文件到了应用程序缓冲区,但最终是要把它发出去,所以应用程序需要再请求CPU,把这个文件从用户空间再搬回内核空间的另一个区域——SOCKET缓冲区(SOCKET是网络通信的接口,数据必须先到这里才能发送出去)。第四次拷贝:最后,SOCKET缓冲区再把文件拷贝到网卡的缓冲区,这才真正通过网络发送出去。

我们来数一数,整整四次数据拷贝!而且每次在用户态和内核态之间切换,都需要CPU进行上下文切换,就像让一个工人不停地放下手里的A工作去做B工作,再回来做A,效率极低。另外你会发现,第二和第三次拷贝——从内核搬到用户,再搬回内核——完全是多余的:这个文件数据只是经过一下应用程序的手,并没有对它做任何修改,纯粹是在做无用功。

那么,零拷贝技术就是来干掉这些多余操作的。它的核心思想是:既然你不修改数据,就别让数据来回溜达了。在现代操作系统中,通过一个叫做sendfile的系统调用,零拷贝是这样完成的:第一次拷贝,硬盘上的数据直接拷贝到内核的页缓存。关键一步来了:CPU不再把数据整个搬到用户空间,而是只把数据在页缓存中的位置信息、描述符和长度信息直接传递给SOCKET缓冲区,这一步几乎不耗费资源。第二次拷贝:网卡驱动根据得到的位置信息,使用DMA(直接内存访问)技术,直接从页缓存中将数据抓取出来,发送到网络上。

看,整个过程中,数据始终乖乖地待在内核空间,没有踏入用户空间半步,拷贝次数从4次降到了两次,上下文切换也大大减少。所以什么是零拷贝?不是不拷贝,而是一种避免了在用户空间和内核空间之间进行多次不必要的数据拷贝的技术。

它的价值巨大无比:第一,极大提升性能,尤其是处理大文件传输时,速度提升是数量级的;第二,降低CPU占用,减少了不必要的拷贝和上下文切换,把宝贵的CPU资源留给真正的计算任务。像Nginx、kafka、RocketMQ这些高性能的中间件和服务器,都深度使用了零拷贝技术,这才是它们能轻松应对海量网络流量的秘密武器之一。

希望今天的内容,能够让你彻底掌握零拷贝这个技术概念和原理。

文章版权声明:文章内容均来源于各大短视频平台搜集以及修改和删减新增,如有侵权或者违规,请联系站长进行删除,如需转载或复制请以超链接形式并注明出处。

发表评论

快捷回复: 表情:
AddoilApplauseBadlaughBombCoffeeFabulousFacepalmFecesFrownHeyhaInsidiousKeepFightingNoProbPigHeadShockedSinistersmileSlapSocialSweatTolaughWatermelonWittyWowYeahYellowdog
验证码
评论列表 (暂无评论,46人围观)

还没有评论,来说两句吧...

目录[+]