[麦麦茶水间] 【每周分享】什么是零拷贝技术?

[复制链接]
1194|4
 楼主| dffzh 发表于 2025-7-16 13:14 | 显示全部楼层 |阅读模式
零拷贝(ZeroCopy),又称零复制,是一种计算机操作技术,是指计算机执行操作时,CPU不需要先将数据从某处内存复制到另一个特定区域。
或者可以这么理解:与传统的read/write模式相比,零拷贝技术在数据发送的过程中,不需要在用户态为数据申请buffer,也就是不会产生用户态、内核态之间的数据拷贝,可以有效提高读写性能。
其主要目的在于减少或者消除CPU在数据复制操作中的参与度,从而提高系统运行性能。
下面将从核心概念、主要实现方式、优势和应用场景等方面阐述一下零拷贝技术。
1、核心概念
我们先来看看传统的数据拷贝:
在这种拷贝操作中,数据从磁盘到网络一般需要经过很多次拷贝过程,比如:
磁盘 → 内核缓冲区;
内核缓冲区 → 用户空间缓冲区;
用户空间缓冲区 → 内核socket缓冲区;
socket缓冲区 → 网卡。
通过上面的执行流程可以看出,传统的操作总共发生了4次拷贝。
再来看看零拷贝技术:
零拷贝技术消除了这些不必要的拷贝过程,通常使用以下方式执行拷贝:
让数据直接从存储设备传输到网络;
在内核空间内部传输,避免用户空间参与。
2、主要实现方式
零拷贝的主要实现方式包括:
mmap + write:
mmap是Linux提供的一种内存映射文件的机制,它实现了将内核中读缓冲区地址与用户空间缓冲区地址进行映射,从而实现内核缓冲区与用户缓冲区的共享。
使用内存映射文件,将内核缓冲区映射到用户空间,减少一次从内核空间到用户空间的拷贝。
sendfile函数:
使用sendfile函数将数据通过socket发送到对端;
Linux系统调用,允许数据在内核空间直接传输,完全避免了用户空间的参与。
DMA (Direct Memory Access,直接存储器访问技术):
允许硬件设备直接访问内存,无需CPU介入,也常用于MCU的技术。
splice:
splice是Linux2.6内核中新增的零拷贝数据发送函数,主要用于将数据发送到管道或从管道中接收数据。
另一个Linux系统调用,可以在两个文件描述符之间移动数据。
3、优势
零拷贝技术主要包括以下4个方面的优势:
减少CPU使用率:消除不必要的拷贝操作;
降低内存带宽压力:减少内存间的数据传输;
提高吞吐量:数据传输更加高效;
减少上下文切换:某些实现避免了用户态和内核态的切换。
4、应用场景
零拷贝技术的应用领域包括但不限于以下方面:
文件服务器;
网络代理;
数据库系统;
视频流媒体服务;
大数据处理框架。

综上所述,零拷贝技术是现代高性能计算和网络编程中的重要优化手段,特别是在处理大量数据传输的场景中效果会更加显著。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
ldg999 发表于 2025-7-16 23:17 | 显示全部楼层
感谢分享

评论

一起学习。  发表于 2025-7-17 08:41
暖心小太阳 发表于 2025-7-17 20:37 | 显示全部楼层
零拷贝技术听起来好高级,它真的能显著提高性能吗?具体在哪些场景下效果最明显?

评论

咱就知道有这么个技术,也没在实际项目上用过。  发表于 2025-7-18 13:17
您需要登录后才可以回帖 登录 | 注册

本版积分规则

143

主题

1403

帖子

23

粉丝
快速回复 在线客服 返回列表 返回顶部