• Aucun résultat trouvé

Un exemple de protocole non tolérant aux fautes

Partie II – Notre contribution : une approche hiérarchique conjointe pour la

5.2 Un exemple de protocole non tolérant aux fautes

– Quelle est la valeur finalement attribuée à la donnée en cas d’écritures concurrentes ? – Autorise-t-on les lectures concurrentes à une écriture ?

– Quelle est la valeur retournée par une lecture d’une donnée lorsque qu’il y a une écri-ture concurrente ?

– Autorise-t-on les lectures concurrentes ?

Les applications qui partagent les données doivent savoir quelles garanties sont offertes en terme de cohérence. Par exemple : la valeur retournée par une lecture prend-elle toujours en compte toutes les écritures qui ont été effectuées auparavant ? Ou encore : un processus est-il seul à accéder à la donnée pendant une période de temps donnée ? Souvent, un proces-sus doit pouvoir effectuer une lecture et une écriture sur une donnée partagée de manière atomique. Ce sera le cas notamment si un processus doit incrémenter la valeur d’une va-riable :x := x+ 1. Pour rester cohérente, la valeur de la donnée ne doit pas être modifiée (c’est-à-dire qu’il ne doit pas y avoir d’écriture) entre la lecture (partie droite de l’affectation) et l’écriture (affectation).

Un contrat avec les applications. Les garanties de cohérence font l’objet d’un contrat entre les applications distribuées et le système qui gère le partage de données. Comme détaillé au chapitre 4, ce contrat est appelémodèle de cohérence. Dans ce chapitre, nous nous concentrons sur un exemple de protocole de cohérence implémentant le modèle de cohérence à l’entrée introduit par le système à mémoire virtuellement partagée Midway [15]. Ce modèle permet d’offrir des accès aux données performants, il convient particulièrement aux applications de calcul scientifique.

5.2 Un exemple de protocole non tolérant aux fautes

Les études de la cohérence des données dans les systèmes à mémoire virtuellement par-tagée ont montré que les modèles de cohérence relâchée pouvaient être implémentés par des protocoles efficaces. En revanche, les garanties de cohérence des données sont plus res-treintes. Par exemple, les applications accédant aux données partagées doivent utiliser des opérations de synchronisation commeacquireourelease. L’opérationacquirepermet de s’assu-rer que les accès à la donnée qui suivront respecteront les garanties de cohérence. L’opération releasepermet quant à elle de garantir la propagation, éventuellement paresseuse, des mises à jours locales dans le système. Comme décrit dans la section 4.1.2, ceci est vrai pour des modèles comme la cohérence à la libération [51], la cohérence à l’entrée [15] et la cohérence de portée [61].

5.2.1 Le modèle de cohérence à l’entrée

Nous choisissons lemodèle de cohérence à l’entréepour cet exemple. Il présente la particu-larité d’associer explicitement un objet de synchronisation spécifique à chaque donnée. Cette particularité permet un gain de performance au niveau du protocole de cohérence. En effet, lorsqu’un processus entre en section critique1pour accéder à une donnée, par exemple pour

1Une section critique correspond à une portion de code manipulant des ressources communes ne devant être accédées que par un seul processus à la fois.

lire la valeur de la donnée avant de la mettre à jour, il doit le faire via l’objet de synchroni-sation associé à cette donnée. Ainsi, sur un nœud, le protocole de cohérence n’a à garantir que la cohérence des données accédées au sein de la section critique associée. Cela permet d’éviter des mises à jour non nécessaires : seuls les processus qui déclarent qu’ils vont accé-der aux données seront concernés. De plus ne seront mises à jour que les données qui seront effectivement accédées.

Afin d’utiliser le modèle de cohérence à l’entrée, les programmeurs d’applications doivent respecter deux contraintes. Premièrement, chaque donnée partagée doit être asso-ciée à un objet de synchronisation spécifique. Deuxièmement, les accèsnon-exclusifsou en lecture seule(c’est-à-diresansmise à jour de la valeur de la donnée) doivent être distingués desaccès exclusifs(c’est-à-direavecmise à jour de la valeur de la donnée). La distinction entre les deux types d’accès est faite en utilisant des primitives différentes :acquire_readpour en-trer dans une section de code où l’on effectue des accès non-exclusifs, etacquirepour entrer dans une section critique comprenant des accès de type exclusif. Ceci permet au protocole de cohérence d’autoriser des accès concurrents en lecture : plusieurs processus peuvent accéder en lecture, de manière concurrente, à une même donnée.

5.2.2 Un protocole basé sur une copie de référence

Comme point de départ pour cet exemple, nous choisissons un protocoleimplémentant lemodèle de cohérence à l’entrée. Le protocole choisi est fondé sur la notion decopie de ré-férence(home based) associée à chaque donnée partagée. Le nœud sur lequel l’unique copie de référence est placée (home node) est également responsable de la gestion de l’objet de syn-chronisation associé à la donnée.

Lorsqu’un processus accède à la donnée, il le déclare en verrouillant l’objet de synchroni-sation par l’intermédiaire d’une des primitives de synchronisynchroni-sation :acquireouacquire_read.

Lors de l’appel à l’une de ces primitives, la copielocale, située sur le même nœud que le processus, est mise à jour si nécessaire. De la même manière, lorsque le processus quitte la section au sein de laquelle il accédait à la donnée, il relâche l’objet de synchronisation par l’intermédiaire de la primitiverelease. Si la donnée a été modifiée par le processus durant la section critique, les mises à jour locales sont alors propagées à la copie de référence.

Il apparaît donc que de nombreuses communications sont nécessaires entre les nœuds sur lesquels s’exécutent les processus accédant à une donnée partagée et le nœud hébergeant la copie de référence associée à cette donnée. La figure 5.1 illustre les communications qui ont lieu entre le nœud hébergeant la copie de référence et celui sur lequel s’exécute un processus accédant à la donnée, appelé aussinœud client.

5.2.3 Fonctionnement du protocole de cohérence

La figure 5.1 illustre le fonctionnement du protocole de cohérence lorsque les interac-tions sont limitées à un seul client. Il n’y a donc pas, dans cet exemple, de mise en attente au niveau du nœud hébergeant la copie de référence entre la réception d’une requête de syn-chronisation et l’envoi de l’autorisation d’accès : l’attente du processus client est limitée à la somme des temps de communications et du temps de traitement de la requête. Cependant, le protocole de cohérence gère aussi l’accès à une donnéepartagéeaccédée par de multiples processus potentiellement de manière concurrente. Lorsque plusieurs processus accèdent

5.2 – Un exemple de protocole non tolérant aux fautes 59

Envoi de la donnée d Noeud client Noeud hébergeant la copie de référence

Temps requête

acquire(d)

Attente

write(d) locaux

Accès

read(d)

release(d)

d

d

Mise à jour de d Attente

Mise à jour propagée

acquittement

FIG. 5.1 – Communications entre un nœud client et un nœud hébergeant une copie de réfé-rence pour une donnéed.

de manière concurrente à la donnée le protocole met en attente certains processus afin de garantir la cohérence des accès.

Ce comportement est représenté par l’automate à états de la figure 5.2 qui décrit le fonc-tionnement simplifié du protocole de cohérence au niveau de la copie de référence. Cet au-tomate est composé de trois états principaux :NO_LOCK,ON_LOCK et ON_LOCK_R. Ils correspondent respectivement aux cas où : 1) l’objet de synchronisation associé à la donnée est libre ; 2) un processus a acquis l’objet de synchronisation en mode exclusif ; et 3) un ou plusieurs processus ont acquis l’objet de synchronisation en mode non-exclusif. En plus de ces trois états principaux, le protocole de cohérence gère trois listes : 1) L (pourLock) qui contient les identifiants des processus en attente pour un accès exclusif à la donnée ; 2)LR (pour Lock Read) qui contient les identifiants des processus en attente pour un accès non-exclusif ; et 3)OLR(pourOn Lock Read) qui contient les identifiants des processus possédant l’objet de synchronisation en mode non-exclusif. On remarque notamment que le protocole ne permet un accès exclusif qu’à un seul processus client à un moment donné. En effet, quand il se trouve dans l’étatON_LOCK, il ne redistribue pas cet accès et il ne sort de cet état qu’à la réception d’un message de relâchement de l’objet de synchronisation.

L’automate à états représenté par la figure 5.3 décrit le fonctionnement du protocole de cohérence au niveau du nœud client. A ce niveau, le protocole ne gère pas de liste. En effet, pour une donnée, le client ne communique qu’avec la copie de référence associée. Il est intéressant de remarquer que certains états (ceux grisés sur la figure) sont bloquants pour l’application. Cela permet par exemple de garantir que le processus possède bien l’objet de synchronisation associé et que la copie locale de la donnée soit bien mise à jour avant de laisser l’application accéder à la donnée.

& LR non vide

acquire_read

acquire_read acquire

acquire_read

acquire acquire

release & L vide

release &

L, LR et OLR sont des listes

NO_LOCK

ON_LOCK ON_LOCK_R

release &

L & LR vides release &

OLR & L vides

release &

L non vide

release & OLR vide

OLR vide

& L non vide

FIG. 5.2 – Automate à états représentant le protocole de cohérence au niveau de la copie de référence.

5.2 – Un exemple de protocole non tolérant aux fautes 61

ATTENTE UNLOCK ATTENTE

LOCK

ATTENTE LOCK_R

acquire acquire_read

release release

acquitement reçu

acquitement reçu

acquitement reçu

ON_LOCK_R NO_LOCK

ON_LOCK

FIG. 5.3 – Automate à états représentant le protocole de cohérence au niveau du nœud client.

Les états non grisés ne bloquent pas l’application alors que les états grisés correspondent à des primitives synchrones.

Le protocole décrit ici n’est pas adapté à une architecture de type grille : 1) il est centralisé autour du nœud hébergeant la copie de référence et ne prend pas en compte la topologie réseau des grilles ; 2) il ne prend pas en compte la possibilité d’apparition de fautes. Les sections suivantes détaillent ces limites et proposent des solutions pour y faire face.