(Para obtener una descripción detallada, consulte Protocolos de coherencia de caché (ejemplos) )
En informática, MOESI ("Modified Owned Exclusive Shared Invalid") es un protocolo de coherencia de caché completo que abarca todos los estados posibles comúnmente utilizados en otros protocolos. Además de los cuatro estados comunes del protocolo MESI , existe un quinto estado "Propiedad" que representa datos modificados y compartidos. Esto evita la necesidad de escribir datos modificados en la memoria principal antes de compartirlos. Si bien los datos aún deben reescribirse eventualmente, la reescritura puede diferirse.
Para que esto sea posible, deben ser posibles las transferencias directas de datos de caché a caché, de modo que una caché con los datos en el estado modificado pueda suministrar esos datos a otro lector sin transferirlos a la memoria.
Como se analiza en el Manual del programador de arquitectura AMD64 vol. 2 ' Programación del sistema ' , [1] cada línea de caché se encuentra en uno de cinco estados:
Para cualquier par de cachés determinado, los estados permitidos de una línea de caché determinada son los siguientes:
(El orden en que normalmente se enumeran los estados sirve sólo para que el acrónimo "MOESI" sea pronunciable).
Este protocolo, una versión más elaborada del protocolo MESI más simple , evita la necesidad de escribir una línea de caché sucia en la memoria principal cuando otro procesador intenta leerla. En cambio, el estado Propiedad permite que un procesador suministre los datos modificados directamente al otro procesador. Esto resulta beneficioso cuando la comunicación entre dos CPU es significativamente mejor que con la memoria principal. Un ejemplo serían las CPU multinúcleo con cachés L2 por núcleo.
Si bien MOESI puede compartir rápidamente líneas de caché sucias del caché, puede tener dificultades para compartir rápidamente líneas limpias del caché. Si una línea de caché está limpia con respecto a la memoria y en el estado compartido, entonces no hay un caché candidato único obvio para responder a una solicitud de lectura, por lo que es normal dejar que la solicitud de lectura se complete desde la memoria. (Esto se resuelve mediante el protocolo MESIF , que se puede combinar con MOESI para crear MOESIF).
Si un procesador desea escribir en una línea de caché de propiedad, debe notificar a los demás procesadores que comparten esa línea de caché. La implementación estándar simplemente les dice que invaliden sus copias, moviendo su propia copia al estado Modificado cuando esto esté completo, pero alternativamente puede usar una política de escritura directa , diciéndoles que actualicen sus copias con el nuevo contenido. Se trata de una escritura parcial que no llega hasta la memoria principal; la copia del procesador permanece en el estado Propiedad.
Esto último reduce el tráfico de caché si hay múltiples lectores activos de, por ejemplo, un bloqueo muy disputado ; una escritura transmitida es menos comunicativa que respuestas separadas a una multitud atronadora de solicitudes de lectura. Debido a que estas dos variantes son totalmente compatibles, ambas pueden usarse en el mismo sistema basándose en heurísticas como la estimación del caché del número de lectores activos de esta línea de caché.