零拷贝技术

传统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的吞吐量高的原因,也是由于零拷贝技术。
相关推荐
ragnwang3 小时前
解决 Ubuntu 安装 NVIDIA 固件时的包冲突问题
linux·运维·ubuntu
CC.GG4 小时前
【Linux】进程概念(四)(命令行参数和环境变量)
linux·运维·服务器
特种加菲猫7 小时前
自定义协议、序列化与守护进程:构建可靠后端服务
linux·网络·笔记
指尖@韶华7 小时前
【Kylin Linux root 密码故障处置指南(超限重试 + 改回原密码)】
linux·运维·kylin
Madison-No77 小时前
【Linux】 第一个系统程序——进度条
linux·运维·服务器
求你别吃了ど⁰̷̴͈꒨⁰̷̴͈う♡7 小时前
Linux给命令起别名
linux·运维·服务器
年度最佳学生7 小时前
【linux】解决selinux 导致的 systemctl code=exited, status=203/EXEC
linux·运维·服务器
Maple_land7 小时前
内建命令揭秘与环境变量全景:Linux变量体系的完整闭环
linux·运维·服务器·c++·centos
被遗忘的旋律.7 小时前
Linux驱动开发笔记(十三)——platform设备驱动
linux·驱动开发·笔记
沐怡旸7 小时前
【计算机通识】为什么有用户态和内核态之分?
操作系统