系统 CPU 效率高,DMA 技术功不可没!

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

​大家好,我是树哥。

相信大家在学习 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 中断方式的数据传输流程

  • 用户进程向 CPU 发起 read 系统调用读取数据,由用户态切换为内核态,然后一直阻塞等待数据的返回。
  • CPU 在接收到指令以后对磁盘发起 I/O 请求,将磁盘数据先放入磁盘控制器缓冲区。
  • 数据准备完成以后,磁盘向 CPU 发起 I/O 中断。
  • CPU 收到 I/O 中断以后将磁盘缓冲区中的数据拷贝到内核缓冲区,然后再从内核缓冲区拷贝到用户缓冲区。

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

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

图片

DMA 方式的数据传输流程

  • 用户进程向 CPU 发起 read 系统调用读取数据,由用户态切换为内核态,然后一直阻塞等待数据的返回。
  • CPU 在接收到指令以后对 DMA 磁盘控制器发起调度指令。
  • DMA 磁盘控制器对磁盘发起 I/O 请求,将磁盘数据先放入磁盘控制器缓冲区,CPU 全程不参与此过程。
  • 数据读取完成后,DMA 磁盘控制器会接受到磁盘的通知,将数据从磁盘控制器缓冲区拷贝到内核缓冲区。
  • DMA 磁盘控制器向 CPU 发出数据读完的信号,由 CPU 负责将数据从内核缓冲区拷贝到用户缓冲区。
  • 用户进程由内核态切换回用户态,解除阻塞状态,然后等待 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)比较通俗浅白的理解 - 腾讯云开发者社区 - 腾讯云​
责任编辑:武晓燕 来源: 树哥聊编程
相关推荐

2016-05-23 16:06:25

软件IC网

2014-05-09 14:43:31

思科人才培养思科

2010-04-26 15:08:47

Oracle repo

2015-11-02 11:05:57

流量网络终端应用

2016-07-07 13:34:10

IBMPOWER LINUX

2010-12-20 09:04:47

2013-11-15 14:47:22

IE11微软网络安全

2019-02-14 12:41:54

程序员开发互联网

2012-01-06 10:32:33

2022-01-12 08:57:45

网络攻击漏洞Log4j

2018-07-18 13:33:38

大数据

2018-09-20 11:17:21

超融合

2012-06-20 10:04:11

Evernote

2011-09-13 09:57:25

谷歌云计算

2011-04-06 14:20:50

Java编程

2011-04-13 09:13:02

Java内存

2012-05-09 13:20:00

Win7

2012-03-12 11:48:44

惠普激光打印机

2023-07-26 07:02:04

点赞
收藏

51CTO技术栈公众号