Documents de l'UE INF223

$Id: index.texi,v 1.6 2011/11/21 14:48:44 pautet Exp $


Next: , Previous: (dir), Up: (dir)

Index


Next: , Previous: Top, Up: Top

1 Introduction

Ce cas d'étude à pour objectif de vous faire mettre en oeuvre les techniques aprises pendent l'UE dans un cas d'application concret et relativement complexe.

Ce cas d'étude comporte un aspect théorique ainsi qu'un aspect pratique. Côté théorique, il s'agit de comprendre et d'utiliser des résultats de recherche dans le domaine de la concurrence, plus spécifiquement un algorithme d'exclusion mutuelle. Cet algorithme sera utilisé pour résoudre un problème inspiré de la vie réelle. Du point de vue technique, il faudra implémenter la solution en mettant en oeuvre trois techniques différentes. Dans la première approche, la concurrence est simulée à l'aide de threads Java sur une seule machine. Ensuite vous utiliserez une approche bas-niveau qui utilise les sockets. La dernière approche utilise CORBA, un middleware de haut niveau.


Previous: Introduction, Up: Top

2 Cahier des Charges


Next: , Previous: Cahier des Charges, Up: Cahier des Charges

2.1 Un Album Photo Partagé

On considère un ensemble d'étudiants qui partagent un album photo numérique. Les étudiants sont distants, et toute communication se fait par envoi de messages. Lorsqu'un étudiant ajoute une photo à l'album, les autres étudiant peuvent la voir.

L'album photo doit avoir une cohérence forte. Cela veut dire qu'il n'existe jamais plus d'une version de l'album. De plus, il est demander d'implémenter l'ablum en utilisant trois technologies de répartition différentes: les threads, les sockets, et CORBA. Nous nous intéressons uniquement à l'accès en écriture à l'album photo; le contenu même de l'album n'est pas considéré.


Next: , Previous: Un Album Photo Partagé, Up: Cahier des Charges

2.2 L'Accès Exclusif en Ecriture

Afin de garantir la forte cohérence de l'album photo, nous allons mettre en place un accès exclusif en écriture sur l'album, ce qui veut dire qu'un seul étudiant peut écrire dans l'album à la fois.

L'algorithme d'exclusion mutuelle répartie que nous allons utiliser est l'algorithme de Naimi-Trehel. Cet algorithme défini un vérrou réparti qui fonctionne à base de jeton. Il existe un unique jeton dans le système, et seul le noeud propriétaire du jeton est autorisé à accéder à la ressource partagée. L'algorithme de Naimi-Trehel décrit la façon dont les noeuds du système communiquent afin partager le jeton de façon égale et efficace. L'algorithme est basé sur un arbre réparti qui lie les noeuds entre eux. Cet arbre indique le chemin vers le dernier noeud demandeur du jeton (la racine de l'arbre). D'autre part une liste indique le chemin par lequel le jeton sera transmit d'un noeud à l'autre. Lorsqu'un noeud veut demander ou transmettre le jeton, il se sert de ces structures pour determiner à quel noeud doit être envoyé le message.

2.2.1 Explication de l'Algorithme

Dans notre cas d'étude, les étudiants sont les noeuds et l'album photo est la ressource partagée. Chaque étudiant possède deux champs qui servent à définir l'arbre et la liste évoquées ci-dessus:

Lorsqu'un étudiant reçoit une requête (éventuellement la sienne) pour obtenir le jeton, il a le comportement suivant:

La figure suivante donne un exemple classique de scénario:

scenario-classique.gif


Next: , Previous: L'Accès Exclusif en Ecriture, Up: Cahier des Charges

2.3 Architecture et Comportement Global

Ce système consiste d'un verrou réparti qui protège l'accès en écriture sur l'album photo partagé par des acteurs distants. La figure suivant montre une version simplifiée de l'architecture adoptée:

archi-globale.gif

L'architecture que nous adoptons pour un noeud se décompose en 5 composants. Un composant Actor se charge de demander et relâcher le verrou sur l'album, en ponctuant ces demandes par des délais aléatoires. Ces requêtes sont adressés à un composant Proxy qui fournit une interface locale vers le verrou réparti. Il propose la même interface que l'objet partagé (l'album) mais s'interpose entre lui et l'utilisateur afin de masquer la complexité de l'objet réel. En local, un acteur accède au verrou réparti au travers de son proxy. Ainsi, en plus d'attribuer en local le verrou, le proxy devra céder ou reprendre le verrou aux autres noeuds. Le composant Agent se charge de mettre en oeuvre l'algorithme en recevant et en traitant les requêtes venant d'autres noeuds ou de son propre Proxy. Il se charge également lorsque l'algorithme le requiert d'envoyer des requêtes aux agents des autres noeuds ou au composant Proxy de son propre noeud. Notamment ni le proxy ni l'acteur ne se chargent d'envoyer des requêtes mais passent par l'agent. Donc, cet agent soit reprend le verrou au proxy et le transmet à un acteur distant soit fait suivre la requête (éventuellement de son proxy). Le composant Channel se charge d'établir la communication entre les différents noeuds. Le Buffer contient une file de requêtes. Le channel écrit les messages externes dans le buffer et l'agent va y lire. Un composant spécial appelé Système contient des fonctionnalités générales qui ne sont pas spécifiques aux composants cités ci-dessus.

L'architecture sur un noeud est représentée sur la figure ci-dessous:

archi-locale.gif

Les informations concernant les noeuds (nom, localisation) se trouvent stockées dans le fichier nodes. La méthode readConfFile se charge de lire ce fichier et de remplir la table des noeuds.


Next: , Previous: Architecture et Comportement Global, Up: Cahier des Charges

2.4 Architecture Détaillée


Next: , Previous: Architecture Détaillée, Up: Architecture Détaillée

2.4.1 Modélisation de l'Actor


Next: , Previous: Modélisation de l'Actor, Up: Architecture Détaillée

2.4.2 Modélisation du Channel


Next: , Previous: Modélisation du Channel, Up: Architecture Détaillée

2.4.3 Modélisation du Proxy

La figure ci-dessous indique l'interface que fournit le verrou distant:

proxy-classe.gif

La figure ci-dessous rappelle les différents états du proxy:

proxy-automate.gif

Comportement du Proxy

Le code de Proxy se trouve dans Proxy.java.


Next: , Previous: Modélisation du Proxy, Up: Architecture Détaillée

2.4.4 Modélisation de l'Agent


Previous: Modélisation de l'Agent, Up: Architecture Détaillée

2.4.5 Modélisation du Système

Nous fournissons également les codes complets du reste du système. Notamment :

Nous rappellons que certaines classes doivent avoir été conçues lors de travaux pratiques précédents.


Previous: Architecture Détaillée, Up: Cahier des Charges

2.5 Scénario Particulier

Un scénario particulier permet de comprendre certaines subtilités du code demandé dans la version Threads. Nous en donnons le déroulement dans la figure suivante:

scenario-particulier.gif
  1. Proxy 1 n'a pas le verrou et le demande à Agent 1 qui fait suivre au Noeud 3
  2. Agent 2 demande le verrou que Noeud 1 va recevoir, Noeud 1 prend en compte la demande en mettant à jour lastOwner et nextOwner
  3. Agent 1 reçoit le verrou et le délivre à Proxy 1 qui débloque Actor 1 et dans la continuité ...
  4. Noeud 2 étant propriétaire (étape 2), Agent 1 demande à Proxy 1 de rendre le verrou (request)
  5. A la suite de Unlock, Proxy 1 transmet le verrou à Agent 1 qui fait suivre à Noeud 2