Jerarquía de Memoria (Memoria Caché) - stefano-sosac/arquitectura-de-computadoras GitHub Wiki

Jerarquía de Memorias

Se define como jerarquía de memorias, en arquitectura de computadoras, a la relación que existe entre los tiempos de acceso a los distintos tipos de memorias y la capacidad de almacenamiento. Dicha relación es inversamente proporcional, ello se debe a la complejidad y al costo que existe en la fabricación de memorias.

En la Figura 1 se muestra una organización triangular de la jerarquía de memoria. Las memorias más cercanas al vértice superior tienden a ser de menor tamaño; sin embargo, tienen un mejor rendimiento y un costo más alto por bit que las memorias más cercanas a la base. En el nivel L0 hay registros a los que el CPU puede acceder en un ciclo de reloj. Luego, hay una o más memorias caché basadas en SRAM a las que se pueden acceder en unos cuantos ciclos de reloj del CPU. Estos son seguidos por una memoria principal basada en DRAM a la que se accede de decenas a cientos de ciclos de reloj de CPU. Seguido están discos locales lentos, pero de gran capacidad. Finalmente, algunos sistemas incluyen un nivel adicional de discos en servidores remotos a los que se puede acceder de una red. Como regla general deducimos que cuanto más rápida es la memoria, mayor es el costo de almacenamiento por bit.

jerarquia Figura 1. Modelo de jerarquía de memoria

Hoy en día, las computadoras incluyen una pequeña cantidad de memoria de muy alta velocidad denominada caché, donde los datos de las ubicaciones de uso frecuente pueden almacenarse temporalmente. El presente material pretende mostrar como la caché mejora la velocidad de acceso efectiva de la memoria.

Memoria Caché

La memoria caché es un tipo de memoria pequeña de alta velocidad, es decir, de alto costo, y que sirve como buffer para los datos a los que se accede. El tiempo de acceso a estos datos es mucho menor que el tiempo de acceso a RAM o al disco duro, y solo el tiempo de acceso a los registros del CPU es menor.

La computadora no tiene forma de saber, a priori, a qué datos es más probable que se acceda, por lo que utiliza el principio de localidad y transfiere un bloque completo de la memoria principal a la caché. El principio de localidad brinda la oportunidad para que el sistema use una pequeña cantidad de memoria muy rápida para así reducir el tiempo de lectura de datos. Hay dos formas principales de localidad y se definen a continuación:

  • Localidad temporal: Los elementos a los que se accedió recientemente tienden a ser accedidos nuevamente en el futuro cercano.

  • Localidad espacial: Si se accede a una posición de memoria una vez, es probable que el programa acceda a una ubicación de memoria cercana.

Los programas que emplean buenas prácticas de localidad tienen menor tiempo de ejecución. Considera la siguiente función, la cual suma los elementos de un vector.

int sumvec(int* v, int N)
{
  int i, sum = 0;

  for(i = 0; i < N; i++)
    sum += v[i];
  return sum;
}

Se escribe en a variable sum una vez en cada iteración; por lo tanto, la función presenta una buena localidad temporal con respecto a sum; sin embargo, dado que sum es escalar, la función carece de una localidad espacial para dicha variable. Por otro lado, los elementos del vector v se leen secuencialmente, uno tras otro, en el orden en que se almacenan en la memoria. Debido a esto, con respecto al arreglo v, tiene buena localidad espacial, pero pobre localidad temporal.

Las lecturas secuenciales son importantes en los programas que hacen referencias a arreglos. Por ejemplo, considere la función sumarrayitems, que suma los elementos de un arreglo bidimensional.

int sumarrayitems(int **a, int M, int N)
{
    int i, j, sum = 0;

    for (i = 0; i < M; i++)
        for (j = 0; j < N; j++)
            sum += a[i][j];
    return sum;
}

Suponga que los elementos del arreglo bidimensional a están escritos en memoria fila por fila (row-major). Para este caso la forma en como se leen los datos tiene un buen impacto en la localidad espacial, pues el doble bucle lee los elementos fila por fila (row-view). Digamos que se realiza un cambio mínimo, y en lugar de leer el arreglo fila por fila, se hace columna por columna (column-view).

int sumarrayitems(int **a, int M, int N)
{
    int i, j, sum = 0;

    for (j = 0; j < N; j++)
        for (i = 0; i < M; i++)
            sum += a[i][j];
    return sum;
}

El resultado numérico en la variable sum será el mismo, pero debido a que la lectura de los elementos se realiza de una forma que no se corresponde con la forma en que están escritos, la función tendrá un mayor tiempo de ejecución.

Reglas simples para evaluar cualitativamente la localidad en un programa:

  • Los programas que acceden repetidamente a la mismas variables disfrutan de una buena localidad temporal.
  • Para programas con bucles que incluyan matrices multidimensionales secuenciales, cuanto más pequeño sea el salto secuencial, mejor será la localidad espacial. Los programas con saltos grandes alrededor de la memoria presentan una localidad espacial pobre.
  • Los bucles tienen una buena ubicación temporal y espacial con respecto a lectura de instrucciones. Cuanto más pequeño sea el cuerpo del bucle y mayor sea el número de iteraciones del bucle, mejor será la localidad.

En lo referente a las memorias caché, cuando se quiere acceder a un dato y este es encontrado, se dice que se ha producido un acierto o hit y en caso de que dicho dato no sea encontrado dentro de la caché se produce un fallo o miss. Esto último ocasiona que el dato deba ser buscado en el siguiente nivel de memoria como RAM o disco duro, los cuales poseen un tiempo de acceso más lento. De esta manera, la ejecución del programa tiene un mayor tiempo de ejecución.

Es por eso que muchos algoritmos no solo se basan en la lógica de la resolución del problema en sí, sino que también organizan la estructura de acceso a datos de tal manera que, si algunos valores deben ser reutilizados para futuras operaciones, estos puedan aprovechar la localidad tanto espacial como temporal para la mejora del tiempo de ejecución del programa.

Tiempo de acceso promedio

El tiempo de acceso promedio permite estimar cuánto tiempo es la respuesta en la búsqueda de un elemento a petición del procesador. Ante ello, es necesario definir algunos términos adicionales:

  • Hit rate: Porcentaje de acceso a memoria encontrado en un nivel de memoria.
  • Miss rate: Porcentaje de acceso a memoria no encontrado en un nivel de memoria (Miss rate = 1-Hit rate).

Ejemplo

La arquitectura de un procesador contempla 2 niveles en memoria (memoria caché y memoria principal). Se sabe que el tiempo de acceso al nivel 1 es de 0.01 us. Así mismo, el nivel 2 tiene un tiempo de acceso de 0.1 us. Se sabe que el Hit Ratio del primer nivel es de 95%, se le pide hallar el tiempo de acceso promedio:

Solución:

Para solucionar este problema, se debe considerar los casos en los que la información se encuentra en el primer nivel. Así mismo, se debe considerar el ratio de fallo. Esto implica considerar que hubo una búsqueda del primer nivel y después se tuvo que bajar al siguiente nivel. En ese sentido, el tiempo de acceso promedio estará definido de la siguiente manera:

Tacc = HR(t1) + MR(t1+t2)

Reemplazando valores:

Tacc = 95%(0.01 us) + 5%(0.01 us + 0.1 us) = 0.015 us

Mapeo de datos a la Memoria Caché

Para entender claramente el funcionamiento de la MC debemos realizar las siguientes preguntas desde el punto de vista del procesador:

¿Está el elemento en la caché? ¿Cómo encontrar un elemento en la caché?

La respuesta a estas preguntas está en definir primero qué tipo de mapeo de memoria ha sido utilizado.

  1. Mapeo Directo
  2. Mapeo Asociativo
  3. Mapeo Asociativo por N-vías Así mismo, es importante definir los siguientes términos:
  • Bloque: Es la unidad que almacena una determinada cantidad de bytes. Cuando se hace referencia a una dirección que no se encuentra en la caché, se debe llevar todo el bloque que contiene la dirección a la memoria caché. Algunos autores también denominan que la palabra bloque se conoce como línea en el caso específico de la caché. Por tanto, es equivalente decir "el tamaño de bloque" como "el tamaño de línea de la caché".

  • Desplazamiento: Es el número que indica cuántas palabras (típicamente bytes) hay en un bloque de caché.

  • Etiqueta: Se usa para identificar si los datos que se buscan están en la caché y para verificar si la información es la correcta. La cantidad de bits destinada a la etiqueta dependerá del tamaño de la memoria principal, así como del tipo de mapeo.

Mapeo Directo

Es la forma más sencilla de asignar una posición de la caché a cada valor de palabra de la memoria principal. Consiste en asignar una posición de la caché basándose en la dirección de dicha palabra. Este método se denomina Mapeo directo, puesto que cada posición de MP se mapea “directamente” con una posición en la memoria caché.

Se debe recordar que toda dirección de memoria está compuesta por bits. Esto significa que, por ejemplo, si una memoria tiene capacidad de 4 MiB y es direccionable por byte, existirán 2^22 direcciones. Cada dirección tendrá la misma cantidad de bits para ser representada.

Por tanto, para determinar el formato que me permite almacenar un dato en la memoria caché, conociendo la dirección de memoria a la que se hace referencia se debe hacer el uso del formato de mapeo directo. El formato consiste en descomponer la dirección física en 3 campos: Etiqueta, Bloque y Desplazamiento, en ese orden. Cada campo tendrá asignado un número de bits dependiendo las características de la memoria caché.

Ejemplo

La memoria principal de un sistema es direccionable por byte y cuenta con 4 bloques de memoria. La memoria caché del mismo sistema cuenta con 2 bloques de 4 bytes cada una y originalmente se encuentra vacía. Se le pide determinar el formato de mapeo directo.

Solución: Lo primero que se debe realizar es un bosquejo tanto de la memoria principal como de la memoria caché. En este caso, el enunciado menciona que la memoria principal es direccionable por byte, lo que significa que cada dirección alamcena 1 byte. Además, menciona que tiene 4 bloques. Por otro lado, menciona que la caché cuenta con 2 bloques de 4 bytes cada uno. Entonces, es importante mencionar que el tamaño de bloque de la RAM y de la caché es siempre el mismo. Por tanto, se concluye que el tamaño de la memoria principal es de 16 bytes. Así mismo, el tamaño de la memoria caché es de 8 bytes. El bosquejo de este ejercicio se visualiza en la Figura 2. Note que para fines didácticos, estamos llenando la información que debe existir en la RAM con letras.

image

Figura 2. Bosquejo de Memoria RAM y caché del ejemplo

Para hallar el formato de mapeo directo, se necesitan conocer 4 datos:

  1. Cantidad de bits para representar la dirección física
  2. Cantidad de bits para representar la desplazamiento
  3. Cantidad de bits para representar la bloque
  4. Cantidad de bits para representar la etiqueta

Resolveremos cada uno de los requerimientos para lograr el formato deseado

  1. Si el tamaño de la RAM es de 16 bytes, existen 16 direcciones de memoria. Por tanto, la cantidad de bits totales para representar todas las direcciones de memoria serían 4. Recordar que las direcciones van desde 0x0 hasta 0xF; por tanto, 4 bits es suficiente para esto. Alternativamente, puede concluir que es simplemente el logaritmo en base 2 del tamaño de la RAM.
  2. Este dato suele ser el más sencillo. Para hallarlo, solo se debe poner atención en la cantidad de bytes del bloque de la caché. En este caso, el enunciado dice que cada bloque contiene 4 bytes; por tanto, hay 4 opciones para seleccionar uno de los 4 bytes. La cantidad de bits para representar 4 opciones es 2. Alternativamente, puede concluir que es simplemente el logaritmo en base 2 del tamaño del bloque.
  3. En mapeo directo este dato se obtiene de la cantidad de bloques de la caché. Por tanto, si la caché tiene solo 2 bloques, solo se necesita 1 bit para elegir si es bloque 0 (B0) o bloque 1 (B1).
  4. La etiqueta siempre es la cantidad de bits sobrantes entre el número de bits necesario para representar las direcciones físicas menos los bits de desplazamiento y bloque. Por tanto, para el ejemplo, sería 4-2-1 = 1, siendo 1 bit la respuesta.

Finalmente, el formato de mapeo directo quedaría de la siguiente manera:

Etiqueta (1) Bloque (1) Desplazamiento (2)

Ahora que ya se cuenta con el formato, es posible entender cómo funciona la interacción entre ambas memorias y el procesador. Para ello, se extenderá el ejemplo anterior.

Suponer que el procesador hace un requerimiento de memoria de la dirección 0x3. Siguiendo la jerarquía de memoria, la búsqueda debe realizarse primero en la caché. El procedimiento, siguiendo el formato previamente hallado, implica hallar el equivalente en bits de la dirección requerida y buscar el bloque de interés. En este caso:

Dirección Hexadecimal Dirección en binario Etiqueta (1) Bloque (1) Desplazamiento (2) Hit/Miss
0x3 0011 0 0 11 Miss

Como se observa el formato indica que se debe buscar en el B0 si se encuentra la etiqueta 0. Dado que la memoria caché inicialmente se encuentra vacía, al realizar este requerimiento se generará un fallo (Miss). Por tanto, lo siguiente es buscar en el siguiente nivel de la jerarquía del sistema, en este caso, la RAM. En dicho nivel efectivamente se encuentra la dirección 0x3. Hay que recordar que la información se traslada por bloque, entonces, para este ejemplo se tomará la información que se encuentra contenida en el bloque que contiene las direcciones desde la 0x0 hasta la 0x3. Ahora el estado de la memoria caché queda como se muestra en la Figura 3. image

Figura 3. Estado de la caché después de realizar el llamado a la dirección 0x3

Como se observa, ahora la caché contiene los datos del primer bloque de la RAM. Así mismo, se le ha asignado al bloque 0 (B0) la etiqueta 0. Para un mejor entendimiento, se seguirá extendiendo el ejemplo. Ahora, imaginar que el procesador hace un requerimiento a la dirección 0x2, entonces, se hará uso del formato para ubicar qué debe buscar en la caché:

Dirección Hexadecimal Dirección en binario Etiqueta (1) Bloque (1) Desplazamiento (2) Hit/Miss
0x2 0010 0 0 10 Hit

El formato indica que se debe hacer la búsqueda en el B0 y se debe evaluar si la etiqueta asignada es 0. En este caso, tal como se observa en la Figura. 3, el B0 tiene asignada la etiqueta 0, por tanto, se produce un Hit lo que indica que sí se encontrará el dato que se busca. Una vez producido el Hit ahora se usará el dato de desplazamiento. Según el formato, el desplazamiento es de 10 lo que es equivalente a la posición 2 dentro del bloque. Entonces el dato se buscará en esa posición. Para fines ilustrativos, se ha colocado los desplazamientos de cada elemento en cada byte de B0 en la Figura. 4 image

Figura 4. Ubicación del dato requerido después de hacer referencia a la dirección 0x2.

Como se observa, para este requerimiento no se tuvo que hacer uso de la memoria RAM. Lo que muestra la utilidad de usar la caché.

A continuación, se le invita a brindar el estado final de la memoria caché para los accesos a las direcciones: 0x6, 0xA, 0xD y 0x5

Mapeo Asociativo

El mapeo asociativo utiliza la memoria caché para almacenar datos de tal manera que cualquier bloque de datos de la memoria principal pueda ir a cualquier lugar de la caché. A diferencia del mapeo directo, el mapeo asociativo solo utiliza etiquetas para encontrar el bloque de interés. Siendo así, el formato consiste en descomponer la dirección física en 2 campos: Etiqueta y Desplazamiento, en ese orden.

Los bloques se llenan de forma consecutiva iniciando desde el primer bloque. Cuando la memoria caché está llena, se utiliza un algoritmo de reemplazo. Entre los algoritmos más comunes se utilizan:

  1. First In First Out (FIFO)
  2. Least Recently Used (LRU)
  3. Least Frequently Used (LFU)
  4. Random

Ejemplo

Se utilizarán los mismos datos del ejemplo presentado en mapeo directo, con la diferencia que ahora se utilizará mapeo asociativo. Por tanto, para hallar el formato, se necesitan identificar los siguientes datos:

  1. Cantidad de bits para representar la dirección física
  2. Cantidad de bits para representar la desplazamiento
  3. Cantidad de bits para representar la etiqueta

Por tanto el formato quedaría de la siguiente manera:

Etiqueta (2) Desplazamiento (2)

Una vez identificado el formato partiremos nuevamente de la distribución mostrada en la Figura 2 (memoria caché vacía). Por tanto, si se realiza el llamado a la dirección 0x3, debería suceder lo siguiente:

Dirección Hexadecimal Dirección en binario Etiqueta (2) Desplazamiento (2) Hit/Miss
0x3 0011 00 11 Miss

Como se observa, ahora la etiqueta contiene los bits 00. Por tanto, si bien el contenido es el mismo que el mapeo directo el almacenamiento de la etiqueta es diferente (Ver Figura 5). image

Figura 5. Estado de la memoria caché después de llamar a la dirección 0x3 usando mapeo asociativo

Para un entendimiento adecuado de cómo realizar el reemplazo del bloque, se llamarán a las direcciones 0xA y 0xE de forma consecutiva. Por tanto:

Dirección Hexadecimal Dirección en binario Etiqueta (2) Desplazamiento (2) Hit/Miss
0xA 1010 10 10 Miss

En este caso, se produce un miss debido a que la etiqueta 10 no se encuentra en ningún bloque. Entonces el estado de la memoria caché queda como en la Figura 6: image

Figura 6. Estado de la memoria caché después de llamar a la dirección 0xA usando mapeo asociativo

En el llamado a 0xE:

Dirección Hexadecimal Dirección en binario Etiqueta (2) Desplazamiento (2) Hit/Miss
0xE 1110 11 10 Miss

También se produce un Miss debido a que la etiqueta 11 no está asociada a ningún bloque de la caché; sin embargo, la caché ya se encuentra llena y se debe reemplazar un bloque. Para efectos prácticos se utilizará el algoritmo de reemplazo FIFO que consiste en saber cuál de los bloques fue el primero en entrar ya que ese será el primero en salir. Para nuestros accesos, el primer bloque en entrar fue B0; por tanto, el estado final de la memoria caché queda implica el reemplazo de este bloque (ver Figura 7).

image

Figura 7. Estado de la memoria caché después de llamar a la dirección 0xE usando mapeo asociativo

A continuación, se le invita a brindar el estado final de la memoria caché para los accesos a las direcciones: 0x6, 0xA, 0xD y 0x5.

Mapeo Asociativo por N - vías

El mapeo asociativo por N-vías tiene como objetivo combinar los dos enfoques anteriores. Para ello, la propuesta del formato cambia a lo siguiente:

  1. Cantidad de bits para representar la dirección física
  2. Cantidad de bits para representar la cantidad de conjuntos
  3. Cantidad de bits para representar la desplazamiento
  4. Cantidad de bits para representar la etiqueta

La idea de este mapeo es establecer cuántas vías existen en cada conjunto. Para ello, se define vías como la cantidad de bloques que existen en cada conjunto.

Ejemplo

Un sistema direccionable por byte cuenta con 16 MiB de almacenamiento. Adicionalmente, cuenta con una memoria caché de 32 KiB de tamaño y cada bloque de la caché cuenta con una capacidad de 128 bytes. Si el sistema utiliza un mapeo de 16 vías, hallar el formato correspondiente.

Solución: Por dato, la cantidad de bits que se necesita para representar todas las direcciones físicas es de 24 bits. Además, si el tamaño de la caché es de 32 KiB y cada bloque tiene una capacidad de 128 bytes, entonces hay 256 bloques en caché. Dado que se está utilizando 16 vías, significa que cada conjunto almacenará 16 bloques; por tanto, hay un total de 16 conjuntos. Siendo así, el formato quedaría de la siguiente manera:

Etiqueta (13) Conjunto (4) Desplazamiento (7)

Recordar que el valor de la etiqueta es siempre la cantidad sobrante de bits.

Ejercicio

Una computadora direccionable por byte tiene una Memoria Caché que consta de 8 bloques de 4 bytes cada uno. Si cada dirección se puede representar con 8 bits y la MC está originalmente vacía. Se le pide lo siguiente:

  • Formato de mapeo directo, asociativo y asociativo por 2 vías.

  • Realizar un bosquejo de la MC cuando la memoria accede a las siguientes direcciones: 0x06, 0x0A, 0x0B,0x0C, 0x1A, 0x1F, 0x05, 0x08, 0x01F. Utilizando los mapeos previos. En caso necesite reemplazar algún bloque en los mapeos asociativos se debe utilizar FIFO. Además, hallar el hit y el miss ratio.

Características de la Jerarquía de Memoria en una computadora

Niveles de memoria caché, tamaños y mapeos

getconf -a | grep CACHE

Políticas de Escritura de Caché

Las políticas de escritura de caché se refieren a cómo se gestionan los datos entre la caché y la memoria principal cuando se realizan operaciones de escritura. Estas políticas son fundamentales para el rendimiento y la coherencia de los sistemas de computadoras.

Write-Through

Esta política asegura que todas las escrituras a la caché se realicen simultáneamente en la memoria principal. Esto mantiene la coherencia de los datos, pero puede resultar en escrituras más lentas debido a que se pueden generar cuellos de botella.

Write-back

En write-back, las escrituras se realizan solo en la caché. La actualización en la memoria principal se retrasa hasta que el bloque de caché necesita ser reemplazado. Esto se marca con un "dirty bit". Cuando el bloque se reemplaza, si el dirty bit está activado, entonces se escribe en la memoria principal, de lo contrario, la data se perdería.

Write-Allocate

La política de write-allocate se usa junto con write-back. Cuando se escribe en una dirección de memoria que no está en la caché, se carga ese bloque en la caché antes de realizar la escritura en la memoria principal. Este enfoque es opuesto al de write-around.

Write-Around

Con la política de write-around, las escrituras se realizan directamente en la memoria principal, omitiendo la caché. Esto evita llenar la caché con datos que no se van a reutilizar, lo que puede ser útil si la escritura es única y no se espera que se lea pronto.

Ejercicios de aplicación

A continuación, se dará un conjunto de ejercicios relacionados a la explicación del tema.

Ejercicio 1

Un sistema tiene una memoria caché, memoria principal y un disco utilizado para la memoria virtual. Si una palabra referenciada se encuentra en la caché, se requieren 20 ns para acceder a ella. Si está en la memoria principal pero no en la memoria caché, se necesitan 60 ns para cargarla en la memoria caché y, a continuación, la referencia se inicia. Si la palabra no está en la memoria principal, se requieren 12 ms para recuperar la palabra del disco, seguido de 60 ns para copiarla en la memoria caché y, a continuación, se inicia la referencia. La proporción de aciertos de caché es 0.9 y la tasa de aciertos de memoria principal es 0.6. ¿Cuál es el tiempo promedio en nanosegundos requerido para acceder a una palabra referenciada en este sistema?

Ejercicio 2

En una memoria de dos niveles se ha visto que la relación entre el tiempo de acceso promedio tiene una relación linealmente dependiente con los tiempos de acceso de ambos niveles. Con esta premisa, es posible definir la eficiencia de acceso (E) cuyo valor es igual a la división entre el tiempo de acceso al nivel 1y el tiempo de acceso promedio. Esta es una medida de qué tan cerca está el tiempo de acceso promedio al tiempo de acceso del nivel 1. Siendo así, se le pide lo siguiente:

a) Plantear la ecuación que define la eficiencia de acceso (E) en función de T1, T2 y H (ratio de aciertos del nivel 1).

b) Si sabemos que R es igual a la relación directamente proporcional entre el tiempo de acceso al nivel 2 y el tiempo de acceso al nivel 1, se le pide realizar una gráfica “Eficiencia de acceso (E)” vs “Hit Ratio (H)” para valores de R iguales a 1, 10,100 y 1000.

c) En función al gráfico realizado en (b), analizar la verdad o falsedad de la siguiente oración: “Cuando H se encuentra cerca al valor de 90% se puede afirmar que la eficiencia de acceso podría satisfacer un rendimiento aceptable”

d) Si tenemos un sistema en donde se sabe que R=10, H=0.94 y T2= 0.1us ¿cuál es el valor del tiempo de acceso al nivel 1?

Ejercicio 3

El nivel L1 de la memoria caché tiene un tiempo de acceso de 1 ns y un ratio de acierto H=0.95. Asumiendo que es posible cambiar el diseño de la caché (tamaño, organización, entre otros) de tal manera que es posible incrementar el ratio de aciertos a H=0.97 pero esto conllevaría a que el tiempo de acceso aumente a 1.5 ns.

a) ¿Qué condición con respecto al tiempo de acceso al siguiente nivel debería cumplirse para que el cambio realizado implique una mejora en el rendimiento?

b) Considerando la respuesta brindada en a) ¿Resulta razonable realizar una relación directa entre el tiempo de acceso de niveles más bajos en la jerarquía con el acierto del primer nivel?

Ejercicio 4

Se tiene un sistema direccionable por byte que cuenta con memoria caché de 512KiB y una memoria principal de 8GiB. Este sistema usa mapeo directo. Si se sabe que 4 elementos tipo double conforman un bloque, ¿cuál es el formato asociado a este sistema?

Ejercicio 5

Se tiene un sistema direccionable por byte que cuenta con memoria caché de 2MiB y una memoria principal de 4GiB. Este sistema usa mapeo por 16 vías. Si se sabe que un bloque puede almacenar 8 elementos completos tipo unsigned int, ¿cuál es el formato asociado a este sistema?

Ejercicio 6

Un sistema que es direccionable por byte tiene una memoria principal de 1 MiB capacidad y una memoria caché de 32 bloques de 16 bytes cada uno. Determinar la ubicación de la dirección de MP 0x326A0 en la memoria caché si se utiliza:

  1. Mapeo directo
  2. Mapeo asociativo
  3. Mapeo asociativo por 8 vías