硬盘直接内存访问的目的是什么?

时间:2010-09-15 10:42:00

标签: memory io system cpu blocking

乍一看,让硬盘独立写入RAM而没有CPU指令复制数据似乎是一个好主意,特别是考虑到异步网络的成功。但直接内存访问(DMA)上的Wikipedia article表明了这一点:

  

使用DMA,CPU可以从这个开销中解脱出来,并且可以在数据传输期间执行有用的任务(尽管DMA总线部分阻塞)。

我不明白公交线路是如何“部分阻挡”的。据推测,当时一个设备可以访问内存,然后看起来CPU实际上没有什么有用的工作。它会在第一次尝试读取未缓存的内存时被阻止,我预计在2 mb缓存的情况下会非常快。

释放CPU来执行其他任务的目标似乎是无偿的。硬盘DMA是否会在实践中促进任何性能提升?

7 个答案:

答案 0 :(得分:6)

1:PIO(编程IO)使CPU缓存崩溃。大多数情况下,从磁盘读取的数据不会立即处理。应用程序通常以大块读取数据,但PIO以较小的块(通常为64K IIRC)完成。因此,数据读取应用程序将等待直到大块已经传输,并且在从控制器取出之后不会从缓存中的较小块中受益。同时,其他应用程序将受到传输驱逐的大部分缓存的影响。这可以通过使用特殊指令来避免,这些指令指示CPU不要缓存数据,而是“直接”将其写入主存储器,但是我很确定这会降低复制循环的速度。因而受到的影响甚至超过了缓存捶打。

2:PIO,因为它在x86系统上实现,可能是大多数其他系统,与DMA相比真的很慢。问题不在于CPU不够快。问题源于总线和磁盘控制器的PIO模式的设计方式。如果我没弄错的话,CPU必须从所谓的IO端口读取每个字节(或使用32位PIO模式时的每个DWORD)。这意味着对于每个DWORD数据,端口的地址必须放在总线上,控制器必须通过将数据DWORD放在总线上来响应。然而,当使用DMA时,控制器可以利用总线和/或存储器控制器的全部带宽来传输突发数据。当然,优化这种传统PIO设计还有很大的空间。 DMA传输就是这样的优化。其他仍然被认为是PIO的解决方案也是可能的,但是它们仍然会遇到其他问题(例如上面提到的缓存抖动)。

3:内存和/或总线带宽不是大多数应用程序的限制因素,因此DMA传输不会停止任何操作。它可能会减慢一些应用程序的速度,但通常它几乎不会引起注意。在所有磁盘与总线和/或存储器控制器的带宽相比相当慢之后。提供>的“磁盘”(SSD,RAID阵列)。 500 MB / s真的很快。总线或内存子系统至少不能提供10倍的数量,必须来自石器时代。 OTOH PIO在传输数据块时完全停止了CPU。

答案 1 :(得分:5)

我不知道我是否遗漏了什么。

假设我们没有DMA控制器。从“慢”设备到内存的每次传输都是针对CPU的循环

ask_for_a_block_to_device 
wait_until_device_answer (or change_task_and_be_interrupted_when_ready)
write_to_memory

因此CPU必须自己编写内存。块大块。

是否有必要使用CPU进行内存传输?不。我们使用另一种设备(或像DMA总线主控那样的机制)将数据传输到存储器或从存储器传输数据。

与此同时,CPU可能会做一些不同的事情:用缓存做事,甚至在很大一部分时间内访问内存的其他部分。

这是至关重要的部分:数据不会100%被传输,因为其他设备非常慢(与内存和CPU相比)。

尝试表示共享内存总线使用的示例(当CPU接收时,C,当被DMA接收时为C)

Memory Bus ----CCCCCCCC---D----CCCCCCCCCDCCCCCCCCC----D

正如您所看到的,内存一次只能加入一个设备。有时由CPU,有时由DMA控制器。 DMA很少次。

答案 2 :(得分:4)

  

我不明白公交线路如何“部分阻挡”

在许多时钟周期的一段时间内,有些将被阻止,有些则不会。引用University of Melbourne

  

Q2。什么是偷车?为什么会有偷车的周期?

     

A2。当DMA设备向内存或从内存传输数据时,它将会   (在大多数架构中)使用与CPU相同的总线   访问内存。如果CPU想要同时使用总线   作为DMA设备的时间,CPU将停止一个周期,因为   DMA设备具有更高的优先级。这是必要的,以防止   带有小DMA缓冲区的溢出。 (CPU永远不会出现超支。)

     

大多数现代CPU都有满足大多数内存引用的缓存   无需通过总线进入主存。因此DMA   对他们的影响要小得多。

即使在发生DMA块传输时CPU完全没有占用,也会比CPU必须在一个循环中将字节移入/移出I / O设备更快地发生。

答案 3 :(得分:3)

磁盘控制器通常具有特殊的块传输指令,可以实现快速数据传输。它们还可以以突发方式传输数据,允许交叉的CPU总线访问。 CPU也倾向于以突发方式访问内存,缓存控制器在缓存行可用时填充缓存行,因此即使CPU可能被阻塞,最终结果只是缓存使用率下降,CPU实际上并没有停止。 / p>

答案 4 :(得分:3)

计算机可以拥有多个DMA设备,这可能会带来一个性能提升。因此,使用DMA,您可以并行进行多次内存读取,而CPU不必执行所有开销。

答案 5 :(得分:0)

无论如何都不会在CPU总线上进行处理。 CPU的发出指令可能会或可能不会触及内存。当它们这样做时,它们通常首先针对L1缓存进行解析,然后在尝试内存之前解析L2和L3。因此,DMA传输不会阻止处理。

即使CPU和DMA传输都需要内存,预计它们也不会访问内存中的相同字节。事实上,内存控制器可能同时处理这两个请求。

答案 6 :(得分:0)

如果您使用的是Linux,则可以通过使用hdparm禁用DMA来轻松测试。效果是戏剧性的。