零拷贝技术

传统I/O

传统I/O的工作方式是,数据读取和写入是从用户空间到内核空间来回复制,而内核空间的数据是通过操作系统层面的I/O接口从磁盘读取或写入。

涉及到下面两个函数:

read(file, tmp_buf, len);

write(socket, tmp_buf, len);

  • 需要4次数据拷贝,2次CPU ,2次DMA。
  • 发生4次上下文切换,因为发生2次系统调用,一次是read,一次是write

零拷贝

  • 通过DMA将磁盘上的数据拷贝到内核缓存区中
  • 缓冲区描述符和数据长度传到socket缓冲区中,这样网卡的SG-DMA控制器就可以直接将内核缓存的数据拷贝到网卡的缓存区中。此过程不需要将数据从操作系统的内核缓存区拷贝到socket缓存区中,减少了一次数据拷贝

此过程只进行了两次数据拷贝,2次上下文切换

零拷贝:没有在内存层面去拷贝数据,也就是全程没有通过CPU来搬运数据。

  • 相比传统方式,少了2次系统调用,再加上网卡支持SG-DMA技术的话,数据拷贝只需要两次,且都不需要CPU,只需要DMA
  • Kafka消息队列I/O的吞吐量高的原因,也是由于零拷贝技术。
相关推荐
chlk1231 天前
Linux文件权限完全图解:读懂 ls -l 和 chmod 755 背后的秘密
linux·操作系统
舒一笑1 天前
Ubuntu系统安装CodeX出现问题
linux·后端
改一下配置文件1 天前
Ubuntu24.04安装NVIDIA驱动完整指南(含Secure Boot解决方案)
linux
深紫色的三北六号2 天前
Linux 服务器磁盘扩容与目录迁移:rsync + bind mount 实现服务无感迁移(无需修改配置)
linux·扩容·服务迁移
SudosuBash2 天前
[CS:APP 3e] 关于对 第 12 章 读/写者的一点思考和题解 (作业 12.19,12.20,12.21)
linux·并发·操作系统(os)
哈基咪怎么可能是AI2 天前
为什么我就想要「线性历史 + Signed Commits」GitHub 却把我当猴耍 🤬🎙️
linux·github
十日十行3 天前
Linux和window共享文件夹
linux
木心月转码ing3 天前
WSL+Cpp开发环境配置
linux
张小潇4 天前
AOSP15 Input专题InputManager源码分析
android·操作系统
崔小汤呀4 天前
最全的docker安装笔记,包含CentOS和Ubuntu
linux·后端