当前位置: 首页 > 科技观察

系统CPU效率高,得益于DMA技术!

时间:2023-03-19 18:05:54 科技观察

大家好,我是树哥。相信大家在学习Kafka的时候,一定会问:为什么Kafka这么快?很多朋友会回答是因为零拷贝技术。而说到Zero-copy,就会谈到DMA技术。但DMA技术到底是什么?它的诞生背景是什么?它解决了什么问题?估计很多人不知道。今天就带大家来一盘DMA技术吧!什么是DMA?DMA,全称是DirectMemoryAccess,即直接内存访问。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(DMAControllerDMAController)和I/O设备上的DMAC芯片。通过在每个I/O设备上加一个DMAC芯片,以网卡为例,用户发送数据。数据映射到内核后,CPU只需要告诉DMAC芯片“我”要发xxx数据,打算发到哪里去,帮我做,CPU就可以去继续了做其他事情。DMA最有价值的地方就是当要传输的数据特别大,要求速度特别快的时候,可以有效的减少CPU的阻塞时间。目前,包括磁盘控制器、网卡、显卡和声卡在内的大多数硬件设备都支持DMA技术。通过DMA和虚拟内存技术,我们达到了ZeroCopy的目的。在IO设备和用户程序空间之间的数据传输过程中,减少了数据副本的数量,减少了系统调用,CPU参与为零,完全消除了该区域的CPU负载。.总结所谓DMA(DirectMemoryAccess)其实是一种硬件技术,其主要目的是在大数据传输时减少CPU的消耗,从而提高CPU的利用效率。它本质上是主板和IO设备上的DMAC芯片。通过调度DMAC,CPU可以不参与从磁盘缓冲区到内核缓冲区的数据传输消耗,从而提高效率。参考资料前面的部分没问题!【STM32】DMA的原理,步骤超级详细详细,一篇看懂DMA_Z小轩的博客-CSDN博客_dmastm32VIP!好的!“零拷贝”的硬件基石——DMA到底是什么,它是如何工作的?-墨天轮画的不错!贵宾!什么是DMA技术及其用途?看完肯定有收获-关于DMA(Directmemoryaccess)的简单书籍比较通俗易懂-腾讯云开发者社区-腾讯云