使用DMA时,CPU是否完全冻结?


19

我有一个非常简单的问题,但是我找不到任何答案。

在代码和数据位于同一RAM中的Von-Neumann系统上,CPU必须从内存中提取所有指令。现在,为了在计算机组件之间移动大量数据,有一个直接内存访问控制器,该控制器允许外设访问主系统RAM。

我的问题是这样的:如果DMA允许在硬盘和RAM之间(可能很长)进行数据传输,这是否意味着CPU无法使用RAM,因此无法获取其下一条指令?

简而言之,DMA旨在代替仲裁所有I / O读写的处理器,以释放处理器以执行其他操作。但是,如果它不能从RAM中获取指令,那么它还是没有被释放。

我在这里缺少一些细节吗?

谢谢


7
是。DMA很少在内存的全部带宽上运行。它只是时不时地窃取一个周期(或一个周期的突发),这受I / O设备的速率控制。
戴夫·特威德

Amiga家用计算机通过观察所使用的CPU实际上仅访问总线两个周期来解决此问题,然后在仍以全速运行时,在总线上停留了两个周期。基于DMA的外围设备(图形,音频,磁盘)使用了两者之间的周期。因为问题是假设性的,并且计算机总是被实用的细节所破坏,所以不能回答您的问题。:)
管道

2
@pipe:听起来不对。Amiga使用的M68K CPU具有完全异步的总线。您可能会想到Apple II,它利用了它的6502 CPU仅在每个时钟周期的一半使用总线,而将另一半用于视频输出这一事实,这也有助于保持DRAM的刷新。
戴夫·特威德

4
现代CPU的缓存平均可解决95%的内存访问。只要CPU不需要RAM,DMA就不会干扰。
MSalters '16

2
@DaveTweed不。如果您查看68000的总线时序,则每个“总线周期”(读或写)均分为8个状态,至少需要4个实际时钟周期,其中只有一部分驱动数据总线。但是,这种多路复用确实需要一些额外的硬件,因为它一直在驱动地址总线。
管道

Answers:


18

您是正确的,在DMA传输期间CPU无法访问内存。但是,有两个因素共同允许CPU和执行DMA传输的设备进行明显的并行内存访问:

  • CPU需要多个时钟周期来执行一条指令。一旦提取了指令(可能需要一个或两个周期),它通常就可以执行整个指令而无需进行进一步的内存访问(除非它是本身访问内存的mov指令,例如带有间接操作数的指令)。
  • 执行DMA传输的设备明显比CPU速度慢,因此CPU不需要在每条指令上都暂停,而只是在DMA设备正在访问内存时才暂停。

结合这两个因素,意味着执行DMA传输的设备对CPU速度的影响很小。

编辑:忘记提及还有CPU高速缓存的因素,只要CPU正在执行的代码在高速缓存中,它就不需要访问实际内存来获取指令,因此DMA传输不会进行进行操作(尽管如果指令需要访问内存,则显然将进行实际的内存访问-可能必须等待DMA设备对内存的使用中断)。


4
作为一种附加方法,某些系统可能提供多个通道来访问内存。可能允许CPU使用一个通道,而DMA引擎在另一个通道上工作
Cort Ammon-恢复Monica,

1
@CortAmmon我相信双通道内存通常分布在物理地址空间中,因此例如,如果您有2GB RAM,则较低的1GB位于第一个通道,较高的1GB位于第二个通道。在这种情况下,如果CPU和DMA都希望访问相同的1GB内存区域,则它们将位于同一通道上,因此可能会发生冲突。
米歇尔·约翰逊

我不确定许多实际系统是否曾经使用过真正的VNM架构。瓶颈太狭窄了。它确实是CS中使用的理论装置。我能想到的最接近的是1970年代的Texas 16位设备,其寄存器位于RAM中。我正在考虑使用双端口RAM的图形卡。像ARM esp这样的高端芯片在许多内部总线(AHP,APB,堆栈)上也能达到相同的效果。 futureelectronics.com/en/memory/dual-ports.aspx idt.com/products/memory-logic/multi-port-memory/...
ChrisR

1
我不认为这个问题是在问一个严格的Von-Neumann CPU,而是一个实用的CPU,例如x86或ARM,它们松散地属于Von-Neumann。对于严格的冯·诺依曼(Von-Neumann),没有任何内部寄存器的情况,CPU在DMA期间保持运行的能力归结为我的第二点,即DMA没有使用整个内存带宽。
米歇尔·约翰逊

20

如果只有一个内存接口,则将有硬件在请求之间进行仲裁。通常,处理器会比I / O拥有更高的优先级,而不会出现I / O匮乏的情况,但是即使I / O始终具有优先级,处理器也会有一些访问内存的机会,因为I / O倾向于具有较低的带宽需求并且是间歇性的。

此外,通常有不止一个内存接口。更高性能的处理器通常具有缓存(如果DMA不统一,则甚至不必监听缓存;即使进行监听,由于缓存和主内存之间的带宽差异或(当DMA传输到L3时,开销通常也将很小) L3缓存和L1缓存之间),提供一个单独的接口来访问内存。微控制器通常会从单独的基于闪存的存储器访问指令,从而允许在DMA到片上存储器的过程中进行取回操作,并且通常将存储器与独立接口紧密耦合(允许进行多次数据访问以避免DMA冲突)。

即使使用单个内存接口,峰值带宽通常也将高于通常使用的带宽。(对于指令提取,即使是一个较小的缓冲区,具有比从内存中读取的平均装载要宽的缓冲区,也将允许在另一个代理使用内存接口时利用缓冲区不分支的趋势从缓冲区中读取指令。)

还要注意,因为处理器访问数据,所以如果只有一个内存接口,则必须存在一种在数据访问和指令访问之间进行仲裁的机制。

如果处理器(具有单个内存接口)被迫实施从I / O设备缓冲区到主内存的复制,则它还必须获取指令以执行复制。这可能意味着即使在具有内存存储操作的ISA中,每个字也传输两个内存访问(如果不提供后增量内存寻址,则负载存储ISA可能需要三个或三个以上的内存访问);这是对I / O访问的补充,在旧系统中,I / O访问可能与主内存共享同一接口。DMA引擎不访问内存中的指令,因此避免了这种开销。


2

由于只有一个总线系统被DMA的内存访问阻塞,因此在DMA移动数据并因此暂停时,CPU无法工作。

其背后的想法如下:

如果要从内存中复制连续数据,则CPU必须执行以下操作:

计算地址->读取数据->计算新地址(+1个字)->读取数据...

DMA并行计算新地址(取决于模式),因此速度更快。因此,DMA可以在理论上以全总线吞吐量工作。


“因为只有一个总线系统”……对于内存和外围总线以不同速度运行以及它们之间发生协议转换的现代计算机而言,这并不是一个安全的假设。
rackandboneman '16

3
在较旧的计算机上:Apple II(或它的某些前身/原型?)中存在设计监督,因为它们确实停止了CPU。6502中的寄存器被实现为动态存储器。他们停止CPU的方式停止了刷新。最大DMA长度最终非常取决于机器。
rackandboneman '16

由于问题是关于冯·诺依曼体系结构和DMA的,这听起来更像是关于微控制器的问题(然后在示例中再次提到了硬盘)。正如保罗·克莱顿(Paul A. Clayton)所指出的那样,当您考虑多层缓存时,情况变得更加复杂。人们还可以考虑一个cpu,其中一个单词中包含多个操作码,并在另一个或cpus之后使用自己的缓存执行,在那里有cpu可以执行的代码,但是输出必须被缓冲...所以是的对,有无穷的可能性。
NeinDochOah '16

2

一般来说,没有。

在大多数系统体系结构中,所有访问内存的请求都分配有优先级。当同时有更多的内存请求超出系统一次处理的范围时,将优先处理优先级更高的请求。通常会给CPU发起的内存请求最高的优先级。


0

一般没有

有些系统可以肯定,一次只能有一个主机。如果是这种情况,则是较旧的设计(即使是较旧的设计也经常具有并行解决方案)。尽管每条总线(地址,写数据,读数据)都可以独立运行,但每个时钟周期都有一个标记或ID,以显示一个时钟周期与什么事务相关联。因此,您可以同时在两个方向上同时进行许多事务处理,在读取或写入数据总线上将不同的事务混在一起。下一步要走的人是基于优先级的,没有规则,总线上的事务必须按照软件指令的排列顺序出去,处理器可以确定它可以比其他的早一些启动,当然,根据目标的接近程度和速度,响应也会以不同的顺序返回。同样,提取操作也不按顺序进行,分支预测会在感觉良好时触发随机查找的提取操作。

大型dma事务肯定会需要更多的总线带宽,但是要说处理器停顿(不一定是这种情况)也取决于体系结构和代码。该代码可能有一条指令,说直到传输信号/事件的此事件发生为止,才停止,然后确保处理器将完成其在管道中可以执行的操作,然后停止。但是这种架构或某些架构可能不需要您拖延,无论如何都不是真正明智的选择,以免浪费大量带宽。如果dma不能并行运行,只是将其编码为一个循环,取回操作会增加一些周期,这取决于架构,它们可能不如dma逻辑开销,功耗等昂贵。 dma适用于您所使用的特定体系结构和系统,并决定是否值得使用,

关于dma的工作方式没有通用的答案,它在很大程度上取决于系统设计和系统中的所有组件。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.