引言

传统的 Linux 操作系统的标准 I/O 接口是基于数据拷贝操作的,即 I/O 操作会导致数据在操作系统内核地址空间的缓冲区和应用程序地址空间定义的缓冲区之间进行传输。这样做最大的好处是可以减少磁盘 I/O 的操作,因为如果所请求的数据已经存放在操作系统的高速缓冲存储器中,那么就不需要再进行实际的物理磁盘 I/O 操作。但是数据传输过程中的数据拷贝操作却导致了极大的 CPU 开销,限制了操作系统有效进行数据传输操作的能力。

零拷贝( zero-copy )技术可以有效地改善数据传输的性能,在内核驱动程序(比如网络堆栈或者磁盘存储驱动程序)处理 I/O 数据的时候,零拷贝技术可以在某种程度上减少甚至完全避免不必要 CPU 数据拷贝操作。

什么是零拷贝?

零拷贝就是一种避免 CPU 将数据从一块存储拷贝到另外一块存储的技术。针对操作系统中的设备驱动程序、文件系统以及网络协议堆栈而出现的各种零拷贝技术极大地提升了特定应用程序的性能,并且使得这些应用程序可以更加有效地利用系统资源。这种性能的提升就是通过在数据拷贝进行的同时,允许 CPU 执行其他的任务来实现的。

零拷贝技术可以减少数据拷贝和共享总线操作的次数,消除传输数据在存储器之间不必要的中间拷贝次数,从而有效地提高数据传输效率。而且,零拷贝技术减少了用户应用程序地址空间和操作系统内核地址空间之间因为上下文切换而带来的开销。进行大量的数据拷贝操作其实是一件简单的任务,从操作系统的角度来说,如果 CPU 一直被占用着去执行这项简单的任务,那么这将会是很浪费资源的;如果有其他比较简单的系统部件可以代劳这件事情,从而使得 CPU 解脱出来可以做别的事情,那么系统资源的利用则会更加有效。综上所述,零拷贝技术的目标可以概括如下:

避免数据拷贝

①避免操作系统内核缓冲区之间进行数据拷贝操作。

②避免操作系统内核和用户应用程序地址空间这两者之间进行数据拷贝操作。

③用户应用程序可以避开操作系统直接访问硬件存储。

④数据传输尽量让 DMA 来做。

将多种操作结合在一起

①避免不必要的系统调用和上下文切换。

②需要拷贝的数据可以先被缓存起来。

③对数据进行处理尽量让硬件来做。

零拷贝原理

1.io读写的方式

1.1中断

1.2DMA

2.中断方式

2.1中断方式的流程图如下:

①用户进程发起数据读取请求

②系统调度为该进程分配cpu

③cpu向io控制器(ide,scsi)发送io请求

④用户进程等待io完成,让出cpu

⑤系统调度cpu执行其他任务

⑥数据写入至io控制器的缓冲寄存器

⑦缓冲寄存器满了向cpu发出中断信号

⑧cpu读取数据至内存

2.2缺点:中断次数取决于缓冲寄存器的大小

3.DMA : 直接内存存取

3.1DMA方式的流程图如下:

①用户进程发起数据读取请求

②系统调度为该进程分配cpu

③cpu向DMA发送io请求

④用户进程等待io完成,让出cpu

⑤系统调度cpu执行其他任务

⑥数据写入至io控制器的缓冲寄存器

⑦DMA不断获取缓冲寄存器中的数据(需要cpu时钟)

⑧传输至内存(需要cpu时钟)

⑨所需的全部数据获取完毕后向cpu发出中断信号

3.2优点:减少cpu中断次数,不用cpu拷贝数据

4.数据拷贝

4.1下面展示了 传统方式读取数据后并通过网络发送 所发生的数据拷贝:

①一个read系统调用后,DMA执行了一次数据拷贝,从磁盘到内核空间

②read结束后,发生第二次数据拷贝,由cpu将数据从内核空间拷贝至用户空间

③send系统调用,cpu发生第三次数据拷贝,由cpu将数据从用户空间拷贝至内核空间(socket缓冲区)

④send系统调用结束后,DMA执行第四次数据拷贝,将数据从内核拷贝至协议引擎

⑤另外,这四个过程中,每个过程都发生一次上下文切换

4.2内存缓冲数据,主要是为了提高性能,内核可以预读部分数据,当所需数据小于内存缓冲区大小时,将极大的提高性能。

4.3零拷贝是为了消除这个过程中冗余的拷贝

5.零拷贝-sendfile 对应到java中

FileChannel.transferTo(long position, long count, WritableByteChannel target)//将数据从文件通道传输到了给定的可写字节通道

5.1避免了第2,3步的数据拷贝,参考下图:

①DMA从拷贝至内核缓冲区

②cpu将数据从内核缓冲区拷贝至内核空间(socket缓冲区)

③DMA将数据从内核拷贝至协议引擎

④这三个过程中共发生2次上下文切换,分别为发起读取文件和发送数据

5.2以上过程发生了三次数据拷贝,其中有一次为cpu完成

5.3linux内核2.4以后,socket缓冲区做了调整,DMA带收集功能,如下图:

①DMA从拷贝至内核缓冲区

②将数据的位置和长度的信息的描述符增加至内核空间(socket缓冲区)

③DMA将数据从内核拷贝至协议引擎

6.零拷贝-mmap 对应到java中

MappedByteBuffer//文件内存映射

6.1数据不会复制到用户空间,只在内核空间,与sendfile类似,但是应用程序可以直接操作该内存。

零拷贝 zero-copy 原理相关推荐

  1. 【转】零拷贝的实现原理

    原文:蚂蚁二面,面试官问我零拷贝的实现原理,当场懵了- 架构师社区 以下文章来源于占小狼的博客 ,作者占小狼 链接:https://mp.weixin.qq.com/s/xA5irZwZL-ryw0q ...

  2. 对于 Netty ByteBuf 的零拷贝(Zero Copy) 的理解

    根据 Wiki 对 Zero-copy 的定义: "Zero-copy" describes computer operations in which the CPU does n ...

  3. 蚂蚁金服二面:面试官问我零拷贝的实现原理,当场跪。。。

    本文来源:占小狼的博客 "狼哥,面试又跪了,碰到了知识盲区" "哪个?" "一面还可以,二面面试官问我零拷贝的原理,懵逼了...这块内容没去研究过&q ...

  4. Linux I/O原理和零拷贝Zero-copy技术全面揭秘

    目录 导言 计算机存储器 物理内存 虚拟内存 静态重定位 存储器抽象 交换(swapping)技术 虚拟内存技术 用户态和内核态 Linux I/O I/O 缓冲区 I/O 模式 程序控制 I/O 中 ...

  5. Linux 零拷贝方案

    一 什么是零拷贝(zero copy)? 零拷贝有什么优点? 1.1 什么是零拷贝? 零拷贝: 指的是在I/O过程中,用户空间和内核空间不需要进行CPU数据拷贝.零拷贝并不是指I/O过程中一次拷贝都没 ...

  6. 零拷贝( Zero-copy )

    一.背景 " 零拷贝" 描述了计算机操作,其中CPU 不执行将数据从 一个存储区 复制到 另一个存储区 的任务.通过网络传输文件时,通常用于节省CPU周期和内存带宽. 在传统的 L ...

  7. Linux Zero-copy零拷贝技术:源码示例

    <Linux Zero-copy零拷贝技术:源码示例> <Linux Zero-copy零拷贝技术全面揭秘> <什么是mmap?零拷贝?DMA?> <Linu ...

  8. Kafka和RocketMQ底层存储:零拷贝技术

    零拷本相关 <[转]零拷贝的实现原理> <[转]零拷贝的实现原理> <搞懂Linux零拷贝,DMA> <通过零拷贝进行有效的数据传输(java.c)> ...

  9. 什么是mmap?零拷贝?DMA?

    <Linux Zero-copy零拷贝技术全面揭秘> <什么是mmap?零拷贝?DMA?> <Linux C语言:用零拷贝技术实现TCP代理(源代码+测试服务端客户端代码 ...

  10. linux I/O--IO原理和几种零拷贝机制(五)

    前言 零拷贝(Zero-copy)技术指在计算机执行操作时,CPU 不需要先将数据从一个内存区域复制到另一个内存区域,从而可以减少上下文切换以及 CPU 的拷贝时间.它的作用是在数据报从网络设备到用户 ...

最新文章

  1. 【系统平台】模拟器-通道-模型-图形配置
  2. php中 可替代curl,laravel-PHP-为什么使用Guzzle代替cURL?
  3. [WPF]静态资源(StaticResource)和动态资源(DynamicResource)
  4. Razor传值到js
  5. 16.1 用auth0服务 实现用登录和管理 使用auth版本的2个大坑。
  6. spring mvc学习(8):springmvc常用注解代码
  7. testng连接MySQL_Selenium+TestNG实战-8-连接数据库方法去验证文章是否发布
  8. 使用csc手动编译cs文件
  9. qt 旋转后的三维坐标_OpenGL + Qt: 3 - 旋转动画和键盘操纵
  10. Unity3D丨面试题目
  11. 卫星电话是直接与卫星通信还是通过地面站?
  12. 大学计算机基础教程第13章数据库技术基础
  13. 如何搭建自己的wiki
  14. matlab cftool光滑曲线导出为什么就不光滑了_不会吧,还有人不知道MATLAB这8个小技巧?...
  15. CAD如何编辑多段线的顶点信息
  16. 基于SSM体育竞赛运动会成绩管理系统JAVA毕业设计源码介绍
  17. mysql查询的金额保留两位小数_mysql查询结果单位换算后保留两位小数
  18. Tableau阈值设置及其使用
  19. RF 电路设计中的常见问题及解决方案
  20. 2017衢州联赛第四题题解

热门文章

  1. Ansible — 编程 — Variables
  2. 如何实现分享链接到微信朋友圈时显示自定义LOGO以及名称介绍
  3. 浅谈云服务器都能用来做什么?
  4. 博客作业01-抽象数据类型
  5. 单点登录 - 修改CAS服务器的一些配置( 陆续添加)
  6. SVM学习笔记5-SMO
  7. expressjs路由匹配规则
  8. QCon上海2015十大热点
  9. iOS中的正则表达式[转]
  10. leetcode解题报告:198 House Robber