Comprensión profunda del principio de funcionamiento de Cache

El contenido principal de este artículo es el siguiente, que básicamente involucra el concepto de caché, su principio de funcionamiento y el contenido introductorio de mantener la coherencia.

1. ¿Por qué necesitas caché?

1.1 ¿Por qué necesitas caché?

Comencemos con una imagen para hablar de por qué se necesita Cache.

El gráfico anterior es el desarrollo del rendimiento de la CPU y el rendimiento del acceso a la memoria.

Podemos ver que con la evolución de la tecnología y el diseño, el rendimiento informático de la CPU ha experimentado cambios trascendentales, pero el desarrollo del rendimiento del almacenamiento DRAM no es tan rápido.

Entonces crea un problema de que el almacenamiento limita el desarrollo de la computación.

La capacidad y la velocidad no son compatibles.

¿Cómo resolver este problema? Puede comenzar calculando las leyes de acceso a los datos.

Solo peguemos un trozo de código:

for (j = 0; j < 100; j = j + 1)
    for( i = 0; i < 5000; i = i + 1)
        x[i][j] = 2 * x[i][j];

Se puede observar que debido a la existencia de una gran cantidad de ciclos, los datos a los que accedemos en realidad se encuentran en la misma memoria.

En otras palabras, profesionalmente hablando, los datos a los que accedemos tienen localidad.

Solo necesitamos poner estos datos en un almacenamiento pequeño y rápido para que se pueda acceder rápidamente a los datos relacionados.

En resumen, Cache es una pequeña unidad de almacenamiento diseñada para proporcionar acceso de almacenamiento de alta velocidad a la CPU y aprovechar la ubicación de los datos.

1.2 Caché en el sistema actual

Vamos a mostrar el Caché en el sistema real.

Como se muestra en la figura anterior, la arquitectura de almacenamiento de todo el sistema incluye registros de CPU, CACHE L1/L2/L3, DRAM y disco duro.

Al acceder a los datos, busque primero el registro, si no hay caché L1 en el registro, no hay caché L2 en el caché L1, y así sucesivamente, y finalmente busque el disco duro.

Al mismo tiempo, podemos ver el equilibrio entre la velocidad y la capacidad de almacenamiento. ¡Cuanto menor sea la capacidad, más rápida será la velocidad de acceso!

Entre ellos, es necesario aclarar un concepto.

La CPU y la memoria caché se transfieren por palabra, mientras que la transferencia de la memoria caché a la memoria principal se realiza por bloque, un bloque es de aproximadamente 64 bytes.

La composición general de la Caché en el SOC existente es la siguiente.

1.3 Clasificación de caché

El caché se puede dividir en varias categorías de acuerdo con diferentes estándares.

  • Dividido por tipo de datos: I-Cache y D-Cache. Entre ellos, I-Cache es responsable de colocar las instrucciones y D-Cache es responsable de los datos de modo. La mayor diferencia entre los dos es que los datos en D-Cache se pueden volver a escribir, mientras que I-Cache es de solo lectura.

  • Dividido por tamaño: dividido en caché pequeño y caché grande. El grupo sin vía (el grupo se presentará más adelante) <4 KB se denomina Caché pequeño, que se usa principalmente para Caché L1, y más de 4 KB se denomina Caché grande. Se utiliza principalmente para L2 y otra caché.

  • Dividido por ubicación: Caché interior y Caché exterior. En general, el caché interno pertenece a la microarquitectura de la CPU, como el CACHE L1 L2 en la figura anterior. Aquellas que no pertenecen a la microarquitectura de la CPU se denominan Caché exterior.

  • Dividido según la relación de datos: Caché inclusivo/exclusivo: el caché de nivel inferior contiene los datos de nivel superior llamados caché inclusivo. No contiene caché exclusivo. Por ejemplo, si hay datos en L2 Cache en L3 Cache, entonces L2 Cache se denomina caché exclusivo.

2. El principio de funcionamiento de Cache

Para aclarar el principio de funcionamiento de Cache, debe responder 4 preguntas:

  • Cómo se colocan los datos

  • Cómo consultar datos

  • Cómo se reemplazan los datos

  • Si se produce una operación de escritura, ¿cómo la gestiona la memoria caché?

2.1 Cómo se colocan los datos

Este problema también es fácil de resolver. Tomemos una simple castaña para ilustrar el problema.

Supongamos que tenemos 32 bloques en la memoria principal y nuestra caché tiene un total de 8 líneas de caché (una línea de caché contiene una línea de datos).

Supongamos que queremos poner el bloque 12 en la memoria principal en el Caché.

Entonces, ¿dónde debería colocarse en el caché?

tres métodos:

  • Totalmente asociativo. Se puede colocar en cualquier lugar del caché.

  • Mapeado directo. Solo se permite colocarlo en una determinada línea del caché. Como 12 mod 8

  • Grupo conectado (conjunto asociativo). Se puede colocar en ciertas líneas del caché. Por ejemplo, los grupos de 2 vías están conectados y hay 4 grupos en total, por lo que se puede colocar en una de las posiciones 0 y 1.

Puede verse que el mapeo directo y totalmente asociativo son dos casos extremos de asociatividad de conjuntos de caché.

Hay dos impactos principales de los diferentes métodos de colocación:

1. Cuanto mayor sea el número de grupos asociados al grupo, mayor será el circuito de comparación, pero la tasa de utilización de la memoria caché es mayor y la probabilidad de que se pierda la memoria caché es pequeña. 2. La cantidad de conexiones grupales se vuelve más pequeña y el caché a menudo se reemplaza, pero el circuito de comparación es relativamente pequeño.

Esto también es fácil de entender. Hay muchos lugares donde los bloques de la memoria se pueden colocar en el caché, por lo que es naturalmente problemático encontrarlos.

2.2 Cómo encontrar datos en el Caché

De hecho, encontrar datos es un proceso de comparación, como se muestra en la siguiente figura.

Nuestras direcciones están todas en Byte.

Sin embargo, la unidad de intercambio de datos entre cachés principales es un bloque (bloque, un bloque de un caché moderno es generalmente de unos 64 bytes). Entonces, la dirección es el desplazamiento del bloque para los últimos bits.

Dado que usamos la conexión de grupo, todavía hay algunos bits que representan en qué grupo está almacenado.

Hay algunos datos en el grupo y necesitamos comparar las etiquetas. Si hay etiquetas en el grupo, significa que los datos a los que estamos accediendo están en el caché y se pueden usar felizmente.

Por ejemplo, dé un ejemplo de conexión de grupo de 2 vías, como se muestra en la siguiente figura.

T significa Etiqueta. Al comparar directamente la etiqueta, puede saber si es un éxito o no. Si acierta, simplemente saque el bloque correspondiente según el índice (número de grupo).

Como se muestra en la fig. Utilice el índice para seleccionar qué grupo se encuentra en el grupo conectado. Luego compare las etiquetas en paralelo para determinar si están en el caché al final. La imagen de arriba es una conexión de grupo de 2 vías, es decir, dos grupos se comparan en paralelo.

¿Qué pasa si no está en el caché? Esto implica otra cuestión.

¿Cómo reemplazar Cache si no está en el caché?

2.3 Cómo reemplazar los datos en el Caché

¿Cómo se reemplazan los datos en el caché? Esto es relativamente simple y directo.

  • Reemplace aleatoriamente. Si se produce un error de caché, se reemplaza un bloque aleatoriamente.

  • Utilizado menos recientemente LRU. Los bloques utilizados más recientemente se reemplazan en último lugar.

  • Primero en entrar, primero en salir (FIFO), primero en entrar, primero en salir.

De hecho, el primero no se usa mucho, LRU y FIFO se pueden seleccionar de acuerdo con la situación real.

¿Cuándo se reemplazarán los datos en el caché? También hay varias estrategias.

  • No se reemplaza en este caché . Si la memoria caché falla, la dirección de acceso se envía directamente a la memoria principal y los datos obtenidos no se escribirán en la memoria caché.

  • Reemplazar al leer MISS . Si los datos no existen en la memoria caché durante la lectura, los datos se leen de la memoria principal y se escriben en la memoria caché.

  • Sustituir al escribir MISS . Si no hay tales datos en el caché al escribir, los datos se cargarán en el caché y luego se escribirán.

 Información a través del tren: ruta de aprendizaje de la tecnología del código fuente del kernel de Linux + video tutorial del código fuente del kernel

Aprendizaje a través del entrenamiento: código fuente del kernel de Linux, ajuste de memoria, sistema de archivos, gestión de procesos, controlador de dispositivo/pila de protocolo de red

2.4 Qué hacer si se produce una operación de escritura

El caché es un caché temporal después de todo.

Si ocurre una operación de escritura, los datos en el Caché y la memoria principal serán inconsistentes. ¿Cómo asegurarse de que la operación de escritura de datos sea correcta?

También hay tres estrategias.

  • Escribir a través de : escriba directamente los datos en el caché y vuelva a escribir en la memoria principal al mismo tiempo. Afecta mucho a la velocidad de escritura.

  • Reescritura : primero escriba los datos en el caché y luego vuelva a escribirlos en la memoria principal cuando se reemplacen los datos en el caché.

  • Cola de escritura simultánea : una combinación de escritura simultánea y reescritura. Primero escriba de nuevo en una cola y luego escriba lentamente en el almacenamiento principal. Si escribe los mismos datos varias veces, escriba directamente en esta cola. Evite escrituras frecuentes en la memoria principal.

3. Consistencia de caché

La coherencia de caché es un problema que se encuentra en Cache.

¿Por qué necesita Cache para manejar la consistencia?

Principalmente en un sistema de múltiples núcleos, si el núcleo 0 lee los datos en el almacenamiento principal y escribe los datos. Core 1 también lee los datos maestro-esclavo. En este momento, el núcleo 1 no sabe que los datos han cambiado, es decir, los datos en el caché del núcleo 1 están desactualizados y se producirá un error.

La garantía de la coherencia de la memoria caché es hacer que el acceso a múltiples núcleos esté libre de errores.

Hay dos estrategias principales para la consistencia de la memoria caché.

Estrategia 1: estrategia de coherencia basada en el seguimiento

Esta estrategia es que todos los cachés monitorean las operaciones de escritura de cada caché.Si se escriben los datos en un caché, hay dos formas de manejarlo.

Protocolo de actualización de escritura: cuando se escribe un caché, todos los cachés simplemente se actualizan.

Protocolo de invalidación de escritura: cuando se escribe un caché, se invalida el bloque de datos en otros cachés.

La estrategia 1 solo se usa en sistemas muy simples debido al alto costo de monitoreo.

Estrategia 2: estrategia de coherencia basada en directorios

Esta estrategia es mantener una tabla en la memoria principal. Registre en qué caché se ha escrito cada bloque de datos, para actualizar el estado correspondiente. En términos generales, esta estrategia se usa con más frecuencia. Se divide además en las siguientes estrategias comunes.

  • SI : Para un bloque de datos, hay dos estados: compartido e inválido. Si está en estado compartido, notifique directamente a otro Caché para invalidar el bloque correspondiente.

  • MSI : para un bloque de datos, hay tres estados: compartido, no válido y modificado. Entre ellos, la tabla de estado modificado indica que los datos solo pertenecen a este Caché y han sido modificados. Actualice la memoria principal cuando estos datos se desalojen de la memoria caché. La ventaja de hacer esto es evitar una gran cantidad de escrituras maestro-esclavo. Al mismo tiempo, si los datos se escriben cuando no son válidos, es necesario asegurarse de que el bit indicador de los datos en todos los demás cachés no sea M, y es responsable de volver a escribirlos primero en el almacenamiento principal.

  • MESI : Para un dato, hay 4 estados. modificado, inválido, compartido, exclusivo. El estado exclusivo se utiliza para identificar que los datos no dependen de otros cachés. Cuando desee escribir, simplemente cambie el estado de caché a M directamente.

Nos enfocamos en MESI. Línea negra en la figura: acceso a la CPU. Línea roja: acceso bus, otros accesos Caché.

Cuando el estado actual es el estado I, si se produce una operación de lectura del procesador prrd.

  • Si hay estos datos en otra memoria caché, si hay un estado M en otra memoria caché, primero escriba el estado M en la memoria principal y luego léalo. De lo contrario, lea directamente. El estado final se convierte en S.

  • Si no hay tales datos en otros cachés, cambia directamente al estado E.

El estado actual es el estado S.

  • Si ocurre una operación de lectura del procesador, todavía está en el estado S.

  • Si se ha producido una escritura del procesador, salte al estado M.

  • Si otros cachés tienen operaciones de escritura, salte al estado I.

Estado actual Estado E

  • Se ha producido una lectura del procesador o E.

  • Se produjo una escritura del procesador en M.

  • Si otras cachés tienen operaciones de lectura, cambian al estado S.

Estado actual Estado M

  • Cuando ocurre una operación de lectura, todavía está en el estado M.

  • Si ocurre una operación de escritura, todavía está en el estado M.

  • Si otros cachés tienen operaciones de lectura, vuelva a escribir los datos en el almacenamiento principal y cambie al estado S.

4. Resumen

Cache tiene una posición muy importante en la arquitectura de la computadora.Este artículo habla sobre el contenido principal de Cache, y los detalles específicos se pueden estudiar más de acuerdo con un punto determinado.

Supongo que te gusta

Origin blog.csdn.net/youzhangjing_/article/details/131555709
Recomendado
Clasificación