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

Memory 硬盘直接内存访问的目的是什么?,memory,io,system,cpu,blocking,Memory,Io,System,Cpu,Blocking,乍一看,让硬盘自己写入RAM似乎是个好主意,不需要CPU指令复制数据,特别是考虑到异步网络的成功。但on直接内存访问(DMA)说明: 使用DMA,CPU可以从这种开销中解脱出来,并可以在数据传输期间执行有用的任务(尽管CPU总线会被DMA部分阻塞) 我不明白公交线路怎么会被“部分封锁”。据推测,内存一次只能由一个设备访问,而CPU实际能做的有用工作似乎很少。在第一次尝试读取未缓存内存时,它会被阻止,我预计在2MB缓存的情况下,读取速度会非常快 释放CPU以完成其他任务的目标似乎是毫无意义的。硬盘

乍一看,让硬盘自己写入RAM似乎是个好主意,不需要CPU指令复制数据,特别是考虑到异步网络的成功。但on直接内存访问(DMA)说明:

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

我不明白公交线路怎么会被“部分封锁”。据推测,内存一次只能由一个设备访问,而CPU实际能做的有用工作似乎很少。在第一次尝试读取未缓存内存时,它会被阻止,我预计在2MB缓存的情况下,读取速度会非常快


释放CPU以完成其他任务的目标似乎是毫无意义的。硬盘DMA在实践中是否有助于提高性能?

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

无论如何,CPU总线上不会发生处理。CPU发出的指令可能会或可能不会触及内存。当它们这样做时,通常首先根据一级缓存解析,然后在尝试内存之前解析二级和三级缓存。因此,DMA传输不会阻塞处理


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

一个可能的性能提升可能来自计算机可以有多个DMA设备的事实。因此,使用DMA,您可以并行进行多个内存读取,而无需CPU执行所有开销

我不明白公交线路怎么会被“部分封锁”

在多个时钟周期的一段时间内,有些将被阻塞,有些则不会。引述:

问题2。什么是自行车盗窃?为什么要偷自行车

A2。当DMA设备向内存传输数据或从内存传输数据时,它将 (在大多数架构中)使用与CPU相同的总线 访问内存。如果CPU希望同时使用总线 作为DMA设备,CPU将暂停一个周期,因为 DMA设备具有更高的优先级。这对于预防疾病是必要的 使用小型DMA缓冲区进行溢出。(CPU永远不会出现溢出。)

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


即使在DMA块传输发生时CPU完全耗尽,也会比CPU必须坐在循环中向I/O设备转移字节或从I/O设备转移字节更快。

我不知道是否丢失了任何内容

假设我们没有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可以做一些不同的事情,比如:使用缓存做事情,但即使访问内存的其他部分,也要占用大量的时间

这是关键部分:由于其他设备的速度非常慢(与内存和CPU相比),数据传输的时间不是100%

尝试表示共享内存总线使用的示例(CPU访问时为C,DMA访问时为D)


正如您所见,内存一次只能访问一个设备。有时通过CPU,有时通过DMA控制器。DMA很少使用

如果您使用的是Linux,您可以通过使用hdparm禁用DMA来非常轻松地测试这一点。效果非常显著。

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的解决方案也可能存在,但它们仍然会遇到其他问题(例如,上面提到的缓存抖动)
Memory Bus ----CCCCCCCC---D----CCCCCCCCCDCCCCCCCCC----D