En primer lugar, en una memoria caché asignada directamente, no hay nada que buscar. Esa es la razón principal por la que tal cosa sería utilizada. Cuando se produce un acceso a la memoria, la memoria caché asigna la dirección a un bloque. Luego se compara la etiqueta. Si coincide, es un golpe. De lo contrario es un fallo. Eso es lo que significa mapeado directo: no hay ningún conjunto allí para una búsqueda asociativa. (O, si lo desea, el tamaño establecido es 1).
El ejemplo que se le pide que resuelva es aún más simple, porque el tamaño del bloque es igual al tamaño de la palabra. El caché de 16 bytes contiene cuatro bloques y cuatro palabras. Esto significa que cada palabra es independiente: acceder y reemplazar una palabra no tiene efecto en ninguna palabra adyacente.
Esta es la razón por la cual la pregunta le da la secuencia de direcciones a las que se accede en código binario. Es un ejercicio de cómo entiendes bien el código binario, no de cómo entiendes los cachés.
La principal dificultad está en traducir al decimal: 7, 10, 2, 10, 7, 4, 4, 10, 4, 2. Una vez que tenemos eso, podemos ver claramente el patrón de acceso.
A continuación, tenemos que reducir cada una de estas direcciones módulo 4 para determinar a qué palabra / bloque se asigna: 7: 3, 10: 2, 2: 2, 10: 2, 7: 3, 4: 0, 4 : 0, 10: 2, 4: 0, 2: 2. (Aquí, puede ayudar mirar hacia atrás, hacia la representación binaria, donde tomamos los dos bits menos significativos). 7 va al bloque / palabra 3, 10 va a 2, y así sucesivamente.
Bien, 7: 3 es una falta, porque el caché está vacío, y hace que el bloque [3] mantenga 7. 7. 10: 2 es una falta, y así sucesivamente. Podemos hacer un gráfico que rastrea el estado del caché a medida que avanzan los accesos:
ACCESS 0 1 2 3 MISS NOTES
7 [ - - - 7 ] X
10 [ - - 10 7 ] X
2 [ - - 2 7 ] X 2 replaces 10 at [2]
10 [ - - 10 7 ] X 10 replaces 2 at [2]
7 [ - - 10 7 ] 7 matched at [3]
4 [ 4 - 2 7 ] X
4 [ 4 - 2 7 ] 4 matched at [0]
10 [ 4 - 10 7 ] X 10 fights with 2 again at [2]
4 [ 4 - 10 7 ] 4 matched again
2 [ 4 - 2 7 ] 2 replaces 10 at [2]
Todo lo que se asigna directamente es cuando el tamaño de palabra es el mismo que el tamaño de bloque: solo estamos reduciendo la dirección módulo 4 para determinar la ubicación en el caché. Si la dirección en la ubicación coincide con la que se tiene acceso, es un acierto, de lo contrario es un error: y la dirección a la que se accede sobrescribe la de la caché. (Por supuesto, la memoria caché no necesita la dirección completa; ¡solo los bits de la etiqueta! Esto se debe a que, por ejemplo, la dirección 6 no se puede asignar a la ranura [2]. Cuando la ranura [3] recuerda que ahora tiene la dirección 7, realmente necesita el 01
bits superior de 0111
, que son la etiqueta. El 11
inferior coincide estáticamente con el [3]. La etiqueta es aquellos bits de la dirección que son relevantes para identificar a qué área de la memoria pertenece la entrada de caché a.
¿Cuál es la tasa de éxito? 4 hits de 10 accesos: 40%. Mira, incluso el denominador está configurado para un cálculo de porcentaje fácil.
Si el caché estuviera organizado en bloques de varias palabras (digamos dos palabras), sería un poco más complicado. El acceso a 10, que se asigna a [2] no solo llevaría los datos de 10 a [2], sino que también traería los datos de 11 a [3]. Luego, el bloque [2..3] se etiquetará para indicar que contiene 10..11.