El protocolo MESI, también conocido como protocolo Illinois, es un extendido protocolo de coherencia de caché y coherencia de memoria, que fue creado por Intel en el procesador Pentium para "dar soporte más eficientemente a write-back en lugar del write-through de caché de CPU usado con anterioridad en el procesador 486".
ESTADOS
Cada línea de caché se marca con uno de
los cuatro estados siguientes (codificados con dos bits adicionales):
§ M - Modified
(Modificado): La línea de caché sólo está en la caché actual, y está
"sucia"; ha sido modificado el valor de la memoria principal. Es necesario que los datos sean escritos otra vez en
la memoria principal antes de permitir cualquier otra
lectura del estado de la memoria (ya no es válida).
§ E - Exclusive
(Exclusivo): La línea de caché sólo se encuentra en la caché actual, pero está
"limpia"; coincide con el valor de la memoria principal.
§ S - Shared
(Compartido): Indica que esta línea de caché puede estar duplicada en otras
cachés.
§ I - Invalid
(Inválido): Indica que esta línea de caché no es válida.
Para cualquier par de cachés, los estados
permitidos para una línea de caché son los siguientes:
M
|
E
|
S
|
I
|
|
M
|
NO
|
NO
|
NO
|
SI
|
E
|
NO
|
NO
|
NO
|
SI
|
S
|
NO
|
NO
|
SI
|
SI
|
I
|
SI
|
SI
|
SI
|
SI
|
OPERACIONES
Se puede leer de caché en cualquier
estado excepto en Inválido. Una línea inválida puede ser cogida (de los estados
Compartido o Exclusivo) para satisfacer una lectura.
Una escritura sólo puede ser llevada a
cabo si la línea de caché está en estado Modificado o Exclusivo. Si está en
estado Compartido todas las otras copias en otras cachés deben ser puestas en
estado Inválido antes. Esto se hace habitualmente con una operación broadcast.
Una caché puede cambiar el estado de
una línea en cualquier momento, pasándolo a estado Inválido. Una línea
Modificada debe ser escrita antes.
Una caché que contenga una línea en
estado Modificado debe sondear (interceptar) todos los intentos de lectura (de
todas las CPUs del sistema) a la memoria principal y copiar los datos que
tiene. Esto se hace habitualmente forzando la lectura back off (cancelar el bus de transferencia a
memoria), para luego escribir los datos en memoria principal y cambiar la línea
de caché a estado Compartido.
Una caché que contenga una línea en
estado Compartido debe también sondear todas las operaciones broadcast
inválidas de otras CPUs, y descartar la línea (cambiándola a estado Inválido)
una vez hecho.
Una caché que contenga una línea en
estado Exclusivo también debe sondear todas las peticiones de lecturas del
resto de CPUs y cambiar la línea a estado Compartido una vez hecho.
Los estados Modificado y Exclusivo son
siempre precisos: corresponden a los poseedores de la línea correcta en el
sistema. El estado Compartido puede ser impreciso: si alguna otra CPU descarga
una línea Compartida, y esta CPU es la única que tiene una copia, la línea no
será cambiada a estado Exclusivo. (Porque cambiar todas las líneas de caché de
todas las CPUs no es práctico en un bus de sondeo broadcast)
En ese sentido el estado Exclusivo es
una optimización oportunista: si la CPU quiere modificar la línea de caché a
estado Compartido, es necesario un intercambio por el bus para invalidar
cualquier otra copia en caché. El estado Compartido permite modificar una línea
de caché sin ningún intercambio por el bus.
Existen unos errores en el diagrama de estados de la imagen
de arriba, en la transición BusRd/Flush del estado S al I. Debería de ser
BusRdX, ya que no tiene sentido que por una lectura, se realice una
invalidación en el resto de cachés para esa línea. Por otro lado, los BusRd/Flush
de las transiciones de E a S no deberían incluir el Flush, porque por una
lectura no es necesario realizar una actualización de la línea en memoria
principal.
No hay comentarios.:
Publicar un comentario