Memory 编程I/O与DMA

Memory 编程I/O与DMA,memory,file-io,cpu,cpu-architecture,Memory,File Io,Cpu,Cpu Architecture,我想知道编程I/O和DMA的最大带宽是否不同。我的困惑来自以下几点 如果cpu、内存和I/O设备只有一条总线,而我们使用的是编程I/O,那么在我们读取数据时,数据是直接从I/O传输到内存,还是先传输到cpu,然后再传输到内存。也就是说,如果每次传输可以传输10个字节,每次传输需要20毫秒,这是否意味着编程I/O的最大带宽是每秒 10*20*10^-9 还是我需要考虑的事实是它先进入CPU然后从CPU tot内存? PIO通常直接进入CPU。即使是从内存复制到内存的CISC指令也需要使用CPU管

我想知道编程I/O和DMA的最大带宽是否不同。我的困惑来自以下几点

如果cpu、内存和I/O设备只有一条总线,而我们使用的是编程I/O,那么在我们读取数据时,数据是直接从I/O传输到内存,还是先传输到cpu,然后再传输到内存。也就是说,如果每次传输可以传输10个字节,每次传输需要20毫秒,这是否意味着编程I/O的最大带宽是每秒

10*20*10^-9


还是我需要考虑的事实是它先进入CPU然后从CPU tot内存?

PIO通常直接进入CPU。即使是从内存复制到内存的CISC指令也需要使用CPU管道上的指令槽。与RAM读取相比,加载指令可能会经历较大的总线延迟。如果要复制大量数据,也要考虑循环指令,这很容易理解为什么DMA更高效。

如果您有一个像您在问题中建议的那样布置的系统,并且CPU北桥带宽是瓶颈,那么是的,也许您可以使用DMA比PIO更快地将数据从极高带宽的设备获取到RAM中。这听起来似乎很有可能发生在某些系统中,这些系统的设备相对于CPU与外部世界的连接速度非常快

当然,现代x86系统甚至没有,因为内存控制器是片上的。这并没有使关于计算机体系结构的问题无效,但它确实使它变得不那么相关。IDK其他芯片(如ARM)的功能。但由于高集成度是常见的(包括SoC(片上系统)),如果单独的北桥也从非x86世界消失,我也不会感到惊讶


PIO和DMA之间的区别主要不是哪一个可以实现最高带宽,而是哪一个会使系统速度减慢。在整个复制期间,运行复制循环或多或少完全占用CPU核心。在多核CPU出现之前,这是一笔更大的交易

复制循环也会污染缓存,但通过特殊的缓存绕过指令,可以避免这种情况


在x86上,和编程I/O指令不能很好地流水线传输。它们不像
CPUID
那样序列化,但对无序执行不是很友好。这是一个原因,对于PIO,使用常规加载/存储操作的内存映射I/O优于
in
/
out
。e、 g.只是写入设备的IO寄存器以启动DMA传输,或者对于DMA不值得的小型传输。

因此,如果我们有PIO,我们需要将数据从磁盘传输到内存,那么让我们这样说。这些数据首先进入cpu,然后进入内存?是的,cpu通过总线提取值。对不起,我有点困惑,所以cpu通过总线将值提取到寄存器/缓存,然后发送到内存?假设总线每秒传输1个字节,我们需要将5个字节从磁盘传输到ram,需要5秒还是10秒?取决于硬件系统,有几种不同的方式实现PIO系统。在大多数系统上,您都有一个状态寄存器,您必须连续读取(轮询)该寄存器以等待就绪位,然后读取数据,也可以在数据可用时由硬件触发中断。要再回答您最初的帖子,PIO最大传输速度是从硬件获取新值所需的速度。它不考虑CPU发出load指令所需的额外时间,也不考虑CPU将值写回内存所需的额外时间,所有这些从硬件角度来看都是不可预测的。更大的区别在于CPU负载,请参阅我的答案。还有,10字节块?它将是2的幂,比如16字节。每次传输20毫秒?你的CPU运行频率是1kHz吗?对于1600MHz RAM,20ms是3200万个DRAM时钟周期。当然,现代x86 CPU有用于RAM和设备I/O的分离总线,因为它们有片上内存控制器。请参阅显示系统代理与内存总线的关系图。