El subsistema de memoria en un procesador moderno está restringido a acceder a la memoria en la granularidad y alineación de su tamaño de palabra; Este es el caso por varias razones.
Velocidad
Los procesadores modernos tienen múltiples niveles de memoria caché por los que deben extraerse los datos; admitir lecturas de un solo byte haría que el rendimiento del subsistema de memoria esté estrechamente vinculado al rendimiento de la unidad de ejecución (también conocido como enlazado a la CPU); Todo esto recuerda cómo DMA superó el modo PIO por muchas de las mismas razones en los discos duros.
La CPU siempre lee en su tamaño de palabra (4 bytes en un procesador de 32 bits), por lo que cuando realiza un acceso de dirección no alineado, en un procesador que lo admite, el procesador leerá varias palabras. La CPU leerá cada palabra de memoria que se encuentre a horcajadas sobre su dirección solicitada. Esto provoca una amplificación de hasta 2 veces el número de transacciones de memoria requeridas para acceder a los datos solicitados.
Debido a esto, puede ser mucho más lento leer dos bytes que cuatro. Por ejemplo, supongamos que tiene una estructura en la memoria que se ve así:
struct mystruct {
char c; // one byte
int i; // four bytes
short s; // two bytes
}
En un procesador de 32 bits, lo más probable es que esté alineado como se muestra aquí:
El procesador puede leer cada uno de estos miembros en una transacción.
Digamos que tenía una versión empaquetada de la estructura, tal vez de la red donde estaba empaquetada para la eficiencia de transmisión; podría verse más o menos así:
Leer el primer byte va a ser lo mismo.
Cuando le pida al procesador que le dé 16 bits de 0x0005, tendrá que leer una palabra de 0x0004 y desplazar 1 byte a la izquierda para colocarlo en un registro de 16 bits; algo de trabajo extra, pero la mayoría puede manejar eso en un ciclo.
Cuando solicite 32 bits de 0x0001 obtendrá una amplificación 2X. El procesador leerá desde 0x0000 en el registro de resultados y cambiará a la izquierda 1 byte, luego leerá nuevamente desde 0x0004 a un registro temporal, cambiará a la derecha 3 bytes y luego OR
con el registro de resultados.
Rango
Para cualquier espacio de direcciones dado, si la arquitectura puede suponer que los 2 LSB son siempre 0 (por ejemplo, máquinas de 32 bits), entonces puede acceder a 4 veces más memoria (los 2 bits guardados pueden representar 4 estados distintos), o la misma cantidad de memoria con 2 bits para algo así como banderas. Quitar los 2 LSB de una dirección le daría una alineación de 4 bytes; También se conoce como un paso de 4 bytes. Cada vez que se incrementa una dirección, está incrementando efectivamente el bit 2, no el bit 0, es decir, los últimos 2 bits siempre seguirán siendo 00
.
Esto incluso puede afectar el diseño físico del sistema. Si el bus de direcciones necesita 2 bits menos, puede haber 2 pines menos en la CPU y 2 trazas menos en la placa de circuito.
Atomicidad
La CPU puede operar atómicamente una palabra de memoria alineada, lo que significa que ninguna otra instrucción puede interrumpir esa operación. Esto es crítico para el funcionamiento correcto de muchas estructuras de datos sin bloqueo y otros paradigmas de concurrencia .
Conclusión
El sistema de memoria de un procesador es bastante más complejo e implicado que el descrito aquí; Una discusión sobre cómo un procesador x86 realmente aborda la memoria puede ayudar (muchos procesadores funcionan de manera similar).
Hay muchos más beneficios al adherirse a la alineación de la memoria que puede leer en este artículo de IBM .
El uso principal de una computadora es transformar datos. Las arquitecturas y tecnologías de memoria modernas se han optimizado durante décadas para facilitar la obtención de más datos, entrada, salida y entre más unidades de ejecución más rápidas, de una manera altamente confiable.
Bonus: cachés
Otra alineación por rendimiento a la que aludí anteriormente es la alineación en líneas de caché que son (por ejemplo, en algunas CPU) 64B.
Para obtener más información sobre la cantidad de rendimiento que se puede obtener aprovechando los cachés, eche un vistazo a la Galería de efectos de caché del procesador ; de esta pregunta sobre tamaños de línea de caché
La comprensión de las líneas de caché puede ser importante para ciertos tipos de optimizaciones de programas. Por ejemplo, la alineación de datos puede determinar si una operación toca una o dos líneas de caché. Como vimos en el ejemplo anterior, esto puede significar fácilmente que en el caso desalineado, la operación será dos veces más lenta.