Aprendizaje de la serie Memory (4): Introducción general a la memoria caché y al búfer de escritura

prefacio

La memoria caché es una pequeña cantidad de memoria estática SRAM (RAM estática) de ultra alta velocidad ubicada entre la CPU y la memoria principal, es decir, DRAM (RAM dinámica, memoria dinámica). Acceso de direccionamiento directo.

Con el desarrollo de la ciencia y la tecnología y la mejora de la tecnología de producción, la capacidad de la memoria caché en los procesadores de alto rendimiento será cada vez mayor y el número de etapas aumentará, lo que mejorará en gran medida el rendimiento del sistema.

1 Introducción general a la memoria caché y al búfer de escritura

1.1 Principio de funcionamiento de la caché

Para una computadora con caché, cuando la CPU necesita acceder a la memoria, primero verifica si los datos requeridos están en el caché. Si existe, se puede acceder directamente a los datos sin insertar ningún estado de espera.Este es el mejor de los casos, llamado hit de alta velocidad;

Cuando la información requerida por la CPU no está en el Caché, es necesario cambiar para acceder a la memoria principal. Debido a la baja velocidad, debe insertarse y esperar. Esta situación se denomina pérdida de alta velocidad;

Cuando la CPU accede a la memoria principal, la información de almacenamiento se escribe en la memoria caché al mismo tiempo de acuerdo con el principio de optimización para garantizar el próximo acceso posible a la memoria caché.

Por lo tanto **, los mismos datos pueden almacenarse en la memoria principal y en la memoria caché al mismo tiempo**. Del mismo modo, de acuerdo con el algoritmo de optimización, se pueden eliminar algunos datos de uso poco frecuente en el Caché .

La arquitectura de socket tradicional generalmente adopta una estructura de búfer de dos niveles, es decir, el caché de primer nivel (L1Cache) está integrado en la CPU y el caché de segundo nivel (L2 Cache) está instalado en la placa base, mientras que el L2 Cache bajo la arquitectura de la ranura I está en el mismo circuito que la CPU. En la placa, se ejecuta a la velocidad del núcleo o a la mitad de la velocidad del núcleo, que es más rápida que la caché L2 que se ejecuta en el FSB del sistema bajo el zócalo, y puede maximizar las ventajas de alta frecuencia principal Por supuesto, los requisitos del proceso de caché también son más altos.

  • La CPU primero busca los datos en la caché L1 y, si no los encuentra, los busca en la caché L2.

  • Si los datos están en la caché L2, el controlador modifica la caché L1 mientras transmite los datos;

  • Si los datos no están ni en la caché L1 ni en la caché L2, el controlador de caché obtiene los datos de la memoria principal, proporciona los datos a la CPU y modifica la caché de dos niveles al mismo tiempo.

  • K6-Ⅲ es bastante especial, 64KB L1 Cache, 256KB Full Core Speed ​​​​L2 Cache, el caché en la placa base original es en realidad L3 Cache.

Según pruebas relacionadas:

Cuando la memoria caché L3 de 512 K y 2 MB juega un papel, el rendimiento del sistema se puede mejorar entre un 2 % y un 10 %;

Tri-level se ha convertido en la solución más detallada y compleja para resolver el cuello de botella entre la CPU de alta velocidad y la memoria de baja velocidad desde la aparición de los sistemas de PC; además, la dirección de desarrollo futuro de Cache también es de gran capacidad.

En el sistema de almacenamiento de caché de memoria principal, todas las instrucciones y datos se almacenan en la memoria principal , y el caché es solo una copia de una parte de los bloques de programa y bloques de datos en la memoria principal, y es solo un bloque basado método de almacenamiento.

El caché y la memoria principal se dividen en bloques, cada bloque consta de varios bytes.

A partir del principio de localidad del programa mencionado anteriormente, se puede ver que los bloques de programa y los bloques de datos en la memoria caché harán que la CPU acceda al contenido en la memoria caché en la mayoría de los casos, y las operaciones de lectura y escritura de la CPU se realizan principalmente entre la CPU y la memoria caché.

Cuando la CPU accede a la memoria, envía la dirección de la unidad de acceso, que se envía al registro de dirección de memoria principal MAR en el controlador de caché por el bus de direcciones, y el mecanismo de conversión de dirección de memoria principal-caché obtiene la dirección de MA y juzga si el contenido de la unidad ha sido almacenado en el Caché Una copia , si la copia ya existe en el Caché, es un acierto. Cuando lo haga, convierta inmediatamente la dirección de acceso a su dirección en el Caché y luego acceda al Caché.

inserte la descripción de la imagen aquí

  • El banco de memoria se compone de varias unidades de almacenamiento y la unidad de almacenamiento se compone de varios elementos de almacenamiento.
  • Banco de almacenamiento ---- unidad de almacenamiento (almacenar una cadena de cadenas binarias) ---- elemento de almacenamiento (almacenar un 0/1)
  • Unidad de almacenamiento: almacena una cadena de códigos binarios.
  • Palabra de memoria: código binario en celda de memoria
  • Longitud de palabra de almacenamiento: el número de bits de código binario en la unidad de almacenamiento.
  • Las celdas de memoria se direccionan por dirección
  • MAR: registro de dirección de memoria, que refleja el número de unidades de almacenamiento. Se guarda la dirección del banco de almacenamiento (el número de la unidad de almacenamiento), que refleja el número de unidades de almacenamiento. Entonces, la cantidad de bits en MAR está relacionada con la cantidad de unidades de almacenamiento.
  • MDR: registro de datos de memoria, que refleja la longitud de la palabra de almacenamiento (longitud de la unidad de almacenamiento). Guarde los datos que se enviarán a la CPU o los datos que se guardarán en el banco de memoria o los datos recién extraídos del banco de memoria. La longitud de este registro es la misma que la longitud de la ubicación de memoria.

Si el contenido al que accederá la CPU no está en la memoria caché, es decir, un fallo, la CPU accederá directamente a la memoria principal y transferirá todo el bloque de datos (incluida la información de dirección de los datos del bloque) que contiene esta unidad de almacenamiento. a la Caché, de manera que futuros Varios accesos a la memoria puedan convertirse en accesos a la Caché.

Si la memoria caché está llena, entonces, bajo el control de la unidad de control de reemplazo, de acuerdo con cierto algoritmo/estrategia de reemplazo, la información original en la memoria caché debe reemplazarse con esta información.

Recuerdo que me pidieron que escribiera un algoritmo de gestión de caché en golang durante la entrevista, jajaja.

Por lo tanto, para mejorar la eficiencia del sistema, es necesario aumentar la tasa de aciertos de caché , y la mejora de la tasa de aciertos de caché depende de una serie de factores, como el método de imagen de caché y el algoritmo de actualización de caché . el contenido de la caché debe ser coherente con la parte de la memoria principal. Es decir, si el contenido de la memoria principal cambia después de haber sido cargado en la caché, su imagen en la caché también debe cambiar en consecuencia. Por el contrario, cuando el CPU modifica el contenido en el Caché, el contenido en la memoria principal El contenido correspondiente también debe ser revisado.

1.2 Método de mapeo de direcciones

El llamado método de mapeo de direcciones se refiere a cómo determinar de qué parte de la memoria principal es una copia el contenido en el Caché, es decir, se debe aplicar una determinada función para mapear la dirección de la memoria principal al Caché.

Después de que la información se carga en el Caché de cierta manera, cuando se ejecuta el programa, la dirección de la memoria principal debe transformarse en la dirección del Caché.Este proceso de transformación se llama transformación de dirección.

Los métodos de mapeo de direcciones generalmente usan tres tipos: mapeo directo, mapeo asociativo completo y mapeo asociativo de grupo:

1- vídeo directo

El método en el que cada dirección de la memoria principal se asigna a una dirección específica en la memoria caché se denomina método de imagen directa. En el modo de imagen directa, los datos de la unidad de almacenamiento en la memoria principal solo se pueden transferir a una ubicación en el caché, y si los datos de otra unidad de almacenamiento en la memoria principal también se transfieren a esta ubicación, se producirá un conflicto. . El método de asignación de direcciones generalmente consiste en dividir el espacio de la memoria principal de acuerdo con el tamaño de la memoria caché y asignar el mismo número de bloque en cada área a la misma posición de bloque en la memoria caché. Generalmente, el caché se divide en bloques de 2 N y la memoria principal se divide en bloques de 2 MB. La relación correspondiente entre la memoria principal y los bloques en el caché se puede expresar mediante la siguiente función de mapeo: j = i mod 2N. En la fórmula, j es el número de bloque en la memoria caché; i es el número de bloque en la memoria principal.

El mapeo directo es el método de mapeo de direcciones más simple y su velocidad de conversión de direcciones es rápida y no involucra la estrategia de reemplazo en los otros dos métodos de mapeo. Sin embargo, la probabilidad de conflictos de bloques de esta manera es alta.Cuando el programa accede a los datos en dos bloques en conflicto de un lado a otro, la tasa de aciertos de la memoria caché se reducirá drásticamente, porque incluso si hay otros bloques libres en la memoria caché en este momento , la relación de imagen de dirección fija y no se puede aplicar.

2- Imagen totalmente asociativa

Cada bloque de palabras en la memoria principal se puede asignar a cualquier posición de bloque de palabras en la memoria caché.Este método se denomina asignación totalmente asociativa. De esta manera, los conflictos de bloques solo ocurrirán cuando todos los bloques en el Caché estén llenos, por lo que la probabilidad de conflictos de bloques es baja y se puede lograr una alta tasa de aciertos en el Caché, pero su implementación es muy complicada. Al acceder a los datos de un bloque, la dirección del bloque se compara con todas las etiquetas de dirección en la tabla de bloques de caché para determinar si se trata de un acierto. Existe un problema de reemplazo relativamente complicado cuando se transfieren bloques de datos, es decir, decidir dónde transferir los bloques de datos a la memoria caché y qué parte de los datos de la memoria caché se transferirá fuera de la memoria principal. Para lograr una mayor velocidad, todas las comparaciones y reemplazos deben implementarse en hardware.

Imagen asociativa de 3 conjuntos

El mapeo asociativo de grupos es un compromiso entre el mapeo directo y el mapeo totalmente asociativo. Este método divide el espacio de almacenamiento en varios grupos, cada grupo es una imagen directa y cada bloque de un grupo es una imagen totalmente asociativa. Es la forma general de los dos métodos de asignación anteriores. Si el tamaño del grupo es 1, es decir, el espacio de caché se divide en 2N grupos, se convierte en una asignación directa; si el tamaño del grupo es el tamaño total de el caché, se convierte en un mapeo totalmente asociativo. El método asociativo de grupo es más simple que el método asociativo completo para juzgar el algoritmo de reemplazo y acierto de bloque, la probabilidad de conflicto de bloque es menor que la del mapeo directo y su tasa de acierto también se encuentra entre el mapeo directo y el mapeo asociativo completo.

1.3 Breve introducción al principio del método de escritura en caché

La mejor manera de mejorar la tasa de aciertos de la memoria caché es hacer que la memoria caché almacene las instrucciones y los datos que la CPU ha estado usando recientemente. Cuando la memoria caché está llena, los datos no utilizados a largo plazo se pueden eliminar para mejorar la eficiencia de la memoria caché. . Para mantener la consistencia entre los datos en el Caché y los datos en la memoria principal, evite que la CPU pierda los nuevos datos en el Caché durante el proceso de lectura y escritura, lo que resulta en una lectura incorrecta de los datos, y asegúrese de que los datos en el proceso de actualización en el Caché no desaparecerá debido a la sobrescritura, es necesario reflejar oportunamente y con precisión la actualización de datos en el Caché a la memoria principal. Este es un proceso de escritura de Caché. Los métodos de escritura de Caché generalmente adoptan tres tipos: escribir- a través, escritura simultánea en búfer y reescritura A continuación se comparan y se presentan estos tres métodos de escritura en caché.

1- Sistema de escritura directa

Cuando la CPU escribe en la caché, escribe los datos en la memoria principal al mismo tiempo, lo que garantiza que el contenido de la caché sea exactamente el mismo que el de la memoria principal. Este método es más intuitivo, simple y confiable, pero dado que la memoria principal debe escribirse cada vez que se actualiza el Caché, y esto debe hacerse a través del bus del sistema, el bus funciona con frecuencia y la velocidad del sistema se verá afectada.

Sistema de escritura directa con 2 búfer (Post Wirte)

Para resolver el problema del impacto del sistema de escritura simultánea en la velocidad del bus, se agrega un área de búfer cuando se escriben los datos de la memoria principal. Después de que el búfer enclava los datos que se escribirán en la memoria principal, la CPU puede ejecutar la operación del siguiente ciclo sin esperar a que se escriban los datos en la memoria principal. Esto se compara con la adición de un caché de una sola vía unidireccional a la memoria principal. Por ejemplo, un ciclo de lectura en el que los datos ya existen en la Caché se puede seguir inmediatamente después del ciclo de escritura, evitando así el retraso en la operación causado por el sistema de escritura simultánea, pero este búfer solo puede almacenar los datos escritos una vez, cuando Cuando ocurren dos operaciones de escritura consecutivas, la CPU todavía necesita esperar.

Sistema de 3 reescrituras

En los dos primeros modos de escritura, el sistema escribe en la memoria principal mientras escribe en la memoria caché. De hecho, esto no solo ocupa el ancho de banda del bus y desperdicia un tiempo de ejecución precioso, sino que también es innecesario en algunos casos, y se puede juzgar si es necesario actualizar los datos agregando criterios adicionales. El sistema de reescritura resuelve la operación de escritura innecesaria de la memoria principal agregando un bit de actualización al campo de bandera de cada bloque de datos en la memoria caché. Por ejemplo, si la CPU actualizó los datos en el caché pero no en la memoria principal, el bit de actualización se establece en 1. Cada vez que la CPU escribe una nueva pieza de contenido en la memoria caché, primero verifica el bit de actualización del bloque de datos en la memoria caché. Si el bit de actualización es 0, los datos se escriben directamente en la memoria caché; el contenido de este elemento es se escriben en la ubicación correspondiente en la memoria principal y, a continuación, los nuevos datos se vuelven a escribir en la memoria caché.

En comparación con un sistema de reescritura, un sistema de reescritura ahorra algunas operaciones de reescritura inmediatas innecesarias, que son frecuentes en muchos casos. Incluso si se actualiza un caché, si no se reemplaza con datos nuevos, no hay necesidad de escribir en la memoria principal de inmediato. Es decir, la cantidad de escrituras reales en la memoria principal puede ser menor que la cantidad de ciclos de escritura realmente ejecutados por la CPU, pero la estructura del sistema de reescritura es más complicada y la caché también debe usar capacidad adicional. para almacenar las banderas. Debido a la alta eficiencia del sistema de reescritura, la mayoría de las cachés modernas funcionan de esta manera.

1.4 Acerca de la escritura directa y la escritura no simultánea

1- Para operaciones de disco

Write-through significa que la operación de escritura no usa el caché en absoluto, y los datos siempre se escriben directamente en el disco. Desactivar el caché de escritura puede liberar el caché para las operaciones de lectura (el caché es compartido por las operaciones de lectura y escritura) . La reescritura significa que los datos no se escriben directamente en el disco, sino que se escriben primero en la memoria caché, y luego el controlador escribe los datos que no se han escrito en el disco en la memoria caché del disco. Las operaciones de escritura son mucho más rápidas. , mejorando así el rendimiento de escritura. Pero el método de reescritura (caché de escritura) suele ser más rápido cuando la carga del disco es ligera. Cuando la carga es pesada, cada vez que los datos se escriben en el caché, deben escribirse en el disco inmediatamente para liberar el caché y guardar los nuevos datos que se escribirán. En este momento, si los datos se escriben directamente en el disco, el controlador funcionará a una velocidad más rápida. Por lo tanto, cuando la carga es pesada, escribir primero los datos en el caché reducirá el rendimiento.

2- Para el modo de búfer de caché dentro de la CPU

Write-Through y Write-Back, el primero es para escribir uno por uno en orden, mientras que el segundo es para guardar los datos en una cierta cantidad en el búfer primero, y luego escribir los datos en la misma posición al mismo tiempo. Por ejemplo: hay un ascensor, si el principio de primero en entrar, primero en salir, es decir, el modo de escritura, la primera persona va al tercer piso, la segunda va al segundo piso y la tercera también va al tercer piso, luego este ascensor tiene que llegar primero al tercer piso, luego al segundo piso, luego al tercer piso. Pero si en el modo de reescritura, el ascensor primero va al segundo piso para sacar a la segunda persona y luego va al tercer piso para sacar a la primera y la tercera persona, la eficiencia es obviamente mucho mayor. Los primeros cachés solo tenían modo de escritura directa, pero ahora todos los cachés usan el modo de escritura no simultánea.

3- Otras explicaciones

  • Write-Through: al escribir, actualice los datos en caché y memoria sincrónicamente.
  • Write-Back: el caché se actualiza al escribir, pero los datos en la memoria no necesariamente se actualizan sincrónicamente. Solo cuando el caché alcanza un cierto nivel, los datos en el caché se vaciarán a la memoria o se actualizarán a través del comando de caché. y no se actualizará automáticamente.
  • El significado de la línea de caché es asumir que su instrucción solo necesita leer 4 bytes de la memoria, pero en términos generales, es probable que su próxima instrucción lea los datos después de estos 4 bytes, por lo que el hardware general leerá más datos ingresan al caché, como 64 bytes, entonces estos 64 bytes son una línea de caché. Y si la CPU no accede a los datos en su línea de caché durante mucho tiempo, entonces esta línea de caché puede seleccionarse e intercambiarse. En este momento, la información modificada en el caché debe volver a escribirse en la memoria.

1.5 Estrategia de reemplazo de caché

El caché tiene dos operaciones básicas como la memoria, a saber, la operación de lectura y la operación de escritura. Cuando la CPU emite un comando de operación de lectura, se divide en dos situaciones según la dirección de memoria principal que genera: una es que los datos requeridos ya están en el caché, luego solo necesita acceder directamente al caché y leer información de la unidad correspondiente al bus de datos. Sí, la otra es que los datos requeridos no se han cargado en el Caché. Cuando la CPU necesita leer información de la memoria principal, la pieza de reemplazo del Caché copia el contenido de almacenamiento de la dirección del memoria principal a la caché. Si la posición correspondiente en el caché ya está ocupada por bloques de palabras, los bloques de palabras antiguos deben eliminarse. Hay dos estrategias comunes de reemplazo:

1- Política de primero en entrar, primero en salir (FIFO)

La estrategia FIFO (First In First Out) siempre reemplaza el primer bloque de Cache transferido, no necesita registrar el uso de cada bloque en ningún momento, lo cual es más fácil de implementar. La desventaja es que los bloques de uso frecuente, como un bloque que contiene un programa cíclico, también pueden reemplazarse porque es el bloque más antiguo.

2- Política de uso menos reciente (LRU)

La estrategia LRU (Least Recent Used) consiste en reemplazar el bloque de información que se ha utilizado con menos frecuencia en la Caché reciente actual. Este algoritmo de reemplazo necesita registrar el uso de bloques en la Caché en cualquier momento. La tasa de aciertos promedio de LRU es más alta que la de FIFO. En el modo de imagen asociada al grupo, cuando aumenta la capacidad del paquete, la tasa de aciertos de LRU también aumentará.

1.6 La necesidad de usar Cache

La llamada Cache es una memoria caché de alta velocidad, que se encuentra entre la CPU y la memoria principal, es decir, la DRAM, suele ser una memoria de pequeña escala pero de rápido acceso compuesta por SRAM. En la actualidad, la principal memoria utilizada por las computadoras es DRAM, que tiene las características de bajo precio y gran capacidad, pero debido al uso de capacitores para almacenar información, es difícil aumentar la velocidad de acceso y la CPU necesita acceder a la memoria principal una o más veces cada vez que ejecuta una instrucción.La velocidad de lectura y escritura es mucho más baja que la velocidad de la CPU, por lo que para lograr la coincidencia de velocidad, el estado de espera solo se puede insertar en el ciclo de instrucción de la CPU. La velocidad de la CPU en el estado de espera reducirá en gran medida la eficiencia de ejecución del sistema. Dado que SRAM adopta el mismo proceso de fabricación que la CPU, en comparación con DRAM, su velocidad de acceso es rápida, pero tiene un gran volumen, un alto consumo de energía y un precio elevado. Es imposible e innecesario usar SRAM para toda la memoria. Por lo tanto, para resolver la contradicción entre velocidad y costo, se crea un método de procesamiento jerárquico, es decir, se instala una SRAM relativamente pequeña con una capacidad relativamente pequeña entre la memoria principal y la CPU como memoria caché de alta velocidad. Cuando se usa Cache, una copia de parte del contenido en la memoria principal (llamada imagen de memoria) se almacena en Cache. Cuando la CPU lee y escribe datos, primero accede a Cache (porque la velocidad de Cache es equivalente a la de CPU , la CPU puede esperar en estado de espera cero) La ejecución de la siguiente instrucción se completa), y solo cuando no hay datos requeridos por la CPU en el caché (esto se denomina "error", de lo contrario se denomina "acierto "), la CPU accede a la memoria principal. En la actualidad, la memoria caché de gran capacidad puede hacer que la tasa de aciertos de la memoria caché de acceso a la CPU sea del 90 % al 98 %, lo que mejora en gran medida la velocidad de acceso de la CPU a los datos y mejora el rendimiento del sistema.

1.7 Factibilidad de uso de caché

Los resultados del análisis de un gran número de programas típicos muestran que, en un período de tiempo relativamente corto, las direcciones generadas por los programas a menudo se concentran en un pequeño rango del espacio de direcciones lógicas de la memoria. En la mayoría de los casos, las instrucciones se ejecutan secuencialmente, por lo que la distribución de las direcciones de las instrucciones es continua.Además, el segmento del programa de bucle y el segmento de la subrutina deben ejecutarse repetidamente, por lo que el acceso a estas direcciones naturalmente tiende a concentrarse. en el tiempo. . La tendencia a la concentración de los datos no es tan obvia como la de las instrucciones, pero el acceso al arreglo y la selección de la unidad de trabajo pueden hacer que la dirección de memoria sea relativamente concentrada. Este fenómeno de acceso frecuente a direcciones de memoria en el rango local y acceso infrecuente a direcciones fuera de este rango se denomina localidad de acceso al programa. De acuerdo con el principio de localidad del programa, es totalmente factible configurar una caché entre la memoria principal y la CPU, y cargar algunas instrucciones o datos cerca de la dirección de la instrucción que se está ejecutando en la caché desde la memoria principal para que la CPU utilizar durante un período de tiempo.

  • https://blog.csdn.net/weixin_43627118/article/details/105188281
  • "Combate práctico de desarrollo del núcleo de Linux del sistema integrado"

Supongo que te gusta

Origin blog.csdn.net/weixin_45264425/article/details/132309902
Recomendado
Clasificación