Memoria caché
Es una memoria rápida, cara y pequeña, formada por biestables.
Se encuentra situada entre el procesador y la memoria principal. En principio se puede considerar que funciona como un buffer de la memoria principal.
La caché se usa para almacenar una copia de aquellas palabras de la memoria principal que están siendo usadas actualmente (y que son las que se usarán con mayor probabilidad en un futuro cercano), ya que, debido a su reducido tamaño, no podemos almacenar toda la información que nuestro programa necesita.
La memoria caché trabaja almacenando los datos en sus chips, que son tomados de ella por la CPU cuando los necesita; al encontrarlos en la caché, se ahorra tener que ir a buscarlos a la RAM, redundando en un considerable ahorro de tiempo.
El procesador, cuando tiene que acceder a memoria, siempre mira antes si la información que busca se encuentra en la memoria caché. Pueden darse dos posibilidades:
- La información solicitada se encuentra en la caché: lee la copia en caché
- La información solicitada no se encuentra en la caché (fallo de caché): lee en la memoria principal la información buscada y guarda una copia en la caché. A la hora de escribir el nuevo dato en la caché pueden ocurrir dos cosas:
- Hay espacio libre en la caché: se escribe el dato en las posiciones libres.
- No hay espacio libre en la caché: hay que buscar el dato a sustituir por el que acaba de llegar. Si algún dato de los que se van a sacar ha sido modificado, se debe actualizar la copia en memoria del mismo.
-
Niveles de caché
Los ordenadores actuales suelen montar hasta tres niveles de caché:
- L1: caché interna asociada a los núcleos de la CPU. Es utilizada para almacenar y acceder a datos e instrucciones importantes y de uso frecuente, agilizando los procesos al ser el nivel que ofrece un tiempo de respuesta menor. Se divide en dos subniveles:
- Nivel 1 Data Cache: se encarga de almacenar datos usados frecuentemente.
- Nivel 1 Instruction Cache: se encarga de almacenar instrucciones usadas frecuentemente.
- L2: caché interna al microprocesador, pero comúnmente compartida por varios núcleos al mismo tiempo.
- L3: este nivel de caché suele ser de menor velocidad y mayor capacidad que las anteriores y frecuentemente se sitúa dentro del encapsulado del procesador, pero en su periferia, compartida por todos los núcleos del mismo.
-
Localidad de referencia
Los programas manifiestan una propiedad que se explota en el diseño del sistema de gestión de memoria de los computadores en general y de la memoria caché en particular, la localidad de referencias: los programas tienden a reutilizar los datos e instrucciones que utilizaron recientemente. Una regla empírica que se suele cumplir en la mayoría de los programas revela que gastan el 90% de su tiempo de ejecución sobre sólo el 10% de su código. Una consecuencia de la localidad de referencia es que se puede predecir con razonable precisión las instrucciones y datos que el programa utilizará en el futuro cercano a partir del conocimiento de los accesos a memoria realizados en el pasado reciente. La localidad de referencia se manifiesta en una doble dimensión: temporal y espacial.
-
Localidad temporal
las palabras de memoria accedidas recientemente tienen una alta
probabilidad de volver a ser accedidas en el futuro cercano. La localidad temporal de los programas
viene motivada principalmente por la existencia de bucles.
-
Localidad espacial
las palabras próximas en el espacio de memoria a las recientemente referenciadas tienen una alta probabilidad de ser también referenciadas en el futuro cercano. Es decir, que las palabras próximas en memoria tienden a ser referenciadas juntas en el tiempo. La localidad espacial viene motivada fundamentalmente por la linealidad de los programas (secuenciamiento lineal de las instrucciones) y el acceso a las estructuras de datos regulares.
-
Diseño
En el diseño de la memoria caché se deben considerar varios factores que influyen directamente en el rendimiento de la memoria y por lo tanto en su objetivo de aumentar la velocidad de respuesta de la jerarquía de memoria. Estos factores son las políticas de ubicación, extracción, reemplazo y escritura.
-
Política de ubicación
Decide dónde debe colocarse un bloque de memoria principal que entra en la memoria caché. Las más utilizadas son:
Directa: al bloque i-ésimo de memoria principal le corresponde la posición i módulo n, donde n es el número de bloques de la memoria caché. Cada bloque de la memoria principal tiene su posición en la caché y siempre en el mismo sitio. Su inconveniente es que cada bloque tiene asignada una posición fija en la memoria caché y ante continuas referencias a palabras de dos bloques con la misma localización en caché, hay continuos fallos habiendo sitio libre en la caché.
Asociativa: los bloques de la memoria principal se alojan en cualquier bloque de la memoria caché, comprobando solamente la etiqueta de todos y cada uno de los bloques para verificar acierto. Su principal inconveniente es la cantidad de comparaciones que realiza.
Asociativa por conjuntos: cada bloque de la memoria principal tiene asignado un conjunto de la caché, pero se puede ubicar en cualquiera de los bloques que pertenecen a dicho conjunto. Ello permite mayor flexibilidad que la correspondencia directa y menor cantidad de comparaciones que la totalmente asociativa.
-
Política de extracción
La política de extracción 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 solo se trae a memoria caché cuando ha sido referenciado y no se encuentre en memoria caché.
- Con prebúsqueda: cuando se referencia el bloque i-ésimo de memoria principal, se trae además el bloque (i+1)-ésimo. Esta política se basa en la propiedad de localidad espacial de los programas.
-
Política de reemplazo
-
Determina qué bloque de memoria caché debe abandonarla cuando no existe espacio disponible para un bloque entrante. Básicamente hay cuatro políticas:
- Aleatoria: el bloque es reemplazado de forma aleatoria.
- FIFO: se usa el algoritmo First In First Out (FIFO) (primero en entrar primero en salir) para determinar qué bloque debe abandonar la caché. Este algoritmo generalmente es poco eficiente.
- Usado menos recientemente (LRU): sustituye el bloque que hace más tiempo que no se ha usado en la caché, traeremos a caché el bloque en cuestión y lo modificaremos ahí.
- Usado con menor frecuencia (LFU): sustituye el bloque que ha experimentado menos referencias.