El protocolo MOESI ( Modified Owned Exclusive Shared Invalid ) es un protocolo de coherencia de caché completa 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, "Owned", que representa datos modificados y compartidos. Esto evita la necesidad de escribir los datos modificados en la memoria principal antes de compartirlos. Si bien los datos deben escribirse eventualmente, esta escritura puede posponerse.
Para que esto sea posible, deben ser posibles las transferencias directas de datos entre cachés, 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 explica en el Manual del programador de la arquitectura AMD64, vol. 2 , ' Programación del sistema ' , [ 1 ] cada línea de caché se encuentra en uno de cinco estados:
- Modificado
- Esta caché contiene la única copia válida de la línea de caché y ha realizado cambios en dicha copia. La copia almacenada en caché puede modificarse libremente.
- Propiedad de
- Esta línea es una de las varias copias que existen en el sistema. Esta caché no tiene permiso para modificar la copia, pero la línea se modifica (se marca como sucia) con respecto a la memoria principal, y esta caché es la única responsable de garantizar que la memoria principal se actualice eventualmente. La línea de caché puede cambiar al estado Modificada tras invalidar todas las copias compartidas, o cambiar al estado Compartida escribiendo las modificaciones de vuelta a la memoria principal. Las líneas de caché propias deben responder a una solicitud de inspección con datos para garantizar que la copia obsoleta en la memoria principal no se utilice.
- Exclusivo
- Esta caché contiene la única copia de la línea, pero la línea está limpia (sin modificar). Se puede escribir en ella, cambiando su estado a Modificado.
- Compartido
- Esta línea es una de varias copias en el sistema. Esta caché no tiene permiso para modificar la copia. A diferencia del protocolo MESI, una línea de caché compartida puede estar sucia con respecto a la memoria; si lo está, una caché tiene una copia en estado "Propiedad" y esa caché es responsable de actualizar eventualmente la memoria principal. Si ninguna caché mantiene la línea en estado "Propiedad", la copia en memoria está actualizada. La línea de caché no se puede escribir, sino que primero debe cambiarse al estado "Exclusivo" o "Modificado", invalidando todas las demás copias en caché. (Si la línea de caché estaba "Propiedad" antes, la respuesta de invalidación lo indicará y el estado pasará a "Modificado", por lo que no se olvida la obligación de escribir eventualmente los datos de vuelta a la memoria). También se puede descartar (cambiar al estado "Inválido") en cualquier momento.
- Inválido
- Este bloque no es válido; debe ser recuperado para satisfacer cualquier intento de acceso.
Para cualquier par de cachés dado, los estados permitidos de una línea de caché determinada son los siguientes:
(El orden en que normalmente se enumeran los estados sirve únicamente para que el acrónimo "MOESI" sea pronunciable).
Este protocolo, una versión más elaborada del protocolo MESI , evita tener que escribir una línea de caché modificada en la memoria principal cuando otro procesador intenta leerla. En su lugar, el estado "Owned" permite que un procesador envíe los datos modificados directamente al otro. Esto resulta ventajoso cuando la comunicación entre dos CPU es significativamente mejor que la comunicación 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 las líneas de caché modificadas, puede tener dificultades para compartir rápidamente las líneas limpias. Si una línea de caché está limpia con respecto a la memoria y en estado compartido, no existe una única caché candidata obvia para responder a una solicitud de lectura, por lo que es normal que la solicitud de lectura se complete desde la memoria. (Esto se resuelve con el protocolo MESIF , que puede combinarse con MOESI para formar MOESIF).
Si un procesador desea escribir en una línea de caché propia, debe notificar a los demás procesadores que comparten dicha línea. La implementación estándar simplemente les indica que invaliden sus copias, pasando la suya propia al estado Modificado una vez completado este proceso. Alternativamente, puede utilizar una política de escritura directa , indicándoles que actualicen sus copias con el nuevo contenido. Esta es una escritura directa parcial que no llega hasta la memoria principal; la copia del procesador permanece en el estado Propietario.
Esta última reduce el tráfico de caché si hay varios lectores activos, por ejemplo, de un bloqueo con alta contención ; una escritura de difusión genera menos comunicación que respuestas individuales a una avalancha de solicitudes de lectura. Dado que estas dos variantes son totalmente compatibles, pueden utilizarse en el mismo sistema basándose en heurísticas como la estimación que hace la caché del número de lectores activos de esta línea de caché.
Véase también
Referencias
- ↑ "Manual del programador de la arquitectura AMD64, vol. 2, 'Programación del sistema'"" (PDF) . págs. 169– 172. Archivado del original (PDF) el 19 de junio de 2017. Recuperado el 28 de agosto de 2015 .
- Coherencia de caché
- Caché (informática)