乍一看,让硬盘独立写入RAM而没有CPU指令复制数据似乎是一个好主意,特别是考虑到异步网络的成功。但直接内存访问(DMA)上的Wikipedia article表明了这一点:
使用DMA,CPU可以从这个开销中解脱出来,并且可以在数据传输期间执行有用的任务(尽管DMA总线部分阻塞)。
我不明白公交线路是如何“部分阻挡”的。据推测,当时一个设备可以访问内存,然后看起来CPU实际上没有什么有用的工作。它会在第一次尝试读取未缓存的内存时被阻止,我预计在2 mb缓存的情况下会非常快。
释放CPU来执行其他任务的目标似乎是无偿的。硬盘DMA是否会在实践中促进任何性能提升?
答案 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来轻松测试。效果是戏剧性的。