[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.