stringtranslate.com

Direccionamiento de palabras

En la arquitectura informática, el direccionamiento por palabras significa que las direcciones de la memoria de una computadora identifican de forma única las palabras de la memoria. Por lo general, se utiliza en contraste con el direccionamiento por bytes , donde las direcciones identifican de forma única los bytes . Casi todas las arquitecturas informáticas modernas utilizan el direccionamiento por bytes, y el direccionamiento por palabras tiene un interés principalmente histórico. Una computadora que utiliza el direccionamiento por palabras a veces se denomina máquina de palabras .

Tablas que muestran los mismos datos organizados según direccionamiento de bytes y palabras

Lo esencial

Consideremos una computadora que proporciona 524.288 (2 19 ) bits de memoria. Si esa memoria está organizada en un espacio de direcciones plano direccionable por bytes utilizando bytes de 8 bits, entonces hay 65.536 (2 16 ) direcciones válidas, de 0 a 65.535, cada una de las cuales denota 8 bits independientes de memoria. Si, en cambio, está organizada en un espacio de direcciones plano direccionable por palabra utilizando palabras de 32 bits, entonces hay 16.384 (2 14 ) direcciones válidas, de 0 a 16.383, cada una de las cuales denota 32 bits independientes.

En términos más generales, la unidad mínima direccionable (MAU) es una propiedad de una abstracción de memoria específica. Diferentes abstracciones dentro de una computadora pueden usar diferentes MAU, incluso cuando representan la misma memoria subyacente. Por ejemplo, una computadora puede usar direcciones de 32 bits con direccionamiento de bytes en su conjunto de instrucciones , pero el sistema de coherencia de caché de la CPU puede funcionar con memoria solo con una granularidad de líneas de caché de 64 bytes , lo que permite que cualquier línea de caché en particular se identifique con solo una dirección de 26 bits y disminuye la sobrecarga de la caché.

La traducción de direcciones realizada por la memoria virtual a menudo afecta la estructura y el ancho del espacio de direcciones, pero no cambia la MAU.

Compensaciones entre diferentes unidades mínimas direccionables

El tamaño de la unidad mínima direccionable de memoria puede tener compensaciones complejas. El uso de una MAU más grande permite cubrir la misma cantidad de memoria con una dirección más pequeña, lo que puede reducir sustancialmente los requisitos de memoria de un programa. Sin embargo, el uso de una MAU más pequeña facilita el trabajo eficiente con pequeños elementos de datos.

Supongamos que un programa desea almacenar uno de los 12 signos tradicionales de la astrología occidental . Un solo signo se puede almacenar en 4 bits. Si un signo se almacena en su propia MAU, se desperdiciarán 4 bits con el direccionamiento de bytes (eficiencia del 50 %), mientras que se desperdiciarán 28 bits con el direccionamiento de palabras de 32 bits (eficiencia del 12,5 %). Si un signo se "empaqueta" en una MAU con otros datos, entonces puede ser relativamente más costoso leerlo y escribirlo. Por ejemplo, para escribir un nuevo signo en una MAU en la que se han empaquetado otros datos, la computadora debe leer el valor actual de la MAU, sobrescribir solo los bits apropiados y luego almacenar nuevamente el nuevo valor. Esto será especialmente costoso si es necesario que el programa permita que otros subprocesos modifiquen simultáneamente los otros datos en la MAU.

Un ejemplo más común es una cadena de texto . Los formatos de cadena comunes, como UTF-8 y ASCII, almacenan cadenas como una secuencia de puntos de código de 8 bits. Con el direccionamiento de bytes, cada punto de código se puede colocar en su propia MAU direccionable independientemente sin sobrecarga. Con el direccionamiento de palabras de 32 bits, colocar cada punto de código en una MAU separada aumentaría el uso de memoria en un 300%, lo que no es viable para programas que trabajan con grandes cantidades de texto. Empaquetar puntos de código adyacentes en una sola palabra evita este costo. Sin embargo, muchos algoritmos para trabajar con texto prefieren poder direccionar puntos de código de forma independiente; para hacer esto con puntos de código empaquetados, el algoritmo debe usar una dirección "ancha" que también almacene el desplazamiento del carácter dentro de la palabra. Si esta dirección ancha necesita almacenarse en otro lugar dentro de la memoria del programa, puede requerir más memoria que una dirección ordinaria.

Para evaluar estos efectos en un programa completo, considere un navegador web que muestra una página grande y compleja. Parte de la memoria del navegador se utilizará para almacenar datos simples, como imágenes y texto; es probable que el navegador elija almacenar estos datos de la manera más eficiente posible y ocupará aproximadamente la misma cantidad de memoria independientemente del tamaño de la MAU. Otra parte de la memoria representará el modelo del navegador de varios objetos en la página, y estos objetos incluirán muchas referencias: entre sí, a los datos de imagen y texto, etc. La cantidad de memoria necesaria para almacenar estos objetos dependerá en gran medida del ancho de la dirección de la computadora.

Supongamos que, si todas las direcciones del programa fueran de 32 bits, esta página web ocuparía unos 10 Gigabytes de memoria.

Por lo tanto, el direccionamiento por palabra permite que una computadora direccione una cantidad sustancialmente mayor de memoria sin aumentar el ancho de su dirección y sin incurrir en el correspondiente aumento grande en el uso de memoria. Sin embargo, esto es valioso solo dentro de un rango relativamente estrecho de tamaños de conjuntos de trabajo y puede introducir sobrecargas sustanciales en tiempo de ejecución según la aplicación. Los programas que trabajan relativamente poco con datos orientados a bytes, como imágenes, texto, archivos y tráfico de red, pueden ser los que más se beneficien.

Accesos a subpalabras y direcciones amplias

Un programa que se ejecuta en una computadora que utiliza direccionamiento de palabras puede funcionar con unidades de memoria más pequeñas al emular un acceso a la unidad más pequeña. Para una carga, esto requiere cargar la palabra que la encierra y luego extraer los bits deseados. Para un almacenamiento, esto requiere cargar la palabra que la encierra, desplazar el nuevo valor a su lugar, sobrescribir los bits deseados y luego almacenar la palabra que la encierra.

Supongamos que es necesario empaquetar cuatro puntos de código consecutivos de una cadena UTF-8 en una palabra de 32 bits. El primer punto de código podría ocupar los bits 0 a 7, el segundo, del 8 al 15, el tercero, del 16 al 23, y el cuarto, del 24 al 31. (Si la memoria fuera direccionable por bytes, este sería un orden de bytes little endian ).

Para explicar claramente el código necesario para los accesos a subpalabras sin vincular el ejemplo demasiado estrechamente a ninguna arquitectura de direcciones de palabras en particular, los siguientes ejemplos utilizan el lenguaje ensamblador MIPS . En realidad, MIPS es una arquitectura de direcciones de bytes con soporte directo para cargar y almacenar valores de 8 y 16 bits, pero el ejemplo pretenderá que solo proporciona cargas y almacenamientos de 32 bits y que los desplazamientos dentro de una palabra de 32 bits deben almacenarse por separado de una dirección. Se ha elegido MIPS porque es un lenguaje ensamblador simple sin funciones especializadas que harían que estas operaciones fueran más convenientes.

Supongamos que un programa desea leer el tercer punto de código en el registro r1a partir de la palabra en una dirección del registro r2. En ausencia de cualquier otro soporte del conjunto de instrucciones, el programa debe cargar la palabra completa, desplazarla a la derecha en 16 para eliminar los dos primeros puntos de código y luego enmascarar el cuarto punto de código:

 ldw $r1, 0($r2) # Cargar la palabra completa srl $r1, $r1, 16 # Desplazamiento a la derecha por 16 andi $r1, $r1, 0xFF # Enmascarar otros puntos de código

Si el desplazamiento no se conoce estáticamente, sino que se almacena un desplazamiento de bits en el registro r3, se requiere un enfoque un poco más complejo:

 ldw $r1, 0($r2) # Cargar la palabra completa srlv $r1, $r1, $r3 # Desplazamiento a la derecha por el desplazamiento de bits andi $r1, $r1, 0xFF # Enmascarar otros puntos de código

Supongamos, en cambio, que el programa desea asignar el punto de código en el registro r1al tercer punto de código en la palabra en la dirección en r2. En ausencia de cualquier otro soporte del conjunto de instrucciones, el programa debe cargar la palabra completa, ocultar el valor anterior de ese punto de código, desplazar el nuevo valor a su lugar, fusionar los valores y almacenar nuevamente la palabra completa:

 sll $r1, $r1, 16 # Desplaza el nuevo valor hacia la izquierda en 16 lhi $r5, 0x00FF # Construye una máscara constante para seleccionar el tercer byte ni $r5, $r5, $cero # Invierte la máscara para que borre el tercer byte ldw $r4, 0($r2) # Cargar la palabra completa y $r4, $r5, $r4 # Limpia el tercer byte de la palabra o $r4, $r4, $r1 # Fusionar el nuevo valor en la palabra stw $r4, 0($r2) # Almacena el resultado como la palabra completa

Nuevamente, si el desplazamiento se almacena en r3, se requiere un enfoque más complejo:

 sllv $r1, $r1, $r3 # Desplaza el nuevo valor a la izquierda por el desplazamiento de bits llo $r5, 0x00FF # Construye una máscara constante para seleccionar un byte sllv $r5, $r5, $r3 # Desplaza la máscara hacia la izquierda por el desplazamiento de bits ni $r5, $r5, $cero # Invierte la máscara para que borre el byte seleccionado ldw $r4, 0($r2) # Cargar la palabra completa y $r4, $r5, $r4 # Limpia el byte seleccionado de la palabra o $r4, $r4, $r1 # Fusionar el nuevo valor en la palabra stw $r4, 0($r2) # Almacena el resultado como la palabra completa

Esta secuencia de código supone que otro subproceso no puede modificar otros bytes de la palabra simultáneamente. Si es posible realizar modificaciones simultáneas, es posible que se pierda una de las modificaciones. Para resolver este problema, las últimas instrucciones deben convertirse en un bucle de comparación-intercambio atómico, de modo que una modificación simultánea simplemente haga que se repita la operación con el nuevo valor. En este caso, no se requieren barreras de memoria.

Un par de direcciones de palabra y un desplazamiento dentro de la palabra se denomina dirección ancha (también conocida como dirección fat o puntero fat ). (Esto no debe confundirse con otros usos de direcciones anchas para almacenar otros tipos de datos complementarios, como los límites de una matriz). El desplazamiento almacenado puede ser un desplazamiento de bits o un desplazamiento de bytes. Las secuencias de código anteriores se benefician de que el desplazamiento se denomine en bits porque lo utilizan como un recuento de desplazamiento; una arquitectura con soporte directo para seleccionar bytes podría preferir simplemente almacenar un desplazamiento de bytes.

En estas secuencias de código, el desplazamiento adicional tendría que almacenarse junto con la dirección base, duplicando efectivamente los requisitos generales de almacenamiento de una dirección. Esto no siempre es así en las máquinas de palabras, principalmente porque las direcciones en sí mismas a menudo no se empaquetan con otros datos para que los accesos sean más eficientes. Por ejemplo, el Cray X1 usa palabras de 64 bits, pero las direcciones son solo de 32 bits; cuando una dirección se almacena en la memoria, se almacena en su propia palabra, y por lo tanto el desplazamiento de bytes se puede colocar en los 32 bits superiores de la palabra. La ineficiencia de usar direcciones anchas en ese sistema es simplemente toda la lógica adicional para manipular este desplazamiento y extraer e insertar bytes dentro de las palabras; no tiene impacto en el uso de la memoria.

Conceptos relacionados

La unidad mínima direccionable de una computadora no es necesariamente la misma que el tamaño mínimo de acceso a la memoria del conjunto de instrucciones de la computadora. Por ejemplo, una computadora podría utilizar el direccionamiento de bytes sin proporcionar instrucciones para leer o escribir directamente un solo byte. Se esperaría que los programas emulasen esas operaciones en software con manipulaciones de bits, tal como lo hacen las secuencias de código de ejemplo anteriores. Esto es relativamente común en arquitecturas de computadoras de 64 bits diseñadas como sucesoras de supercomputadoras o minicomputadoras de 32 bits, como la DEC Alpha y la Cray X1 .

El estándar C establece que se espera que un puntero tenga la representación habitual de una dirección. C también permite que se forme un puntero a cualquier objeto excepto un campo de bits; esto incluye cada elemento individual de una matriz de bytes. Los compiladores de C para computadoras que utilizan direccionamiento de palabras a menudo usan diferentes representaciones para punteros a diferentes tipos según su tamaño. Un puntero a un tipo que es lo suficientemente grande como para llenar una palabra será una dirección simple, mientras que un puntero como char*o void*será un puntero ancho: un par de la dirección de una palabra y el desplazamiento de un byte dentro de esa palabra. Por lo tanto, la conversión entre tipos de puntero no es necesariamente una operación trivial y puede perder información si se realiza incorrectamente.

structDebido a que no siempre se conoce el tamaño de una C al decidir la representación de un puntero a esa struct, no es posible aplicar de manera confiable la regla anterior. Es posible que los compiladores deban alinear el inicio de una structpara que pueda usar una representación de puntero más eficiente.

Ejemplos

Véase también

Referencias

  1. ^ Terry Greyzck, Cray Inc. Desafíos del compilador Cray X1 (y cómo los resolvimos)
  2. ^ "El Alpha AXP, parte 8: Acceso a la memoria, almacenamiento de bytes y palabras y datos no alineados". 16 de agosto de 2017.
  3. ^ "Alpha: La historia en hechos y comentarios - Alpha 21164 (EV5, EV56) y 21164PC (PCA56, PCA57)".