大家好,我是树哥。

相信大家在学习 Kafka 的时候,都会被问到:为啥 Kafka 这么快?许多朋友都会回答是因为 zero-copy 技术。而一说到 Zero-copy 就会说到 DMA 技术。

但 DMA 技术到底是啥?它诞生的背景是什么?它解决了什么问题?估计很多人就不知道了。今天就让我带大家盘一盘 DMA 技术!

什么是 DMA?

DMA,全称 Direct Memory Access,即直接存储器访问。

DMA 传输将数据从一个地址空间复制到另一个地址空间,提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。

从 DMA 的定义我们可以知道,其主要是用来传输数据,并且是在外设和存储器或者存储器与存储器之间传输数据。

那为啥要通过 DMA 来进行传输数据呢?

原因是:之前传输数据需要 CPU 参与,在大量数据传输时会消耗 CPU 资源。

因此为了提升 CPU 利用率,出现了 DMA 技术,即直接让内存与磁盘进行数据传输。

在 DMA 技术出现之前,Linux 通过 I/O 中断的方式来传输数据,其流程如下图所示:

IO 中断方式的数据传输流程
  1. 用户进程向 CPU 发起 read 系统调用读取数据,由用户态切换为内核态,然后一直阻塞等待数据的返回。

  2. CPU 在接收到指令以后对磁盘发起 I/O 请求,将磁盘数据先放入磁盘控制器缓冲区。

  3. 数据准备完成以后,磁盘向 CPU 发起 I/O 中断。

  4. CPU 收到 I/O 中断以后将磁盘缓冲区中的数据拷贝到内核缓冲区,然后再从内核缓冲区拷贝到用户缓冲区。

  5. 用户进程由内核态切换回用户态,解除阻塞状态,然后等待 CPU 的下一个执行时间钟。

从上述流程可以看到,CPU 需要参与到「磁盘缓冲区拷贝到内核缓冲区」、「内核缓冲区拷贝到用户缓存区」这两个过程,极大地消耗了 CPU 资源。但有了 DMA 技术之后,其过程变成了这样:

DMA 方式的数据传输流程
  1. 用户进程向 CPU 发起 read 系统调用读取数据,由用户态切换为内核态,然后一直阻塞等待数据的返回。

  2. CPU 在接收到指令以后对 DMA 磁盘控制器发起调度指令。

  3. DMA 磁盘控制器对磁盘发起 I/O 请求,将磁盘数据先放入磁盘控制器缓冲区,CPU 全程不参与此过程。

  4. 数据读取完成后,DMA 磁盘控制器会接受到磁盘的通知,将数据从磁盘控制器缓冲区拷贝到内核缓冲区。

  5. DMA 磁盘控制器向 CPU 发出数据读完的信号,由 CPU 负责将数据从内核缓冲区拷贝到用户缓冲区。

  6. 用户进程由内核态切换回用户态,解除阻塞状态,然后等待 CPU 的下一个执行时间钟。

仔细对比加入 DMA 技术之后的数据传输流程,我们可以发现 DMA 技术优化了数据从磁盘缓冲区拷贝到内核缓冲区这个过程,减少了这个过程里 CPU 的参与。

实现原理

我们知道数据传输本质上还是需要 CPU 去处理的,那 DMA 技术怎么实现不需要 CPU 参与就能实现数据传输呢?

虽然我并没有仔细地看过 DMA 的实现原理,但可以大胆预测的是:其实 DMA 技术还是有用 CPU,只不过其没有用服务器的 CPU,而是自己配了一个计算单元,专门用于做数据传输。这就有点像 CPU 既可以做普通计算又可以做图形计算一样,但因为图形渲染太复杂,于是搞出来了个 GPU 专门做图形渲染一样。

DMA 本质是就是一个硬件技术,其实际样子是主板上的一个芯片,即 DMAC (DMA Controller DMA 控制器)以及 I/O 设备上的 DMAC 芯片。

通过在各个 I/O 设备上都加了 DMAC 芯片,以网卡为例,用户发送数据,当数据被映射到内核后,CPU 只需要告诉 DMAC 这个芯片,「我」要发 xxx 数据,打算发到哪里去,你帮我去做吧,然后 CPU 就可以走了,继续做其它事情。

DMA 最有价值的地方体现在当要传输的数据特别大、还要求速度特别快的时候,可以有效减少 CPU 的阻塞时间。

目前大多数的硬件设备,包括磁盘控制器、网卡、显卡以及声卡等都支持 DMA 技术。通过 DMA 和虚拟内存技术,我们实现了 Zero Copy 的目标,IO 设备跟用户程序空间传输数据的过程中,减少数据拷贝次数,减少系统调用,实现 CPU 的零参与,彻底消除 CPU 在这方面的负载。

总结

所谓的 DMA(Direct Memory Access,即直接存储器访问)其实是一个硬件技术,其主要目的是减少大数据量传输时的 CPU 消耗,从而提高 CPU 利用效率。其本质上是一个主板和 IO 设备上的 DMAC 芯片。CPU 通过调度 DMAC 可以不参与磁盘缓冲区到内核缓冲区的数据传输消耗,从而提高效率。

参考资料

  • 前面部分讲的还可以!【STM32】 DMA 原理,步骤超细详解,一文看懂 DMA_Z 小旋的博客 - CSDN 博客_dma stm32

  • VIP!不错!“零拷贝” 的硬件基石 ——DMA 到底是个什么东西,它是如何工作的?- 墨天轮

  • 图画得不错!VIP!DMA 技术是什么,在哪里用?看完绝对有收获 - 简书

  • 关于 DMA(Direct memory access)比较通俗浅白的理解 - 腾讯云开发者社区 - 腾讯云


推荐阅读

  • PlantUML 入门教程:像写代码一样画图

  • JVM 的栈上分配、TLAB、PLAB 有啥区别?

  • 一文讲清楚 JVM Safe Point 到底是啥!

  • 这个国庆,我去佛山看舞狮,太惊艳!

  • 深入理解 ForkJoinPool:入门、使用、原理

  • 学习性能优化,如何模拟各种故障场景?

  • 深入理解美团 Leaf 发号器开源方案

  • 平均负载与 CPU 使用率,到底有啥区别?

  • 如何设计一个短链服务?

  • MySQL 不同隔离级别,都使用了什么锁?

  • 怒啃 24 小时,终于搞懂上下文切换!

  • 有了 HTTP,为什么还要 RPC?

  • 太极限了,JDK 的这个 BUG 都能被我踩到!

系统 CPU 效率高,DMA 技术功不可没!相关推荐

  1. 面试官:生产环境碰到系统CPU飙高和频繁GC,你要怎么排查?

    点击上方"小哈学Java",选择"星标" 回复"666",领取100G独家整理的学习资料哟~ 来源:http://t.cn/EI9JdBu ...

  2. 面试官:生产环境碰到系统CPU飙高和频繁GC,你要怎么排查? 白天不懂夜的黑

    处理过线上问题的同学基本上都会遇到系统突然运行缓慢,CPU 100%,以及Full GC次数过多的问题.当然,这些问题的最终导致的直观现象就是系统运行缓慢,并且有大量的报警.本文主要针对系统运行缓慢这 ...

  3. 面试官问:平时碰到系统CPU飙高和频繁GC,你会怎么排查?

    点击上方"方志朋",选择"设为星标" 做积极的人,而不是积极废人 处理过线上问题的同学基本上都会遇到系统突然运行缓慢,CPU 100%,以及Full GC次数过 ...

  4. UGUI的优点新UI系统三效率高效果好

    UGUI的优点新UI系统三效率高效果好 通过对批处理(batching).纹理图集(texture atlasing)和新的canvas组件的支持,新UI系统提供了一个经过优化的解决方案,使得开发者添 ...

  5. 生产环境碰到系统CPU飙高和频繁GC,你要怎么排查?

    处理过线上问题的同学基本上都会遇到系统突然运行缓慢,CPU 100%,以及Full GC次数过多的问题.当然,这些问题的最终导致的直观现象就是系统运行缓慢,并且有大量的报警.本文主要针对系统运行缓慢这 ...

  6. 必备面试题:系统CPU飙高和GC频繁,如何排查?

    来源:http://t.cn/EI9JdBu 处理过线上问题的同学基本上都会遇到系统突然运行缓慢,CPU 100%,以及Full GC次数过多的问题.当然,这些问题的最终导致的直观现象就是系统运行缓慢 ...

  7. 执行计划中cpu耗时_面试被问怎么排查遇到的系统CPU飙高和频繁GC,到底该怎么回答?...

    处理过线上问题的同学基本上都会遇到系统突然运行缓慢,CPU 100%,以及Full GC次数过多的问题.当然,这些问题的最终导致的直观现象就是系统运行缓慢,并且有大量的报警.本文主要针对系统运行缓慢这 ...

  8. JVM优化之系统CPU飙高和GC频繁

    本文来说下JVM优化之系统CPU飙高和GC频繁 文章目录 概述 Full GC次数过多 CPU过高 某个线程进入WAITING状态 死锁 本文小结 概述 处理过线上问题的同学基本上都会遇到系统突然运行 ...

  9. cpu占用高 本地服务器,win10系统服务主机本地系统cpu占用高的解决方法

    很多小伙伴都遇到过win10系统服务主机本地系统cpu占用高的困惑吧,一些朋友看过网上零散的win10系统服务主机本地系统cpu占用高的处理方法,并没有完完全全明白win10系统服务主机本地系统cpu ...

最新文章

  1. python写好的代码怎么给别人使用-10分钟学会用python写游戏!Python其实很简单!...
  2. Linux下基于Libmad库的MP3音乐播放器编写
  3. 传说中的WCF(6):数据协定(b)
  4. 【读书笔记】.Net并行编程高级教程--Parallel
  5. c语言字符型计算器,求用c语言编程四则混合运算计算器?
  6. 易语言源代码毁来者来了!!
  7. contenttype添加field
  8. 线上故障快速定位及恢复
  9. angularjs的基础知识
  10. spring aop 会根据实际情况(有无接口)自动选择 两种 动态代理(jdk和cglib)之一...
  11. web.xml文件中的web-app元素 部署
  12. Android攻城狮——五布局
  13. poythoncode-实战3--判断输入参数--过滤条件
  14. 使用企业微信做微信消息通知
  15. dk 图解计算机科学pdf,DK英语:7套DK经典图解词典,再也不用死记硬背了!
  16. 《人生十论》. 钱穆
  17. Mac上关闭Microsoft AutoUpdate的升级弹窗
  18. 资深工程师,专家,研究员等进阶
  19. 生产计划管理软件有哪些?哪个好
  20. 阻容感基础10:电感器分类(4)-变压器

热门文章

  1. 基于 Hessian 轻量级远程调用的原理及示例
  2. 【评测】人肝脏细胞转染实验操作
  3. 用计算机弹出黎明的黑暗,STEAM打开黎明杀机启动游戏后弹出计算机丢失msvcp140period;dllperiod; | 手游网游页游攻略大全...
  4. 记一次redis遭受挖矿脚本攻击
  5. 80后女孩如何预防皱纹的产生
  6. python实现城市气候与海洋的关系研究
  7. Unity——FariyGUI
  8. 【网络爬虫】python中的数据解析工具(re,bs4,xpath,pyquery)
  9. 【生活分享】《哈姆雷特》· 苏州站 - 一次有趣的音乐剧体验
  10. 享趣闻 | 神秘感十足的5个博物馆,其中一个还是在水上?