# Protocolo MESI

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 en la caché respecto 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 | Sí |
| E | No | No | No | Sí |
| S | No | No | Sí | Sí |
| I | Sí | Sí | Sí | Sí |

## Operaciones

Se puede leer de caché en cualquier estado excepto en Inválidos. 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 todos los pedidos de invalidez(Requests For Ownerhip), que son transmitidos mediante Broadcast, de otras CPUs, y descartar la línea (cambiándola a estado Inválido) si encuentra uno (un pedido de invalidez).
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 descarta una línea Compartida, y ésta 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 una línea de caché que está en estado Compartido, es necesario un intercambio por el bus para invalidar cualquier otra copia en caché. El estado Exclusivo permite modificar una línea de caché sin ningún intercambio por el bus.