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 obtener 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 memoria que permite que los periféricos tengan acceso a la RAM del sistema principal.
Mi pregunta es esta: si el DMA permite una transferencia de datos (posiblemente muy larga) entre, por ejemplo, el disco duro y la RAM, ¿eso no significa que la CPU no puede usar la RAM y, por lo tanto, no puede obtener su próxima instrucción?
En resumen, el DMA está destinado a reemplazar el procesador que arbitra 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 RAM, no se ha liberado de todos modos.
¿Hay algún detalle que me falta aquí?
Gracias
fuente
Respuestas:
Tiene razón en que la CPU no puede acceder a la memoria durante una transferencia DMA. Sin embargo, hay dos factores que, en combinación, permiten un aparente acceso paralelo a la memoria de la CPU y el dispositivo que realiza la transferencia DMA:
mov
instrucción con un operando indirecto).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 existe el factor de la memoria caché de la CPU, que mientras el código que la CPU está ejecutando esté en la memoria caché, entonces no necesitará acceder a la memoria real para obtener instrucciones, por lo que no se realizará una transferencia DMA para interponerse (aunque si la instrucción necesita acceder a la memoria, obviamente tendrá lugar un acceso real a la memoria, posiblemente teniendo que esperar un descanso en el uso de la memoria del dispositivo DMA).
fuente
Si hay una única interfaz de memoria, habría hardware para arbitrar entre las solicitudes. Por lo general, se daría prioridad a un procesador sobre las E / S sin perder E / S, pero incluso con E / S siempre teniendo prioridad, el procesador tendría algunas oportunidades de acceder a la memoria porque las E / S tienden a tener menores demandas de ancho de banda y ser intermitentes.
Además, normalmente hay más de una interfaz para la memoria. Los procesadores de mayor rendimiento suelen tener 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 o (cuando el DMA se transfiere a L3) caché) entre caché L3 y caché L1), proporcionando una interfaz separada para acceder a la memoria. Los microcontroladores a menudo acceden a las instrucciones desde una memoria flash separada, lo que permite que la recuperación continúe durante la memoria DMA a la memoria en el chip, y a menudo tienen una memoria estrechamente acoplada con una interfaz independiente (permitiendo muchos accesos de datos para evitar conflictos de DMA).
Incluso con una única interfaz de memoria, el ancho de banda máximo generalmente será mayor que el ancho de banda utilizado normalmente. (Para la búsqueda de instrucciones, incluso un búfer pequeño con una carga de memoria más amplia que la media desde la memoria permitiría obtener instrucciones del búfer mientras otro agente está utilizando la interfaz de memoria, explotando la tendencia del código a no ramificarse).
También tenga en cuenta que debido a que un procesador accede a los datos, si hay una única interfaz de memoria, debe haber un mecanismo de arbitraje entre los accesos a los datos y los accesos a las 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 transferidos 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 direccionamiento de memoria posterior al incremento); eso es además del acceso de E / S que en los sistemas antiguos podría 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.
fuente
Como 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 tendría que hacer algo así:
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 (según el modo) y, por lo tanto, es más rápido. Por lo tanto, el DMA puede funcionar con el rendimiento total del bus (teóricamente).
fuente
En general, no.
En la mayoría de las arquitecturas del sistema, 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, las solicitudes con mayor prioridad se atienden primero. Las solicitudes de memoria iniciadas por la CPU generalmente reciben la mayor prioridad posible.
fuente
En general no.
Algunos sistemas están seguros, solo un maestro a la vez. Un diseño un poco más antiguo si ese es el caso (incluso los diseños antiguos a menudo tenían soluciones paralelas). Un tipo moderno de bus, aunque cada bus (dirección, escritura de datos, lectura de datos) opera de manera independiente y tiene una etiqueta o id por ciclo de reloj para mostrar a qué transacción se asocia ese ciclo de reloj. Por lo tanto, 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 vaya a continuación se basará en la prioridad, no existe una regla que indique que las transacciones en el autobús tendrían que 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, dependiendo de cuán cerca y rápido sea el objetivo. Del mismo modo, las recuperaciones no están en orden, la predicción de ramificación dispara las recuperaciones de aspecto aleatorio 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 dice bloqueo hasta que suceda este evento / señal de transferencia, y luego asegúrese de que el procesador termine lo que puede hacer en la tubería y luego se bloquee. Pero eso o algunas arquitecturas pueden no requerir que se bloquee, no es realmente sabio hacerlo de todos modos, tanto ancho de banda desperdiciado. ¿Cuál sería el punto de dma de todos modos si no funciona en paralelo, solo codifique la transferencia en un bucle, las capturas agregan algunos ciclos tal vez, dependiendo de la arquitectura, no son tan costosas como la sobrecarga lógica de dma, la potencia, etc. Comprenda cómo dma funciona para la arquitectura y el sistema particular en el que se encuentra y decide si vale la pena usarlo,
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.
fuente