当前位置: 首页 > 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前,进程读取到它了,此时速度就很快。

        

       

相关文章:

  • IPv4 和 IPv6 是什么意思?它们之间的区别都有哪些?
  • C语言数据在内存中的存储
  • 【论文精读】DCRNN-扩散图卷积循环神经网络
  • PCL 多边形缩放操作
  • CentOS 7基础操作11_用户账号和组账号概述
  • Ubuntu的启动过程
  • 为何数据仓库需要“分层次”?
  • 常见排序算法,快排,希尔,归并,堆排
  • 免费插件集-illustrator插件-Ai插件-文本对象合并
  • Python爬虫要掌握哪些东西
  • 《手把手教你》系列练习篇之12-python+ selenium自动化测试(详细教程)
  • pottery,一个超酷的 Python 库!
  • 足球俱乐部管理系统的设计
  • 【TS】进阶
  • 19、Go Gin框架集成Swagger
  • [LeetCode] Wiggle Sort
  • [译]前端离线指南(上)
  • 【跃迁之路】【585天】程序员高效学习方法论探索系列(实验阶段342-2018.09.13)...
  • C++11: atomic 头文件
  • Druid 在有赞的实践
  • JavaScript学习总结——原型
  • js操作时间(持续更新)
  • Linux CTF 逆向入门
  • PHP 的 SAPI 是个什么东西
  • 官方新出的 Kotlin 扩展库 KTX,到底帮你干了什么?
  • 极限编程 (Extreme Programming) - 发布计划 (Release Planning)
  • 快速构建spring-cloud+sleuth+rabbit+ zipkin+es+kibana+grafana日志跟踪平台
  • 区块链技术特点之去中心化特性
  • 融云开发漫谈:你是否了解Go语言并发编程的第一要义?
  • 使用 @font-face
  • 通信类
  • 学习JavaScript数据结构与算法 — 树
  • 策略 : 一文教你成为人工智能(AI)领域专家
  • 继 XDL 之后,阿里妈妈开源大规模分布式图表征学习框架 Euler ...
  • #pragma data_seg 共享数据区(转)
  • #QT项目实战(天气预报)
  • #控制台大学课堂点名问题_课堂随机点名
  • (10)ATF MMU转换表
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • (Forward) Music Player: From UI Proposal to Code
  • (zt)最盛行的警世狂言(爆笑)
  • (附源码)ssm考生评分系统 毕业设计 071114
  • (免费领源码)Python#MySQL图书馆管理系统071718-计算机毕业设计项目选题推荐
  • (排序详解之 堆排序)
  • (五)关系数据库标准语言SQL
  • (一)VirtualBox安装增强功能
  • (转)jQuery 基础
  • * CIL library *(* CIL module *) : error LNK2005: _DllMain@12 already defined in mfcs120u.lib(dllmodu
  • .halo勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET Micro Framework初体验(二)
  • .Net Web项目创建比较不错的参考文章
  • /bin/bash^M: bad interpreter: No such file or directory
  • :O)修改linux硬件时间
  • ;号自动换行
  • @ 代码随想录算法训练营第8周(C语言)|Day57(动态规划)