S. Salva

MODULE Système

TP4 Le Pipeline


1. Programmation multithreadée par pipeline

Le pipeline est une technique employée dans les processeurs

Principe: Plusieurs threads réalisent un pipeline virtuel. Un flot de données parcourt le pipeline

On a recouvrement des calculs entre threads et recouvrement possible entre calcul et synchronisations

=> le but est d’obtenir un pipeline équilibré sans  trous 

exemple:

On considère qu’une tache peut être découpée en : T= S+C+D+P (sérialisation, connexion, desérialisation, persistance).

Le pipeline idéal:

pipeline ideal

Et ce que l’on peut obtenir réellement:

pipeline à trou

2. Exemple d'implantation en Java

L'objectif de cet exercice est d'implanter un pipeline simple qui échange un entier entre étage. Chaque étage incrémente l'entier reçu et le renvoie au suivant. Chaque étage est représenté par un thread qui lit dans une Collection un élément et rend le résultat dans une autre Collection.

On considère qu'au moins ces 4 classes sont utilisées :

  1. la classe Stage qui a une constructeur Stage(BlockingQueue in, BlockingQueue out, int number).  Elle possède une méthode run() à compléter. De façon infinie, un étage lit dans in, incrémente la valeur reçue et l'ajoute dans out. Le paramètre number correspond au numéro d'étage
  2. une classe qui implémente l'interface BlockingQueue, qui gère la synchronisation entre threads !! Lorsque un thread ajoute un entier à une queue, les autres threads doivent être prévenus. Les autres threads souhaitant prendre une valeur dans une queue, attendent qu'une nouvelle valeur soit ajoutée (tant que int est à 0, le thread appelant take() doit attendre indéfiniment avec un wait, etc.),
  3. la classe Listener, qui permet juste d'avoir un affichage des étages. Elle possède un constructeur public Listener(BlockingQueue b) et une méthode run() qui infiniment prends une valeur dans la BlockingQueue et l'affiche avec System.out.println("resultat " +tmp),
  4. la classe Pipeline qui possède une méthode main et qui construit un pipeline, donnée ici

A

Quelle collection prend t-on pour implémenter la classe BlockingQueue ?


B

Codez les classes ci dessus. Vous devriez avoir un projet complet. Testez !

C

Ajoutez une condition d'arrêt pour stopper proprement le Pipeline


3. Optimisation de votre pipeline.

A

Au lieu de passer un entier d'étage en étage, implantez une classe Result qui permet de stocker:

  1. un objet donné au pipeline
  2. les objets obtenus après chaque étage


B

Faites une classe Work qui possède N méthodes, une par étage. 
Les méthodes récupèrent une instance de Result font un calcul, un affichage et appellent Sleep pendant 2s. Modifiez votre projet pour que chaque méthode soit lancée par chaque étage de votre Pipeline.
Ici, chaque méthode doit récupérer un objet Integer et doit incrémenter sa valeur.

C

Utilisez un TimerTask pour ajouter un nouvel élément dans le Pipeline toutes les 3 secondes