La memoria caché es una memoria pequeña y muy rápida que se utiliza para mejorar el rendimiento de los programas. En lugar de acceder a la memoria principal con lentas lecturas y escrituras, se usan algoritmos que predicen las zonas de la memoria principal con mayor probabilidad de ser direccionadas en el futuro próximo, y se llevan a la caché. El acierto a la hora de elegir estas políticas determinará una mayor o menor efectividad.
Las decisiones de organización de la memoria caché son varias. Tenemos diferentes políticas de emplazamiento: totalmente asociativa, de correspondencia directa, asociativa de dos vías, asociativa de cuatro vías, etc…
Totalmente asociativa
- Un bloque puede alojarse en cualquier marco de la memoria caché
- Cualquier dirección de DRAM puede copiarse en cualquier dirección de caché
- Se necesita leer todo el directorio en cada acceso
De correspondencia directa
- A cada bloque le corresponde un único marco de caché y sólo puede alojarse en este bloque
- DRAM dividida en páginas
- Sólo se lee una dirección cada vez
Asociativa de dos vías, cuatro vías, etc.
- La memoria se divide en conjuntos con un número determinado de marcos. A un determinado bloque le corresponde un único conjunto, pero dentro de él, puede alojarse en cualquier marco
- Es una solución intermedia
- DRAM dividida en páginas
- Varias opciones en caché
- Se realiza una lectura por cada entrada
- Se utiliza el algoritmo LRU
En general, para traducir las direcciones de memoria principal a un formato que tenga sentido en el caso de la memoria caché, una dirección de memoria se divide en tres partes:
- Etiqueta: Permite distinguir qué bloque de memoria se aloja en un determinado marco de lacaché.
- Índice: Es la parte de la dirección que indica el marco o conjunto que le corresponde a un determinado bloque según la asociatividad de la memoria caché.
- Offset: Desplazamiento de la palabra dentro del bloque.
- Índice: Es la parte de la dirección que indica el marco o conjunto que le corresponde a un determinado bloque según la asociatividad de la memoria caché.
- Offset: Desplazamiento de la palabra dentro del bloque.
Cuanto mayor sea la asociatividad de una memoria caché, mayor será la longitud de las etiquetas que deben almacenarse y compararse. Según la asociatividad de la memoria:
- Directa: El índice indica el marco que le corresponde a ese bloque de memoria.
- Asociativa: No existe este campo en la dirección, ya que el bloque puede alojarse en cualquier marco.
- Asociativa por conjuntos: El índice indica el conjunto que le corresponde a ese bloque de memoria.
Memoria principal y memoria caché |
Otra decisión importante es la política de reemplazamiento, para definir qué ocurre cuando tiene lugar un fallo. Si no se encuentra en caché un determinado bloque de memoria, habrá que traerlo. ¿Pero qué bloque sustituir?
En caché directa, no cabe ninguna duda del bloque que se reemplaza. En el resto de casos, tenemos varias opciones:
- Aleatoria: Se utiliza un generador de números aleatorios para escoger el bloque que se reemplaza.
- Last Recently Used (LRU): Se escoge el bloque que lleva más tiempo sin utilizarse.
- First In First Out (FIFO): Se reemplaza el bloque que lleva más tiempo en la caché.
- Least Frequently Used (LFU): Se sustituye aquel bloque que ha experimentado menos referencias.
También es necesario escoger la política de escritura que se va a utilizar en la memoria caché:
- Escritura directa (write-trough): Cuando se modifica un bloque, se realiza la escritura en la memoria caché y en la memoria principal.
- Post-escritura (copy-back): Cuando se modifica un bloque sólo se hace en la memoria caché. Cuando este bloque sea reemplazado, se actualizará el contenido de la memoria principal. Para no actualizar la memoria con cada reemplazamiento que se haga, suele utilizarse un bit que indica si el bloque que está en caché ha sido modificado (sucio) y por lo tanto debe actualizarse la memoria, o no (limpio).
- Con asignación en escritura (write allocate): Los fallos de escritura se comportan como los fallos de lectura y se resuelven.
- Sin asignación en escritura (no write allocate): Cuando se produce un fallo de escritura, el bloque se modifica directamente en la memoria principal y no se trae a la caché.
La política de búsqueda determina cuándo y qué bloque de memoria principal hay que traer a memoria caché. Existen dos políticas muy extendidas:
- Por demanda: Un bloque sólo se trae a memoria cache cuando ha sido referenciado y se produzca un fallo.
-Con prebúsqueda: Cuando se referencia el bloque i-ésimo de memoria principal, se trae además el bloque (i+1)-esimo. Esta política se basa en la propiedad de localidad espacial de los programas.
También se puede mejorar el rendimiento de la caché mediante técnicas de optimización:
- Reducir la penalización por fallo: Cachés multinivel, cachés de víctimas, Write Merging...
- Reducir la tasa de fallos: aumentar el tamaño de la caché, aumentar el tamaño del bloque, aumentar la asociatividad, técnicas de prebúsqueda...
- Aprovechar el paralelismo: segmentación de los accesos
- Reducir el tiempo de acierto (latencia): cachés pequeñas y sencillas, caché de trazas, optimizar las traducciones de dirección virtual a dirección física
Apuntes de 3º de Estructura de Computadores de la Universidad Complutense de Madrid
jajajajajajajajaja soyyyyyy yooooooo
ResponderEliminar