En la arquitectura de la computadora , la coherencia de la caché es la uniformidad de los datos de recursos compartidos que terminan almacenados en múltiples cachés locales . Cuando los clientes de un sistema mantienen cachés de un recurso de memoria común, pueden surgir problemas con datos incoherentes, que es particularmente el caso de las CPU en un sistema de multiprocesamiento .
En la ilustración de la derecha, considere que ambos clientes tienen una copia en caché de un bloque de memoria en particular de una lectura anterior. Suponga que el cliente en la parte inferior actualiza / cambia ese bloque de memoria, el cliente en la parte superior podría quedarse con un caché de memoria no válido sin ninguna notificación del cambio. La coherencia de la caché está destinada a gestionar dichos conflictos manteniendo una vista coherente de los valores de los datos en varias cachés.
En un sistema multiprocesador de memoria compartida con una memoria caché separada para cada procesador, es posible tener muchas copias de datos compartidos: una copia en la memoria principal y otra en la caché local de cada procesador que lo solicitó. Cuando se cambia una de las copias de datos, las otras copias deben reflejar ese cambio. La coherencia de la caché es la disciplina que garantiza que los cambios en los valores de los operandos compartidos (datos) se propaguen por todo el sistema de manera oportuna. [1]
Los siguientes son los requisitos para la coherencia de la caché: [2]
Teóricamente, la coherencia se puede realizar en la granularidad de carga / almacenamiento . Sin embargo, en la práctica, generalmente se realiza con la granularidad de los bloques de caché. [3]
La coherencia define el comportamiento de las lecturas y escrituras en una única ubicación de dirección. [2]
Un tipo de datos que ocurren simultáneamente en diferentes memorias caché se denomina coherencia caché o, en algunos sistemas, memoria global.
En un sistema multiprocesador, considere que más de un procesador ha almacenado en caché una copia de la ubicación de memoria X. Las siguientes condiciones son necesarias para lograr la coherencia de la caché: [4]
Las condiciones anteriores satisfacen los criterios de propagación de escritura necesarios para la coherencia de la caché. Sin embargo, no son suficientes porque no satisfacen la condición de serialización de transacciones. Para ilustrar esto mejor, considere el siguiente ejemplo:
Un sistema multiprocesador consta de cuatro procesadores: P1, P2, P3 y P4, que contienen copias en caché de una variable compartida S cuyo valor inicial es 0. El procesador P1 cambia el valor de S (en su copia en caché) a 10, después de lo cual El procesador P2 cambia el valor de S en su propia copia en caché a 20. Si aseguramos solo la propagación de escritura, entonces P3 y P4 ciertamente verán los cambios hechos a S por P1 y P2. Sin embargo, P3 puede ver el cambio realizado por P1 después de ver el cambio realizado por P2 y por lo tanto volver 10 en una lectura a S . P4, por otro lado, puede ver los cambios realizados por P1 y P2 en el orden en que se realizan y, por lo tanto, devolver 20 en una lectura a S. Los procesadores P3 y P4 ahora tienen una vista incoherente de la memoria.
Por lo tanto, para satisfacer la serialización de transacciones y, por lo tanto, lograr la coherencia de caché, se debe cumplir la siguiente condición junto con las dos anteriores mencionadas en esta sección:
La definición alternativa de un sistema coherente es a través de la definición del modelo de memoria de coherencia secuencial : "el sistema coherente de caché debe parecer que ejecuta todas las cargas y almacenes de subprocesos en una única ubicación de memoria en un orden total que respete el orden del programa de cada subproceso" . [3] Por lo tanto, la única diferencia entre el sistema coherente de caché y el sistema coherente secuencial está en el número de ubicaciones de direcciones de las que habla la definición (ubicación de memoria única para un sistema coherente de caché y todas las ubicaciones de memoria para un sistema coherente secuencialmente).
Otra definición es: "un multiprocesador es consistente en caché si todas las escrituras en la misma ubicación de memoria se realizan en algún orden secuencial". [6]
En raras ocasiones, pero especialmente en los algoritmos, la coherencia puede referirse a la localidad de referencia . Pueden existir múltiples copias de los mismos datos en diferentes cachés simultáneamente y si se permite a los procesadores actualizar sus propias copias libremente, puede resultar una vista inconsistente de la memoria.
Los dos mecanismos más comunes para garantizar la coherencia son el espionaje y el directorio , cada uno con sus propias ventajas e inconvenientes. Los protocolos basados en espionaje tienden a ser más rápidos, si hay suficiente ancho de bandaestá disponible, ya que todas las transacciones son una solicitud / respuesta que ven todos los procesadores. El inconveniente es que el espionaje no es escalable. Cada solicitud debe transmitirse a todos los nodos de un sistema, lo que significa que a medida que el sistema crece, el tamaño del bus (lógico o físico) y el ancho de banda que proporciona deben crecer. Los directorios, por otro lado, tienden a tener latencias más largas (con una solicitud / reenvío / respuesta de 3 saltos) pero usan mucho menos ancho de banda ya que los mensajes son punto a punto y no se difunden. Por esta razón, muchos de los sistemas más grandes (> 64 procesadores) utilizan este tipo de coherencia de caché.
Los sistemas de memoria compartida distribuida imitan estos mecanismos en un intento de mantener la coherencia entre los bloques de memoria en sistemas poco acoplados. [9]
Los protocolos de coherencia aplican coherencia de caché en sistemas multiprocesador. La intención es que dos clientes nunca vean valores diferentes para los mismos datos compartidos.
El protocolo debe implementar los requisitos básicos de coherencia. Puede personalizarse para el sistema o la aplicación de destino.
Los protocolos también se pueden clasificar como snoopy o basados en directorios. Por lo general, los primeros sistemas usaban protocolos basados en directorios en los que un directorio realizaba un seguimiento de los datos que se compartían y los que los compartían. En los protocolos de Snoopy, las solicitudes de transacción (para leer, escribir o actualizar) se envían a todos los procesadores. Todos los procesadores espían la solicitud y responden adecuadamente.
La propagación de escritura en protocolos snoopy se puede implementar mediante cualquiera de los siguientes métodos:
Si el diseño del protocolo establece que cada vez que se cambia una copia de los datos compartidos, todas las demás copias deben "actualizarse" para reflejar el cambio, entonces se trata de un protocolo de actualización de escritura. Si el diseño establece que una escritura en una copia en caché por cualquier procesador requiere que otros procesadores descarten o invaliden sus copias en caché, entonces es un protocolo de invalidación de escritura.
Sin embargo, la escalabilidad es una de las deficiencias de los protocolos de transmisión.
Se han diseñado varios modelos y protocolos para mantener la coherencia, como el protocolo MSI , MESI (también conocido como Illinois), MOSI , MOESI , MERSI , MESIF , write-once , Synapse, Berkeley, Firefly y Dragon . [1] En 2011, ARM Ltd propuso el AMBA 4 ACE [10] para manejar la coherencia en los SoC . La especificación AMBA CHI (Coherent Hub Interface) [11] de ARM Ltd, que pertenece al grupo de especificaciones AMBA5, define las interfaces para la conexión de procesadores totalmente coherentes.