Coherencia+de+cache+y+protocolo+MESI

=Coherencia de Cache=

toc

En los sistemas multiprocesadores actuales es común disponer de uno o dos niveles de cache asociados a cada procesador, esto es llevado a cabo para conseguir prestaciones mas adecuadas pero a la vez ocasiona un problema conocido como coherencia de cache.

¿Que es la coherencia de cache?
Es cuando existen varias copias del mismo dato simultáneamente en caches diferentes, por lo tanto si los procesadores actualizan sus copias puede producirse inconsistencia de memoria, debido a que se puede estar trabajando con datos erróneos, sin tener conocimiento de ello. Cuando un procesador cambia (escribe) un dato en su propia cache local, el cambio debe hacerse en todas las caches que tienen copia. Alternativemente, las otras copias se deben invalidar. Es decir, los datos compartidos deben ser coherentes en todas las caches del sistema. Ejemplo:



La figura muestra tres procesadores con caches conectadas por un bus a una memoria principal compartida. Se realiza por parte de los procesadores una serie de accesos a la posición u. Primero, el procesador P1 lee u, trayendo una copia a su cache. Después el procesador P3 lee u, con lo que también pone una copia en su cache. Tras esto, el procesador P3 escribe en la posición u cambiando su valor de 5 a 7. Con una cache de escritura directa, esto causaría que la posición en memoria principal se actualizara; sin embargo, cuando el procesador P1 vuelve a leer la posición u (acción 4), desafortunadamente leerá el valor obsoleto (5) de su propia caché en lugar del valor correcto (7) de la memoria principal.

¿Cuál es el objetivo de un protocolo de coherencia?
Es situar las variables locales utilizadas recientemente en la cache apropiada y mantenerlos allí para las distintas escrituras y lecturas, al mismo tiempo que se mantiene la consistencia de las variables compartidas que pudieron encontrarse en varias caches al mismo tiempo.

Aproximaciones de coherencia de cache
Generalmente se han dividido en aproximaciones de software y hardware.

__//Software://__ intentan evitar la necesidad de circuitería y lógica de hardware adicional dejando que el __compilador__ y el sistema operativo se encarguen del problema. Esto lo que quiere decir es que el compilador realiza un análisis del código para determinar qué datos pueden dar problemas al pasar a cache, y los marcan en consecuencia. Después el sistema operativo o el hardware impiden que se pasen a cache los datos marcados como no almacenables en cache.

//__Hardware:__// estos se denominan protocolos de coherencia de cache. Y permiten reconocer dinámicamente en el momento de la ejecución las situaciones de inconsistencia por lo tanto, existe un uso mas efectivo de las caches y reduce la complejidad en el desarrollo del software.

Protocolos de hardware
Se dividen en:

//__Protocolos de directorio:__// recogen y mantienen la información acerca de donde residen las copias de las líneas. Usualmente hay un __controlador__ centralizado que es parte del controlador de memoria principal, y un directorio que se almacena en la memoria principal. El directorio contiene información de estado global de las caches locales. El controlador centralizado comprueba y emite las órdenes precisas para la transferencia entre memoria y cache o entre distintas caches. Además es responsable de mantener actualizada la información.

//__Protocolos de sondeo:__// distribuyen la responsabilidad de mantener la coherencia de cache entre todos los controladores de cache del __multiprocesador__. Una cache debe de reconocer cuando una línea de las que contiene esta compartida con otras caches. Cuando se realiza una actualización en una línea de cache compartida, debe anunciarse a todas las otras caches mediante un mecanismo de difusión. Cada controlador de cache es capaz de espiar su red para observar las notificaciones que se difunden y reaccionar adecuadamente.



Enfoques básicos del protocolo de sondeo.
Actualizar-si-escritura: pueden haber varios procesadores que escriben al igual que varios procesadores que leen. Cuando un procesador desea escribir en una línea compartida la palabra a actualizar se distribuye a las demás y las caches que contienen esa línea la pueden actualizar. Invalidar-si-escritura o __MESI:__ pueden haber múltiples procesadores que leen pero un solo procesador que escribe en un momento dado. Cuando se quiere hacer una escritura en la línea de una cache, primero envía una notificación que invalida la línea en las otras caches haciendo que dicha línea sea exclusiva para la cache donde se va a escribir.

Con el protocolo MESI, la cache de datos incluye dos bits de estado en la marca, puesto que la línea puede estar en uno de estos cuatro estados:


 * <  ||< **Modificado ** ||< **Exclusivo ** ||< **Compartido ** ||< **No-válido ** ||
 * < **Línea de cache valida ** ||< Si ||< Si ||< <span style="color: #365f91; font-family: 'Arial','sans-serif'; font-size: 12pt; line-height: 150%; margin: 0in 0in 0pt;">Si ||< <span style="color: #365f91; font-family: 'Arial','sans-serif'; font-size: 12pt; line-height: 150%; margin: 0in 0in 0pt;">No ||
 * < **<span style="color: #365f91; font-family: 'Arial','sans-serif'; font-size: 12pt; line-height: 150%;">La copia de memoria es… ** ||< <span style="color: #365f91; font-family: 'Arial','sans-serif'; font-size: 12pt; line-height: 150%; margin: 0in 0in 0pt;">Atrasada ||< <span style="color: #365f91; font-family: 'Arial','sans-serif'; font-size: 12pt; line-height: 150%; margin: 0in 0in 0pt;">Valida ||< <span style="color: #365f91; font-family: 'Arial','sans-serif'; font-size: 12pt; line-height: 150%; margin: 0in 0in 0pt;">Valida ||< <span style="color: #365f91; font-family: 'Arial','sans-serif'; font-size: 12pt; line-height: 150%; margin: 0in 0in 0pt;">- ||
 * < **<span style="color: #365f91; font-family: 'Arial','sans-serif'; font-size: 12pt; line-height: 150%;">Existen copias en otras caches. ** ||< <span style="color: #365f91; font-family: 'Arial','sans-serif'; font-size: 12pt; line-height: 150%; margin: 0in 0in 0pt;">No ||< <span style="color: #365f91; font-family: 'Arial','sans-serif'; font-size: 12pt; line-height: 150%; margin: 0in 0in 0pt;">No ||< <span style="color: #365f91; font-family: 'Arial','sans-serif'; font-size: 12pt; line-height: 150%; margin: 0in 0in 0pt;">Quizá ||< <span style="color: #365f91; font-family: 'Arial','sans-serif'; font-size: 12pt; line-height: 150%; margin: 0in 0in 0pt;">Quizá ||
 * < **<span style="color: #365f91; font-family: 'Arial','sans-serif'; font-size: 12pt; line-height: 150%;">Una escritura en esta línea… ** ||< <span style="color: #365f91; font-family: 'Arial','sans-serif'; font-size: 12pt; line-height: 150%; margin: 0in 0in 0pt;">No va al bus ||< <span style="color: #365f91; font-family: 'Arial','sans-serif'; font-size: 12pt; line-height: 150%; margin: 0in 0in 0pt;">No va al bus ||< <span style="color: #365f91; font-family: 'Arial','sans-serif'; font-size: 12pt; line-height: 150%; margin: 0in 0in 0pt;">Va al bus y actualiza la cache. ||< <span style="color: #365f91; font-family: 'Arial','sans-serif'; font-size: 12pt; line-height: 150%; margin: 0in 0in 0pt;">Va directamente al bus. ||

Enlaces externos
<span style="font-family: Arial,Helvetica,sans-serif; font-size: 120%;">[|Descripción de Coherencia de cache]

<span style="font-family: Arial,Helvetica,sans-serif; font-size: 120%;">[|Coherencia, Sincronización y Consistencia.]