[t]40ex
UniversitéPierre & Marie Curie
U.F.R d'infomatique
[t]45ex
Maîtrise -- 2000-01
Programmation Objet et Distribution
Tavaux dirigés n° 8
Exercice I Threads indépendants.
Question (I.1) Déclarer deux classes Ping et Pong étendant la classe
Thread dont la méthode run est une boucle sans fin qui affiche,
respectivement,"ping" et
"PONG" puis attend un peu avant de recommencer.
Question (I.2) Déclarer une classe Go comprenant la méthode main qui lance une
instance de Ping et une instance de Pong.
Exercice II Threads synchronisés.
Question (II.1) Déclarer une classe Sem pour implanter un sémaphore simple. La
classe Sem contient un champ booléen curVal et deux
méthodes (get et set). La première méthode prend en
argument une valeur booléenne val et attend que le champs
curVal soit égal àval. Lorsque c'est le cas, elle
renvoie la valeur true. La seconde méthode prend en argument
une valeur booléenne pour modifier celle de curVal et signale
la modification. Ces deux méthodes doivent définir des sections
critiques.
Question (II.2) Définir ànouveau les classes Ping et Pong de
façon àce qu'elles se synchronisent en utilisant un sémaphore
de la classe Sem ci-dessus.
Question (II.3) Redéfinir la classe Go.
Exercice III Producteur-consommateur.
Question (III.1) Définir une classe Stock contenant quatre champs :
ip : indice (ou numéro) du dernier produit stocké ;
ic : indice (ou numéro) du dernier produit consommé ;
iMax : nombre maximal de produit pouvant être stockés ;
open : valeur booléenne valant true par défaut
et que le producteur pourra mettre àfalse.
La classe Stock offre quatre méthodes :
isOpen : indique si le stock est ouvert ou s'il reste
des produits à consommer ;
close : permet de faire passer le champs open àfalse ;
add : permet l'ajout dun produit (i.e. incrémenter
ip) et attend s'il n'y a plus de place disponible ;
peek : permet de retirer un produit (i.e. incrémenter
ic) et attend s'il n'y a pas de produit disponible. Cette
méthode peut déclencher une exception (StockClosed).
Question (III.2) Définir une classe Prod (pour le producteur) qui étend la
classe Thread. Le producteur produira un nombre fini de
produits. Sa méthode run boucle sur la séquence :
- ajouter un produit au stock;
- afficher;
- attendre.
Et ce, jusqu'àce que le nombre d'éléments à produire soit atteint.
Il ferme alors le stock.
Question (III.3) Définir une classe Cons (pour le consommateur) dont la méthode
run boucle infiniment sur la séquence :
- prendre un produit dans le stock;
- afficher;
- attendre.
La sortie de boucle est provoquée par l'exception StockClosed.
Question (III.4) Écrire une classe Go pour tester.
Exercice IV Priorités.
On veut simuler une gestion un peu équitable de processus.
Question (IV.1) Écrire un classe Shared contenant un tableau d'entiers
et offrant deux méthodes : synchronized int[] getBounds() qui
founit (dans un tableau de deux entiers) l'indice des éléments
maximal et minimal : synchronized int access(int i) qui
incrémente et retourne la ième case du tableau. Chacune des cases
du tableau servira de compteur pour autant de processus.
Question (IV.2) Écrire une classe Proc qui encapsule une instance de
Shared (disons ns) et un entier (disons i). Elle
étendra Thread et sa méthode run est une boucle sans
fin qui se contente d'accéder (selon la méthode access) au
i-ième élément du tableau que contient ns.
Question (IV.3) Écrire une classe Monit, qui étend Thread et
dont la méthode run crée une instance de Shared et
autant de processus, puis assure l'équitéentre ces processus
selon le principe suivant : régulièrement, le processus dont le
compteur est minimal reçoit une prioritémaximal (moins 1), les
autres, une prioritéminimale. On affichera aussi régulièrement
la valeur de la différence entre maximal et minimal. On assure ainsi
que la différence entre les compteurs ne varie pas trop.
Question (IV.4) Écrire une classe Go contenant une méthode
main qui lance le moniteur avec une prioritémaximale.
Question (IV.5) (Àréaliser sur machine) Implantez les classes ci-dessus et
faite tourner. Écrivez une version laxiste du moniteur qui ne
modifie pas les priorités (égales pour tous par défaut). Faites
tourner. Qu'en conclure ?
This document was translated from LATEX by HEVEA.