En C cada byte es direccionable individualmente. Supongamos que un entero (digamos que usa 4 bytes) tiene una dirección 0xaddr
(que es de 32 bits, suponiendo que tenemos un procesador de 32 bits con bus de direcciones de 32 bits y bus de datos de 32 bits) y supongamos que el valor del entero es 0x12345678
. Ahora, si estoy obteniendo este valor de la memoria, ¿cómo lo hace el procesador? ¿El procesador coloca 0xaddr
(que es una dirección de 32 bits) en las líneas de dirección y luego busca datos de 8 bits, por ejemplo 0x12
. ¿Y luego el procesador marcará 0xaddr+1
en líneas de dirección y luego buscará otros datos de 8 bits 0x34
y así sucesivamente para los 4 bytes de un número entero? ¿O el procesador simplemente coloca 0xaddr
y lee los 4 bytes a la vez utilizando su bus de datos completo de 32 bits?¿Cómo se obtienen los datos de la RAM?
Respuesta
This is a well known article por el cable de la biblioteca GNU C que describe el acceso a la memoria (particularmente en x86 - PC actual - sistemas).Entra en muchos más detalles de los que posiblemente pueda necesitar.
El artículo completo se extiende por muchas partes:
- Introduction
- CPU Caches
- Virtual Memory
- NUMA Support
- Programmers
- More Programmers
- Performance Tools
- Future
- Appendices
una cosa que me gustaría añadir a la respuesta de gbulmer es que en muchos sistemas recibiendo un flujo de datos es más rápido de lo que cabría esperar de conseguir una sola palabra. en otras palabras, seleccionar de dónde quiere leer lleva algo de tiempo, pero uno tiene esa selección, leyendo desde ese punto, y luego los siguientes 32 o 64 bits o lo que sea, y luego el siguiente ... es más rápido que cambiar a algún lugar desconectado y leyendo otro valor.
y lo que domina la programación moderna no es el comportamiento de recuperar de la memoria en la placa base, sino si los datos están en una memoria caché de la CPU.
Si busca en la web "Arquitectura de computadora", es probable que obtenga algunas respuestas a sus preguntas.
Para su pregunta específica, una computadora de 32 bits, con un bus de datos y direcciones de 32 bits, para un caso simple, sin hardware ofuscante. Leerá 32 bits de una memoria de 32 bits de ancho.
Este es el tipo de hardware que existía desde finales de 1970 como minicompuestos (por ejemplo, DEC VAX) y todavía existe como microprocesadores (x86, ARM, Cortex-A8, MIPS32) y algunos microcontroladores (por ejemplo, ARM, Cortex M3, PIC32, etc.). El caso más simple: El bus de direcciones es un conjunto de señales (cables) que llevan señales de dirección a la memoria, más unas pocas señales para comunicar si la memoria debe leerse o escribirse (datos dirección), y si las señales en la dirección y los cables de dirección de datos son válidos. En el caso de su ejemplo, podría haber 32 cables para llevar el patrón de bits de la dirección.
El bus de datos es un segundo conjunto de cables que comunican el valor hacia y desde la memoria. La memoria podría afirmar una señal para decir que los datos son válidos, pero podría ser lo suficientemente rápido como para que todo "simplemente funcione".
Cuando el procesador pone la dirección en las señales de dirección, dice que quiere leer desde la memoria (la dirección de datos es 'leer'), la memoria recuperará el valor almacenado en esa dirección y lo colocará en las señales del bus de datos. El procesador (después de los retardos y señales adecuados) tomará muestras de los cables del bus de datos, y ese es el valor que usa.
El procesador puede leer los 32 bits completos y extraer un byte (si eso es todo lo que requiere la instrucción) internamente, o el bus de direcciones externo puede proporcionar señales adicionales para que el sistema de memoria externo pueda crear el byte apropiado , byte doble o byte de cuatro valores. Durante muchos años, las versiones de la arquitectura del procesador ARM solo podían leer los 32 bits completos, y las piezas más pequeñas, por ejemplo, un byte, se extraían internamente.
Puede ver un ejemplo de este tipo de señal establecida en http://www.cpu-world.com/info/Pinouts/68000.html Ese chip solo tiene un bus de direcciones de 24 bits y un bus de datos de 16 bits. Tiene dos señales (UDS y LDS) que indican si se están utilizando las señales de datos superiores, las señales de datos inferiores o ambas.
Encontré una explicación razonablemente detallada en research.cs.tamu.edu/prism/lectures/mbsd/mbsd_l15.pdf Lo encontré buscando "ciclo de bus de memoria 68000".
Puede que sea útil buscar MIPS, ARM o x86 para ver su ciclo de bus.
- 1. ¿Cómo obtienen los datos de los mashups de craigslist?
- 2. ¿Cómo se obtienen los hijos de un widget en Qt?
- 3. ¿Cómo se obtienen los iconos de shell32.dll?
- 4. ¿Cómo se obtienen los datos de solicitud con socket.io con node.js y express?
- 5. seleccione el cambio, obtienen los datos de valor de atributo
- 6. ¿Cómo se obtienen los servidores DNS actuales para Android?
- 7. ¿Cómo obtienen los motores de búsqueda de viajes y los agregadores sus datos de origen?
- 8. ¿Cómo puedo almacenar datos en la memoria RAM usando PHP?
- 9. ¿Puede RAM manejar diferentes tamaños de datos?
- 10. ¿Cómo se obtienen los resultados de la regresión de lme, lmer, glmer a Latex?
- 11. ¿Los argumentos de constructor obtienen GC'ed?
- 12. Los archivos fuente CUDA obtienen una extensión .cu. ¿Qué obtienen los archivos de cabecera?
- 13. ¿Es posible cargar una base de datos en la RAM?
- 14. DMA transfer RAM-to-RAM
- 15. ¿Cómo se obtienen múltiples argumentos en las funciones de Perl?
- 16. ¿Qué sucede con un almacén de datos de Redis si los datos exceden el RAM disponible?
- 17. ¿Cómo se obtienen manejadores de errores múltiples en PHP?
- 18. ¿Cómo se obtienen todos los términos hijos de un término de SharePoint en C#?
- 19. Los controles de usuario dinámicos obtienen y mantienen valores después de las devoluciones de datos
- 20. ¿Cómo se agrupan los intervalos de tiempo en php/mysql y se obtienen estadísticas basadas en esos grupos de tiempo?
- 21. ¿Cuánto más rápido se ejecuta una base de datos en la RAM?
- 22. Ordenando datos más grandes que el tamaño de RAM
- 23. ¿Cómo se obtienen los encabezados predeterminados en una solicitud de urllib2?
- 24. ¿Cómo se elevan y obtienen los derechos de administración bajo demanda en una aplicación .NET?
- 25. ¿Cómo se obtienen los resultados de la consulta de MySQL en formato csv (en la pantalla, no en un archivo)?
- 26. django vars en ram
- 27. ¿Cómo se obtienen los bloques de servidor <% %> para formatear bien en Visual Studio?
- 28. ¿Cómo tratar los datos RAM como si fuera un archivo real?
- 29. ¿Cómo se obtiene Excel para actualizar los datos en la hoja desde dentro de VBA?
- 30. Datos principales: ¿Los contextos secundarios alguna vez obtienen ID de objeto permanentes para objetos recién insertados?
Depende. ¿De qué procesador exacto estás hablando? IIRC el 8086 tenía un bus de datos de 16 bits. Muchos modelos más nuevos (Pentium y superiores) tenían un FSB de 64 bits. – harold
@harold: ¿puedes decirme por qué es diferente para diferentes procesadores? Estoy preguntando en general y no específicamente a ningún procesador. ¿Cómo se hará, digamos que fo 8086, que tiene un bus de datos de 16 bits, y cómo para el bus de datos de 32 bits y para el 64? gracias – mezda
es mucho más complejo que un simple bus de datos, también hay caché –