• Aucun résultat trouvé

Système étudié avec ou sans cache d’arbre de Merkle

Dans la version sans cache on distingue la mémoire externe, seule attaquable, l’émetteur de requêtes d’accès à la mémoire (CPU) et le Contrôleur d’Arbres de Merkle (CAM). Dans la version modifiée, le CAM est remplacé par un sous-système composé du cache proprement dit

et du Contrôleur de Cache d’Arbre de Merkle (CCAM). La gestion du cache est assurée par le CCAM qui pilote le cache à l’aide d’opérations élémentaires que nous définirons. En retour, le cache communique des informations sur son état au CCAM afin de lui permettre l’arrêt au plus tôt des vérifications ou des mises à jour et d’effectuer des opérations de maintenance (évictions...).

3.3.4.1 Les opérations élémentaires du cache

La stratégie ALAP nous conduit à nous intéresser à des arbres de Merkle où certains nœuds ont deux versions différentes, une version dirty stockée dans le cache et une autre version stockée en mémoire externe. Dans la suite nous les nommerons Arbres de Merkle Cachés (AM- Cached). Pour tout nœud N (i, j) en cache on notera Nc(i, j) la version en cache et Nm(i, j) la version en mémoire externe. Si le nœud est clean on a donc Nc(i, j) = Nm(i, j) alors que

s’il est dirty on a Nc(i, j) 6= Nm(i, j). Par extension, pour les nœuds qui ne sont pas en

cache on considérera que Nc(i, j) = Nm(i, j).

La stratégie ALAP stoppe la mise à jour d’une branche dès qu’un nœud de la branche est écrit dans le cache et devient donc dirty. Un nœud dirty a donc toujours un père obsolète, calculé à partir de l’ancienne valeur de ses fils dirty, celle qui se trouve en mémoire externe. Cette remarque est à la base du fonctionnement détaillé de la stratégie ALAP : lors de la vérification d’un groupe de nœuds, c’est toujours la version en mémoire externe des nœuds dirtyqui est utilisée. Le nœud père, lui, est lu depuis le cache s’il s’y trouve, qu’il soit dirty ou non.

En plus des opérations de cache classiques de lecture et d’écriture, nous ajoutons donc une nouvelle opération de lecture modifiée (RESTORE) destinée à lire la version en mémoire externe des nœuds fils dirty.

La capacité du cache n’étant pas infinie il est inévitablement nécessaire de procéder à des évictions et, lorsqu’elles ciblent un nœud dirty, de synchroniser celui-ci avec la mémoire externe en l’y écrivant. Nous introduisons donc également l’opération dédiée à cette synchro- nisation (SYNCHRONIZE).

La politique de remplacement du cache, quelle qu’elle soit, est utilisée lorsque c’est néces- saire pour sélectionner un emplacement dans le cache susceptible d’accueillir un nœud. Selon le degré d’associativité du cache le nombre d’emplacements candidats peut être plus ou moins grand, depuis un seul pour les caches directs jusqu’au nombre total d’emplacements pour les caches totalement associatifs. Lorsque un ou plusieurs emplacements candidats sont libres, l’un d’entre eux est sélectionné. Lorsque aucun emplacement candidat n’est libre mais que un ou plusieurs sont occupés par un nœud clean, l’un d’entre eux est sélectionné par la politique de remplacement du cache. Si aucun emplacement candidat n’est libre ni occupé par un nœud clean, l’opération échoue et renvoie la coordonnée (i, j) d’un nœud victime dirty occu- pant un emplacement candidat. L’auteur de la requête doit alors utiliser cette information pour procéder à une éviction avant de soumettre à nouveau sa requête.

Au total, le cache ALAP Write-Back-Allocate implémente les 4 opérations de base sui- vantes :

— READ (adresse) : lecture classique d’un nœud dans le cache s’il s’y trouve (cache hit), dans la mémoire externe sinon (cache miss). En cas de miss, le nœud lu est sto- cké dans le cache si c’est possible. Sinon il n’est pas stocké en cache. READ renvoie (V, status), où V est la valeur lue et status un indicateur valant hit-clean, hit-dirtyou miss.

— WRITE (adresse, nœud) : écriture classique d’un nœud dans le cache si c’est pos- sible. Le nœud n’est pas écrit en mémoire externe (politique Write-Back) et devient dirty. Les nœuds parents deviennent obsolètes, qu’ils soient en cache ou non. WRITE renvoie (status, (i, j)) où status est un indicateur valant ok ou fail et (i, j) la coordonnée d’un nœud victime à évincer lorsque l’opération échoue (signalé par status= fail).

— RESTORE (adresse) : lecture modifiée d’un nœud. Le comportement dépend de l’état du cache :

— Le nœud est en cache et dirty : lecture dans la mémoire externe, le nœud lu n’est pas stocké dans le cache car il entrerait en conflit avec la version dirty du même nœud.

— Dans tous les autres cas (clean ou miss), l’opération se comporte comme READ (adresse).

RESTORErenvoie uniquement la valeur lue V .

— SYNCHRONIZE (adresse) : si le nœud est en cache et dirty, écriture en mémoire externe, le nœud devient clean. Sinon l’opération n’a aucun effet. SYNCHRONIZE ne renvoie rien.

Précisons que ces opérations sont atomiques, c’est à dire qu’elles ne peuvent être inter- rompues et qu’aucune autre interaction avec le cache ou la mémoire externe ne peut avoir lieu pendant leur déroulement.

Notons que la spécification de ces 4 opérations comporte déjà des choix d’implémentation non directement contraints par la stratégie ALAP ou la politique Write-Back-Allocate. En effet, READet RESTORE pourraient, tout comme WRITE, échouer en cas de miss lorsque le nœud lu en mémoire externe ne peut pas être stocké dans le cache faute d’emplacement disponible. Nous verrons ultérieurement pourquoi ceci n’est pas nécessaire et comment nous contrôlons la saturation du cache en nœuds dirty de façon à disposer toujours d’emplacements disponibles lors des READ et des RESTORE.

Par extension et pour simplifier les algorithmes présentés nous considérerons que les opé- rations READ et RESTORE s’appliquent également aux données protégées par l’AMCached. Comme les données ne sont jamais stockées dans le cache d’AMCached, READ et RESTORE de données sont équivalentes à la lecture classique non vérifiée en mémoire externe.

C’est sur ces 4 opérations que repose la gestion du cache.

3.3.4.2 Cohérence interne partielle

Dans les figures d’AMCacheds qui suivent, les nœuds dirty sont dédoublés afin de re- présenter les versions en cache et en mémoire externe. Les extrémités des arêtes représentées précisent quelle version est le parent de quelle autre.

Avant de décrire la gestion du cache nous allons tout d’abord définir une propriété particu- lière sur les AMCacheds : la Cohérence Interne Partielle (CIP).

Définition 1. Un AMCached est dit CIP si et seulement si, pour chacun de ses nœuds N (i+1, j) on a :

Nc(i + 1, j) = Digest(Nm(i, a × j), Nm(i, a × j + 1), ..., Nm(i, a × j + a − 1))

La figure 3.7 représente un AMCached CIP. On notera que la CIP ne fait aucune différence entre les nœuds qui ne sont pas en cache et ceux qui sont en cache mais clean. Dans les deux cas ils doivent être le condensé des versions en mémoire externe de leurs fils. Dans le cas des nœuds dirty la propriété précise que c’est la version en cache - et non pas la version en mémoire externe - qui doit être le condensé des versions en mémoire externe de leurs fils.

dirtyversion cache dirtyversion mémoire

Feuille Obsolète cleanou non en cache