¿Cuándo se vacía la memoria caché de la CPU en la memoria principal?
Si está empezando a aprender cómo funcionan las CPU de múltiples núcleos, el almacenamiento en caché, la coherencia de la memoria caché y la memoria, puede parecer un poco confuso al principio. Con eso en mente, la publicación de preguntas y respuestas de SuperUser de hoy tiene respuestas a la pregunta de un lector curioso.
La sesión de Preguntas y Respuestas de hoy nos llega por cortesía de SuperUser, una subdivisión de Stack Exchange, un grupo de sitios web de preguntas y respuestas impulsado por la comunidad..
La pregunta
El lector Superusuario CarmeloS quiere saber cuándo se vacía la memoria caché de una CPU en la memoria principal:
Si tengo una CPU con dos núcleos y cada núcleo tiene su propia memoria caché L1, ¿es posible que Core1 y Core2 almacenen la misma parte de la memoria al mismo tiempo? Si es posible, ¿cuál será el valor de la memoria principal si tanto Core1 como Core2 han editado sus valores en caché??
¿Cuándo se vacía la memoria caché de la CPU en la memoria principal??
La respuesta
David Schwartz, sleske y Kimberly W, contribuyentes del Superusuario, tienen la respuesta para nosotros. En primer lugar, David Schwartz:
Si tengo una CPU con dos núcleos y cada núcleo tiene su propio caché L1, ¿es posible que el Core1 y el Core2 almacenen la misma parte de la memoria al mismo tiempo??
Sí, el rendimiento sería terrible si este no fuera el caso. Considere dos hilos que ejecutan el mismo código. Quieres ese código en ambas caches L1.
Si es posible, ¿cuál será el valor de la memoria principal si tanto Core1 como Core2 han editado sus valores en caché??
El valor anterior estará en la memoria principal, lo que no importará, ya que ninguno de los dos núcleos lo leerá. Antes de expulsar un valor modificado de la memoria caché, se debe escribir en la memoria. Normalmente, se utiliza alguna variante del protocolo MESI. En la implementación tradicional de MESI, si un valor se modifica en un caché, no puede estar presente en ningún otro caché en ese mismo nivel.
Seguido por la respuesta de sleske:
Sí, tener dos cachés almacena en caché la misma región de memoria y en realidad es un problema que ocurre mucho en la práctica. Hay varias soluciones, por ejemplo:
- Los dos cachés pueden comunicarse para asegurarse de que no están en desacuerdo
- Puede tener algún tipo de supervisor que supervise todos los cachés y los actualice en consecuencia
- Cada procesador supervisa las áreas de memoria que ha almacenado en caché, y cuando detecta una escritura, arroja su caché (ahora no válido)
El problema se llama coherencia de caché y el artículo de Wikipedia sobre el tema tiene una buena descripción del problema y posibles soluciones..
Y nuestra respuesta final de Kimberly W:
Para responder a la pregunta en el título de su publicación, depende del protocolo de almacenamiento en caché. Si se trata de una respuesta de escritura, la memoria caché solo se volverá a la memoria principal cuando el controlador de la memoria caché no tenga más remedio que colocar un nuevo bloque de memoria caché en el espacio ya ocupado. El bloque que anteriormente ocupaba el espacio se elimina y su valor se escribe de nuevo en la memoria principal.
El otro protocolo es de escritura. En ese caso, en cualquier momento el bloque de caché se escribe en el nivel norte, el bloque correspondiente en el nivel n + 1 se actualiza. Es similar en concepto a rellenar un formulario con papel carbón debajo; todo lo que escriba en la parte superior se copia en la siguiente hoja. Esto es más lento porque, obviamente, implica más operaciones de escritura, pero los valores entre cachés son más consistentes. En el esquema de reescritura, solo el caché de nivel más alto tendría el valor más actualizado para un bloque de memoria particular.
¿Tienes algo que agregar a la explicación? Apaga el sonido en los comentarios. ¿Quieres leer más respuestas de otros usuarios de Stack Exchange con experiencia en tecnología? Echa un vistazo a la discusión completa aquí.
Crédito de la imagen: Lemsipmatt (Flickr)