[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° 5



Dans cette feuille, nos emploierons le terme << processus >> pour désigner un << processus léger >>





Exercice I Fonctions de base sur les threads.


Question (I.1) Écrire une fonction ft1 de type unit -> unit qui affiche son numéro de processus, attend 1.5 secondes puis affiche un message de fin d'exécution.

Écrire une expression qui crée un processus exécutant ft1 et en attend la fin.


Question (I.2) Écrire une fonction ft2 de type int ref -> unit qui incrémente son argument (disons n), affiche son numéro de processus et la valeur de n et suspend son activitépendant une seconde au maximum, et ce, tant que la valeur de n est inférieure à5. En fin de boucle, ft2 affiche un message de sortie.


Question (I.3) Écrire une fonction ft3 qui crée deux processus t1 et t2 exécutant chacun ft2 avec un argument différent (disons n1 et n2). Ceci fait, la fonction ft3 affiche un message indiquant que t1 et t2 on étélancés, puis elle boucle tant que les valeurs de n1 et n2 n'ont pas atteint 5.


Question (I.4) Modifiez ft2 de façon àce qu'elle boucle infiniment (on appellera cette nouvelle fonction ft2bis).


Question (I.5) Modifiez ft3 de façon àce qu'aprés avoir lancédeux processus qui exécutent ft2bis, elle s'arrête dès qu'un compteur a atteint 5, termine immédiatement l'exécution des processus et affiche le numéro du processus ayant atteint 5.




Exercice II Exclusion mutuelle, attente sur condition.


Question (II.1) Modifiez ft2 en protégeant n par un verrou. La fonction devra prendre ce verrou en argument (on appellera ft2ter cette fonction).


Question (II.2) Modifez ft3 de façon àce qu'elle lance deux processus qui exécutent ft2ter et partagent la même variable àincrémenter. Modifiez sa boucle d'attente : on a un seul compteur et sa consultation être protégée par le verrou. Comment sortir de la boucle ? Affichez la valeur du compteur en fin de compte. Peut-on déterminer qui est vainqueur ?


Question (II.3) Rajoutez àft2ter l'émission d'un signal indiquant aux processus en attente sur le verrou qu'elle passe la main. La variable de condition sera un argument de la fonction (que l'on appellera ft2quart).


Question (II.4) Modifiez la boucle de ft3 en utilisant l'attente du signal émis par ft2quart.




Exercice III Lecteur-écrivain.


Question (III.1) Écrire une fonction ecr de type
float array -> Mutex.t -> Condition.t -> unit,
qui écrit 2i dans chaque case i du tableau. L'écriture de chacune des cases est soumise àl'obtention d'un verrou. La fonction ecr émet un signal et suspend son exécution aprés un nombre aléatoire d'écritures.


Question (III.2) Écrire une fonction lec de type
float ref -> float array -> Mutex.t -> Condition.t -> unit
qui calcule la somme des éléments du tableau de la façon suivante : àla réception du signal, la fonction accumule toutes les données non nulles du tableau puis se rendort jusqu'au prochain signal.


Question (III.3) Exécutez.




Exercice IV Files d'attente (on utilisera les fonctions du module Queue).


Question (IV.1) Écrire une fonction creer_clients qui prend en arguments une file d'attente, un verrou et une variable de condition. Elle boucle un nombre bornéde fois sur la séquence : créer un nouveau numéro de client, le mettre en file d'attente, émettre un signal, se reposer. La file d'attente est protégée par un verrou.


Question (IV.2) Écrire une fonction guichet qui boucle infiniment sur la séquence : attendre qu'un client soit en attente, dès que c'est le cas, prendre le client, attendre un certain temps. L'attente de la file non vide utilise le signal émit par la fonction creer_clients. La file est protégée par le même verrou que dans creer_clients.


Question (IV.3) Écrire le programme principal qui crée trois processus << guichet >>, un processus de création de clients et attend la fin de ce dernier. Lorsque le processus de création de clients est terminé, il faut mettre fin àtous les processus << guichet >>.




This document was translated from LATEX by HEVEA.