Examen de Programmation répartie de décembre 2000


Tous documents autorisés. Durée 2h.


1. Question de cours (6 points)

Répondre aux questions en justifiant brièvement (3 ou 4 phrases) vos réponses.
  1. Qu'est-ce qu'une invocation de méthode semi-synchrone ? En quoi cela permet-il d'introduire de la concurrence dans les programmes ?
  2. Dans le cadre de communications distantes, qu'est-ce qu'une souche ? Quel(s) type(s) de souche rencontre-t-on ?
  3. Que permet de faire le langage IDL de CORBA ? Quel est son intérêt ?
  4. Quelles sont les fonctionnalités de l'adaptateur d'objets dans un environnement CORBA ?
  5. Quelle est la différence entre les modes d'invocation de méthode statique et dynamique présents dans CORBA et dans DCOM ?
  6. Dans les modèles de composants vus en cours (EJB, CCM, DCOM) qu'est-ce qu'une fabrique ?

2. Répartiteur de charges (14 points)

Cet exercice a pour but d'étudier dans le cadre d'un environnement de programmation répartie un aiguilleur de requètes. Celui-ci permet de répartir la charge de traitements entre plusieurs machines.
La figure ci-dessous présente l'architecture envisagée qui comprend deux utilisateurs, un aiguilleur et trois machines identiques (i.e. fournissant les mêmes services). Les utilisateurs, l'aiguilleur et les machines sont des objets CORBA.
Les utilisateurs soumettent des requètes à l'utilsateur. Pour chaque requète, l'aiguilleur choisit de la redirider à une machine et une seule. La machine choisie traite la requète, fournit le résultat à l'aiguilleur qui le retransmet à l'utilisateur. Pendant le temps de traitement de la requète, l'aiguilleur peut aiguiler une nouvelle requète vers une autre machine ou vers la même. L'aiguilleur est donc un objet concurrent. Le degré de concurrence des machines est étudié dans la partie 3.


2.1 Interfaces (3 points)

2.1.1 Pour chcun des trois types d'objets CORBA (utilisateur, aiguilleur, machine), dire s'ils sont client (de qui), serveur (pour qui) ou client/serveur (de qui et pour qui). (1 point)

2.1.2 Chaque objet machine fournit deux services : On suppose dans un premier temps que tous les objets machines ont accès aux mêmes fichiers et que l'écriture dans un fichier est répercutée de façon immédiate et automatique sur toutes les machines. Donner en IDL CORBA la définition de l'interface Machine contenant ces 2 services. (2 points)

2.2 Aiguilleur (5 points)

2.2.1 Sans anticiper sur les questions suivantes et sans en donner la définition explicite, expliquer à partir des indications fournies jusqu'à présent, quelle doit être l'interface de l'aiguilleur. (1 point)

2.2.2 On souhaite maintenant que des objets machines puissent être ajoutés et retirés en cours d'exécution au "pool" d'objets géré par l'aiguilleur.
Quelle(s) méthode(s) faut-il définir pou prendre en compte ces fonctionnalités ? Pour quel(s) objet(s) ? Définir en IDL CORBA ou en pseudo code, l'interface Controle, réunissant ces fonctionnalités. Donner en français la signification précise de chaque élément (méthodes, paramètres, etc) défini. (1 point)

2.2.3 Proposer en français ou en pseudo code un algorithme, le plus simple possible, pour effecruer la répartition de charge. L'algorithme doit répartir équitablement les requêtes entre toutes les machines sans tenir compte du fait que certaines requêtes peuvent être plus longues que d'autres. (1 point)

2.2.4 On souhaite maintenant prendre en compte les charges des machines. Périodiquement les machines informent laiguilleur de leur niveau de charge. Celui-ci est représenté par un entier donnant le nombre de requête en attente sur la machine. On suppose que ces notifications sont des informations non prioritaires dont la perte est sans conséquence.
Quelle(s) méthode(s) faut-il définir pour prendre en compte cette fonctionnalité ? Pour quel(s) objet(s) ? Définir en IDL CORBA ou en pseudo code, l'interface Notification compenant cette fonctionnalité. (1 point)

2.2.5 Finalement, comment construit-on l'interface complète de l'aiguilleur prenant en compte l'ensemble des fonctionnalités le concernant ? (1 point)

2.3 Concurrences des traitements (3 points)

2.3.1 Expliquer quel peut être le degré de concurrence acceptable pour une machine en fonction des deux types de requètes lecture et écriture. (1 point)

2.3.2 On considère maintenant que lors d'une opération d'écriture,la mise à jour du fichier sur toutes les machines est à la charge de la machine qui traite la requète d'écriture.
Faut-il ajouter les définitions aux interfaces précédentes pour prendre en compte ce cas ? Si oui, le(s)quelle(s) ? Si non, pourquoi ? (1 point)

2.3.3 On s'intéresse maintenant aux incohérences qui peuvent survenir lorsque l'aiguilleur répartit successivement deux requètes d'écriture pour un même fichier sur deux machines différentes.
Expliquer en quoi consiste cette incohérence. Proposer pour gérer ce problème au niveau de l'aiguilleur, une solution simple qui ne modifie aucune interface. (1 point)

2.4 Performances (3 points)

2.4.1 L'aiguilleur étant un point de passage obligé et de ce fait un goulet d'étranglement pour les requètes et les réponses, proposer une solution n'introduisant pas de nouvelles entités pour alléger sa charge, notamment en ce qui concerne la gestion des réponses.
Expliquer sans forcément les définir explicitement quelle(s) conséquence(s) cela entraîne sur les interfaces. (1 point)

2.4.2 Pour palier au problème du goulet d'étranglement, on propose en plus de la solution précédente, de mettre en place plusieurs aiguilleurs dont la répartition des rôles sera définit (codée "en dur" chez les utilisateurs).
Proposer deux façon de répartir le travail entre les aiguilleurs, autres que celle de l'algorithme que vous avez proposé en 2.2.3. (2 points)