在C语言程序开发中,常常需要将内存中的数据从地址A拷贝到地址B,虽说 CPU 访问内存的速度非常快,但是拷贝总归是要消耗 CPU 时间的。如果需要拷贝的数据比较长,那么拷贝动作将会消耗相当多的 CPU 时间,在此期间,CPU 不能做任何别的事情。
粗略来看,数据的拷贝过程并不复杂,无非就是寻址+写入数据,CPU 把时间花在处理这样的“简单重复劳动”上就太浪费了,因此,DMA 就被设计出来了。
DMA 简介
DMA 的英文全称是 direct memory access,直译过来就是“直接存储器存取”的意思,是计算机系统的一个特性。正如前文所讨论的,DMA 允许某些硬件子系统读写系统存储器,而不依赖于 CPU。简单来说,就是可以在不占用 CPU 时间的情况下,实现数据在存储器间传输(拷贝,移动等)。
在没有 DMA 的情况下,CPU 在处理数据的输入/输出时,通常会在数据读写器件完全被占用,因而无法执行其他工作。相反,如果系统有 DMA,CPU 只需完成数据传输的初始化,接下来的数据传输完全由 DMAC(DMA controller,DMA 控制器)实现,CPU 可以在数据传输过程中执行其他操作。
如果计算量很大,CPU 可能无法跟上数据传输的速率,那么 DMA 的存在可以让 CPU 专心处理数据的计算,而无需再抽空执行数据传输操作,这无疑可以提升系统的效率。另一方面,对于相对较慢的 I/O 数据,CPU 也无需再花时间等待数据传输完成。
如今 DMA 已被广泛用于各种硬件系统,包括磁盘驱动器控制器、显卡、网卡和声卡。DMA 还用于多核 CPU 中的芯片内数据传输。有 DMA 通道的计算机在传输数据时,CPU 开销要小得多。类似地,多核 CPU 内的处理元件可以在不占用 CPU 时间的情况下向本地存储器传输数据,从而允许并行进行计算和数据传输。