En informatique, le protocole MOESI (Modified, Owned, Exclusive, Shared, Invalid) est un protocole de cohérence de cache utilisé dans les systèmes multiprocesseurs.
Rappels sur la cohérence
Les architectures à mémoire distribuée peuvent intégrer un mécanisme de cohérence de cache. Il s'agit d'assurer que la modification d’une ligne de cache soit bien reportée aux autres caches. On parle dans ce cas de ccNUMA pour cache coherent Non Uniform Memory Acces, c'est-à-dire en français « accès mémoire non uniforme ». En effet, dans le cas d’architecture multiprocesseur à mémoire distribuée, l’accès à la mémoire n’est pas uniforme selon que l’on accède à une mémoire locale ou distante. En outre, il est nécessaire d’implémenter un mécanisme pour assurer une bonne cohérence entre les données présentes dans les différentes mémoires cache. Par exemple, on comprend cette contrainte, lors de la migration d’une tâche d’un processeur à un autre. En effet, sans synchronisation, la tâche pourrait, paradoxalement, poursuivre son exécution sur le nouveau processeur en utilisant des données anciennes qu’elle a pourtant modifiées depuis.
MOESI
Le MOESI (Modified, Owned, Exclusive, Shared, Invalid) est précisément un protocole qui peut être utilisé pour maintenir une cohérence de cache. Il est une évolution du protocole MESI utilisé auparavant. Dans ce protocole, chaque ligne de cache se trouve dans l'un des cinq états cités suivants:
- I - Invalid : la ligne de cache ne contient pas la valeur actualisée de la donnée. Celle-ci se trouve en mémoire principale ou dans la mémoire cache d'un autre processeur,
- E - Exclusive : la ligne de cache contient la donnée la plus récente qui se trouve aussi en mémoire principale mais dans aucune des autres mémoires caches,
- S - Shared : la ligne de cache contient la donnée la plus récente. On ignore si elle se trouve aussi en mémoire principale ou dans une autre mémoire cache,
- M - Modified : la ligne de cache contient la donnée la plus récente qui ne se trouve dans aucune autre mémoire cache. De plus, la valeur contenue par la mémoire principale est incorrecte.
- O - Owned : la ligne de cache contient la donnée la plus récente qui peut se trouver aussi dans la mémoire cache d'un autre processeur. En revanche, la valeur contenue par la mémoire principale est incorrecte.
D’abord, une lecture peut être réalisée dans tous les états excepté "invalid". Dans ce dernier cas, une requête est émise à l’ensemble des unités. Il y a alors deux cas, la donnée peut être présente ou non dans une autre mémoire cache. Si elle s’y trouve, on la récupère alors directement, et l’état de la ligne de cache devient "Shared". Autrement, elle est récupérée depuis la mémoire RAM adéquate et la ligne devient "Exclusive".
Une écriture peut être effectuée directement dans les états "exclusive" et "modified". Dans les autres états, la donnée peut être chargée dans d’autres caches, il faut donc invalider toutes ces lignes avant de procéder à l’écriture. Finalement, lorsque ces invalidations ont été menées à bien, la donnée est écrite en cache et l’état de la ligne passe à "Modified", tandis que le " dirty bit" passe à 1 indiquant une différence entre la valeur en cache et en RAM.
Par ailleurs, c’est à cause de ce cas de figure que la réception de "Probe Write Hit" qui indique une écriture sur une autre unité, invalide systématiquement la ligne de cache.
Après une modification, celle-ci n’est pas reportée en mémoire principale tant que la ligne de cache n’est pas écrasée par des données correspondant à autre adresse. C’est pour cette raison, que l’on récupère prioritairement les données dans les autres caches. L’état "Owned" sert d’ailleurs à cela en prolongeant la durée pendant laquelle la RAM n’est pas actualisée. En effet, lorsqu’un autre processeur récupère une donnée modifiée pour la lire, l’état passe à "Owned" pour indiquer que la donnée a été recopiée ailleurs mais que le report sur la RAM n’a pas été fait. Cet état est indispensable car l’état "Shared" ne permet pas cette distinction. Ce nouvel état constitue l’évolution apportée au MESI. Ceci permet de rafraîchir la mémoire RAM moins souvent. En fait, on l’évite le plus longtemps possible, tant que la donnée reste présente en mémoire cache. L’état "exclusive" qui n’est pas non plus absolument indispensable permet d’éviter l’émission des requêtes inutiles. En effet, lorsque l’on sait qu’aucun cache ne dispose de la donnée, il est inutile d’émettre une requête malgré tout pour invalider des lignes de cache inexistantes. Or, ces requêtes encombrent inutilement les bus d’interconnexion ce qui nuit aux performances.