当前位置: 首页 > news >正文

零拷贝技术

背景

        磁盘可以说是计算机系统重最慢的硬件之一,读写速度相对内存10以上,所以针对优化磁盘的技术非常的多,比如:零拷贝、直接I/O、异步I/O等等,这些优化的目的就是为了提高系统的吞吐量,另外操作系统内核中的磁盘高速缓存区,也可以有效的减少磁盘的访问次数。

传统的数据传输方式

如果服务端提供数据传输功能,传统方式:将文件从磁盘上读取出来,然后通过网络协议写入,发送给客户端。

read(file, tmp_buf, len);
write(socket, tmp_buf, len);

其中涉及到的内部流程如下:

  • 第一次拷贝(DMA拷贝):把数据从磁盘上拷贝到操作系统内核缓冲区。
  • 第二次拷贝(CPU拷贝):把内核缓冲区的数据拷贝到用户缓冲区,此时我们的程序就可以使用读到的数据
  • 第三次拷贝(CPU拷贝):把用户缓冲区的数据再拷贝到内核的socket缓冲区(套接字缓冲区)。
  • 第四次拷贝(DMA拷贝):把内核的socket缓冲区数据拷贝到网卡缓冲区中。

零拷贝方式

  • 第一次拷贝(DMA拷贝):通过DMA技术将磁盘数据拷贝到内核缓冲区中。
  • 第二次拷贝(DMA拷贝):内核缓冲区的“描述符”+“长度”传到socket缓冲区,然后SG-DMA控制器可直接将内核缓冲区中的数据拷贝到网卡中。此过程不需要将内核缓冲区中的数据拷贝到socket缓冲区中,这样减少了一次数据拷贝。

总结

        零拷贝技术相对于传统文件传输,减少了2次上下文切换、2次CPU拷贝,最终只用2次上下文切换和2次DMA拷贝,不经过CPU拷贝

扩展

内核缓冲区实际上是磁盘高速缓存(PageCache),通常刚被访问的数据段时间内再次被访问的概率很高,于是我们可以用PageCache来缓存最近被访问的数据,,当空间不足时淘汰最久未被访问的缓存,所以读磁盘数据的时候,优先在PageCache中找,如果有就返回,没有则从磁盘读取,然后缓存在PageCache中。PageCache也具备预读功能。

例:假设read方法每次读取32kb字节,虽然read刚开始只读0~32kb的字节,但是内核会将后面的32~64KB也读取到PageCache,这样读取后面32~64kb的时候,如果在32~64kb数据被淘汰出PageCache前,进程读取到它了,此时速度就很快。

        

       

相关文章:

  • 【ROS2大白话】四、ROS2非常简单的传参方式
  • 2024.6.10刷题记录
  • HikariCP连接池初识
  • JavaSE面试
  • 安利一款非常不错浏览器文本翻译插件(效果很不错,值得一试)
  • Highcharts 条形图:数据可视化利器
  • redis常用设计模式
  • 个人vsCode配置文件<setting.js>
  • Nvidia/算能 +FPGA+AI大算力边缘计算盒子:电力巡检智能机器人
  • Elasticsearch:Open Crawler 发布技术预览版
  • 【软考的系统分析师的考题考点解析2025】
  • idm究竟有哪些优势
  • 爬山算法的详细介绍
  • 【Vue】项目创建目录初始化
  • 网络学习(二)DNS域名解析原理、DNS记录
  • 电商项目-day01
  • C++必修:探索C++的内存管理
  • linux 启动minio.rpm , minio服务启动
  • ffmpeg将一个视频中的音频合并到另一个视频
  • Linux Kernel入门到精通系列讲解(RV-Kernel 篇) 5.3 从零移植 busybox,基于RISC-V
  • 赵心童世锦赛历史性夺冠,你今天打斯诺克很可能订不到位
  • 人民日报今日谈:以青春之我,赴时代之约
  • 韩国经济副总理崔相穆宣布辞职
  • 国际著名学者Charles M. Lieber全职受聘清华深圳国际研究生院
  • 解放日报:抢占科技制高点,赋能新质生产力
  • 近七成科创板公司2024年营收增长,285家营收创历史新高