¿Se congela completamente una CPU cuando se usa un DMA?

16

Tengo una pregunta bastante directa, pero no pude encontrar una respuesta en ninguna parte.

En un sistema Von-Neumann donde el código y los datos viven en la misma RAM, la CPU debe recuperar todas sus instrucciones de la memoria. Ahora, para mover grandes cantidades de datos entre los componentes de la computadora, hay un controlador de acceso directo a la memoria que permite que los periféricos tengan acceso a la RAM principal del sistema.

Mi pregunta es la siguiente: si el DMA está permitiendo una transferencia de datos (posiblemente muy larga) entre, por ejemplo, el disco duro y la RAM, no significa que la CPU no pueda usar la RAM y, por lo tanto, no pueda recuperar su siguiente instrucción?

En resumen, el DMA está destinado a reemplazar el procesador que arbitró todas las lecturas y escrituras de E / S, con el fin de liberar al procesador para hacer otras cosas. Sin embargo, si no puede obtener sus instrucciones de la memoria RAM, entonces no se ha liberado de todos modos.

¿Hay algún detalle que me esté perdiendo?

Gracias

    
pregunta Mahkoe

5 respuestas

16

Es correcto que la CPU no pueda acceder a la memoria durante una transferencia DMA. Sin embargo, hay dos factores que, en combinación, permiten el acceso aparente a la memoria paralela por parte de la CPU y el dispositivo que realiza la transferencia DMA:

  • La CPU toma varios ciclos de reloj para ejecutar una instrucción. Una vez que ha recuperado la instrucción, que toma uno o dos ciclos, a menudo puede ejecutar la instrucción completa sin más acceso a la memoria (a menos que sea una instrucción que acceda a la memoria, como una instrucción mov con un operando indirecto).
  • El dispositivo que realiza la transferencia DMA es significativamente más lento que la velocidad de la CPU, por lo que la CPU no tendrá que detenerse en cada instrucción, sino solo ocasionalmente cuando el dispositivo DMA está accediendo a la memoria.

En combinación, estos dos factores significan que el dispositivo que realiza la transferencia DMA tendrá poco impacto en la velocidad de la CPU.

EDITAR: Olvidé mencionar que también está el factor de la memoria caché de la CPU, que siempre que el código que la CPU está ejecutando esté en la memoria caché, no necesitará acceder a la memoria real para obtener instrucciones, por lo que una transferencia DMA no se interpondrá en el camino (aunque si la instrucción necesita acceder a la memoria, obviamente tendrá lugar un acceso real a la memoria, lo que podría tener que esperar a que se interrumpa el uso de la memoria por parte del dispositivo DMA).

    
respondido por el Micheal Johnson
18

Si hay una sola interfaz de memoria, habría hardware para arbitrar entre las solicitudes. Típicamente, a un procesador se le daría prioridad sobre la E / S sin I / O de hambre, pero incluso si la E / S siempre tiene prioridad, el procesador tendrá algunas oportunidades de acceder a la memoria porque la E / S tiende a tener menores demandas de ancho de banda y es intermitente.

Además, normalmente hay más de una interfaz en la memoria. Normalmente, los procesadores de mayor rendimiento tienen cachés (si DMA no es coherente, los cachés ni siquiera tienen que ser indagados; incluso con la indagación, la sobrecarga generalmente sería pequeña debido a la diferencia de ancho de banda entre el caché y la memoria principal) (cuando el DMA se transfiere a L3 caché) entre la caché L3 y la caché L1), proporcionando una interfaz separada para acceder a la memoria. Los microcontroladores a menudo acceden a las instrucciones desde una memoria separada basada en flash, lo que permite que la recuperación continúe durante la memoria en chip del DMA y, a menudo, tiene una memoria estrechamente acoplada con una interfaz independiente (lo que permite que muchos accesos de datos eviten conflictos de DMA).

Incluso con una sola interfaz de memoria, el ancho de banda máximo generalmente será más alto que el ancho de banda utilizado normalmente. (Para la obtención de instrucciones, incluso un búfer pequeño con una carga de recuperación de memoria más amplia que el promedio permitiría la obtención de instrucciones desde el búfer mientras otro agente está usando la interfaz de memoria, explotando la tendencia del código a no bifurcarse).

También tenga en cuenta que debido a que un procesador accede a los datos, si hay una sola interfaz de memoria, debe haber un mecanismo para el arbitraje entre los accesos de datos y los accesos de instrucciones.

Si el procesador (con una sola interfaz de memoria) se vio obligado a implementar una copia desde un búfer de dispositivo de E / S a la memoria principal, también tendría que buscar instrucciones para realizar la copia. Esto podría significar dos accesos de memoria por palabra transferida incluso en un ISA con operaciones de memoria-memoria (un ISA de almacenamiento de carga podría requerir tres accesos de memoria o más si no se proporciona el direccionamiento de memoria post-incremento); esto es además del acceso de E / S que en sistemas antiguos puede compartir la misma interfaz que la memoria principal. Un motor DMA no accede a las instrucciones en la memoria y, por lo tanto, evita esta sobrecarga.

    
respondido por el Paul A. Clayton
2

Dado que solo hay un sistema de bus, que está bloqueado por el acceso a la memoria del DMA, la CPU no puede funcionar mientras el DMA está moviendo datos y, por lo tanto, se detiene.

La idea detrás de esto es la siguiente:

Si desea copiar datos consecutivos de la memoria, entonces la CPU debería hacer algo como eso:

Calcular dirección - > leer datos- > calcular nueva dirección (+ 1 palabra) - > leer datos ...

Mientras que el DMA realiza el cálculo de la nueva dirección en paralelo (dependiendo del modo) y por lo tanto es más rápido. Por lo tanto, la DMA puede funcionar con el rendimiento total del bus (teóricamente).

    
respondido por el NeinDochOah
1

En términos generales, no.

En la mayoría de las arquitecturas de sistemas, todas las solicitudes de acceso a la memoria tienen una prioridad asignada. Cuando hay más solicitudes simultáneas de memoria de las que el sistema puede manejar a la vez, primero se atienden las solicitudes con mayor prioridad. Las solicitudes de memoria iniciadas por la CPU generalmente reciben la mayor prioridad posible.

    
respondido por el duskwuff
0

En general no.

Algunos sistemas seguro, solo un maestro a la vez. Un poco de un diseño antiguo si ese es el caso (incluso los diseños antiguos a menudo tenían soluciones paralelas). Un tipo moderno de bus a través de cada bus (dirección, datos de escritura, datos de lectura) opera de manera independiente y tiene una etiqueta o id por ciclo de reloj para mostrar con qué transacción está asociado un ciclo de reloj. Así que puede tener muchas / muchas transacciones en vuelo al mismo tiempo en ambas direcciones, con diferentes transacciones barajadas juntas en los buses de datos de lectura o escritura. Quien se dirija a continuación se basará en la prioridad, no hay ninguna regla que las transacciones en el bus deban realizarse en el orden en que se presentan las instrucciones del software, el procesador puede determinar que puede comenzar algunas antes que otras, y naturalmente Las respuestas volverán en diferentes órdenes también dependiendo de qué tan cerca y rápido sea el objetivo. Del mismo modo, las recuperaciones no están en orden, la predicción de rama dispara las búsquedas aleatorias cada vez que se siente.

Una transacción dma grande requeriría mucho más ancho de banda de bus, pero decir que el procesador se detiene, no necesariamente el caso, también depende de la arquitectura y el código. El código puede tener una instrucción que diga "detenerse" hasta que ocurra este final de la señal / evento de transferencia, y luego asegurarse de que el procesador termine lo que puede hacer en la tubería y luego se detenga. Pero eso o algunas arquitecturas pueden no requerir que se detenga, no es realmente prudente que se detenga de todos modos, tanto ancho de banda desperdiciado. De todos modos, ¿cuál sería el punto de dma si no funciona en paralelo? Simplemente codifique la transferencia en un bucle, las recuperaciones agregan algunos ciclos y, dependiendo de la arquitectura, no son tan costosos como la sobrecarga de lógica, potencia, etc. dma funciona para la arquitectura y el sistema en particular en el que se encuentra y decide si vale la pena usarlo, a veces ahorra algunos relojes, incluso si lo detiene, a menudo, si está bien diseñado, ralentiza un poco su software principal pero se llena de todo. los ciclos de bus desperdiciados que no has hecho y son más gratuitos que costosos.

No hay una respuesta genérica sobre cómo funciona dma, depende en gran medida del diseño del sistema y de todos los componentes dentro del sistema.

    
respondido por el old_timer

Lea otras preguntas en las etiquetas