Lo primero que hay que decidir en un diseño de caché es la línea de
caché donde se debería almacenar un bloque cargado desde memoria. Pensemos en
un sistema que use direccionamiento de 32 bits. Si el tamaño de un bloque es de
64(2 elevado a 6)bytes, los 6 bits de la parte inferior de la dirección -el
offset- determina a que byte de dentro del bloque se esta direccionando. Si la
caché consta de 1024 de estas líneas de 64 bytes los siguientes 10 bits de la
dirección determina en que línea esta colocado el bloque . Los 16 bits de la
parte superior de la dirección -el tag- se guarda con al línea de la caché .
Una caché mapeada directamente almacena un tag por línea en su array de tags.
Por ejemplo una lectura la
caché utiliza los bits centrales de la dirección
como índice para su array de tags. El tag indicado se conforta luego con los 16
bits de la parte superior de la actual dirección. Si encajan, los datos que
indican el ofsset se envían a la CPU.
La ventaja que implica utilizar una cache directamente mapeada es que solamente se tiene que hacer una confrontación
por acceso a la caché.
El problema de una
caché directamente mapeada es que si dos bloques a los
que se accede frecuentemente mapean en la misma línea de caché, estarán todo
el tiempo expulsándose mutuamente de la caché.
El otro extremo en el diseño de caches es la
caché completamente
asociativa, en la que se puede colocar un bloque en cualquier línea de caché.
En este caso, la dirección simplemente se divide en bits inferiores, lo que
constituye el offset en la línea
de caché y los bits superiores que forman el tag que se confronta con
referencias superiores.
En el caso de una
caché asociativa, tiene que haber algún mecanismo para
decidir en que línea se coloca el bloque. En teoría se sustituye el bloque de
memoria menos utilizado últimamente LRU.
Una caché completamente asociativa resuelve los problemas de direcciones
en conflicto pero a costa de mucho hardware extra para comparar el tag con todas
las líneas de caché. Entre las caches directamente mapeadas y las
completamente asociativas es la
caché asociativa por conjuntos. Las líneas se dividen en conjuntos y los bits
centrales de la dirección determinan el conjunto en el que se colocan un
bloque. Dentro de cada conjunto, la caché es completamente asociativa. Además
de necesitar menos comparadores que una caché completamente asociativa, la de
tipo asociativa por conjuntos también facilita la implementación de la política
LRU. Por ejemplo, solo se precisa un bit para implementar una política LRU.
(c) 2000 Carlos Urzua Ruiz