• Aucun résultat trouvé

Licence 2 - I4b Semaine du 26/03 au 31/03/2007

N/A
N/A
Protected

Academic year: 2022

Partager "Licence 2 - I4b Semaine du 26/03 au 31/03/2007"

Copied!
3
0
0

Texte intégral

(1)

Licence 2 - I4b

Semaine du 26/03 au 31/03/2007

TP 3 & 4 • Synchronisation de processus

Rappels des acquis des TP 1 & 2, extensions

Ce que nous avons vu :

Les threads interagissent principalement dans deux situations :

1. lorsqu’elles entrent en concurrence pour l’acc`es `a des ressources (objets communs ou partag´es) ; 2. quand elles coop`erent ou communiquent (via des objets partag´es).

De fac¸on classique, on retrouve deux niveaux de synchronisation correspondants :

– au probl`eme de l’exclusion mutuelle pour l’acc`es `a des donn´ees (objets) ou `a du code (m´ethodes) ; – au probl`eme de la synchronisation sur des ´ev´enements (attente du r´esultat d’un thread pour effectuer ou

continuer un calcul par exemple).

Les deux types de probl`eme sont r´esolus dans la langage Java via les moniteurs (moniteurs de Hoare d´eg´en´er´es).

Dans Java 1.5 les primitives de synchronisation sont ´etendues et on trouve, comme dans de nombreux autres langages, les primitives de bas niveau que sont les verrous.

Pour traiter les probl`emes d’exclusion mutuelle, Java propose la d´efinition de sections critiques exprim´ees `a l’aide desynchronized. Tous les objets Java sont cr´ees avec un verrou (permettant de r´ealiser l’exclusion mutuelle). Ainsi, pour assurer qu’un seul thread acc`ede `a un objetod’une classe quelconque, on englobe les actions portant sur l’objet dans une r´egion critique en utilisant la syntaxe suivante :

synchronized (o) {

< section critique >

}

Une m´ethode peut aussi ˆetre qualifi´ee desynchronized. Il y a, dans ce cas, une exclusion d’acc`es `a l’objet sur lequel on applique la m´ethode. Attention l’exclusion ne s’etend pas `a la m´ethode elle-mˆeme, ce qui signifie qu’elle peut ˆetre ex´ecut´ee concurremment sur des objets diff´erents.

synchronized TYPE methode(...) { ... }

Ceci est ´equivalent `a la forme pr´ec´edente : TYPE methode(...) {

synchronized (this) { ... } }

Chaque classe poss`ede aussi un verrou sp´ecifique qui s’applique aux m´ethodes de classe (m´ethodes d´eclar´ees statiques) :

class C {

static synchronized TYPE methode1() { ... } static synchronized TYPE methode2() { ... } }

L’utilisation du mot cl´esynchronizedassure dans ce cadre l’exclusion mutuelle pour toutes les m´ethodes statiques synchronis´ees de la classe C. Ce verrou ne concerne pas l’ex´ecution des m´ethodes d’objets (exmples pr´ecdents).

Les verrous sont qualifi´es der´ecursifsour´eentrants. En effet, si un thread poss`ede un verrou, une deuxi`eme demande provenant de ce mˆeme thread peut ˆetre satisfaite sans causer d’auto-interblocage. Ainsi, le code suivant s’ex´ecute sans probl`eme.

synchronized(o) { ...

synchronized(o){

... } ... }

Eric Leclercq —http://ludique.u- bourgogne.fr/˜leclercq— D´epartement IEM —http://ufrsciencestech.u- bourgogne.fr 1

(2)

Actif (CPU) Prêt

Exécutable

Crée Terminé

Bloqué Bloqué

(synchronisation, sleep) start()

notify() interrupt

wait() join() sleep()

yield()

(E/S) read,accept fin du code

FIG. 1 – Cycle de vie d’un thread

Lors de l’utilisation de plusieurs verrous, lerisque d’interblocageexiste, plus pr´ecisement ce risque est pr´esent d`es qu’un thread peut utiliser plusieurs verrous. L’extrait de code suivant, ex´ecut´e dans 2 threads distincts ne garantit pas l’absence d’interblocage.

synchronized (o1) { synchronized (o2) { ... } } ..

synchronized (o2) { synchronized (o1) { ... } }

Comme vu en cours, il existe plusieurs strat´egies pour ´eviter l’interblocage. Une solution simple pour garantir l’absence d’interblocage dus `a des verrous consiste `a d´efinir une relation d’ordre sur l’ensemble des verrous et `a assurer que les threads acqui`erent les verrous par ordre croissant d’importance. Ceci revient `a ordonner les objets ou les classes. Dans l’exemple pr´ec´edent, si la relation d’ordre d´efinio1≺o2, la deuxi`eme ligne est erron´ee. Il est alors assez simple de v´erifier qu’un code proprement ´ecrit respecte la contrainte d’ordre.

Pour synchroniser des threads sur des conditions logiques, on dispose du couple d’op´erations permettant d’assurer le blocage et le d´eblocage des threads (wait(), notify()). Ces op´erations sont applicables `a tout objet, pour lequel le thread a obtenu au pr´ealable l’acc`es exclusif. L’objet est alors utilis´e comme une sorte de variable condition.

– o.wait() lib`ere l’acc`es exclusif `a l’objet et bloque le thread appelant en attente d’un r´eveil via une op´erationo.notify();

– o.notify()r´eveille une thread bloqu´e sur l’objet (si aucun thread n’est bloqu´e, l’appel ne fait rien) ; – o.notifyAll()r´eveille tous les thread bloqu´es sur l’objet.

Lorsqu’une activit´e est r´eveill´ee, elle est mise en attente de l’obtention de l’acc`es exclusif `a l’objet.

L’objectif des exercices de ce TP est de r´ealiser un ensemble de primitives de communication et de synchronisation qui seront r´eutilis´ees dans le projet.

Exercice 1.

1. Reprendre l’exercice sur la banque et proposer une seconde (l’autre) strat´egie de verouillage utilisant les moniteurs (synchronized) ;

2. Implanter en Java le m´ecanisme de s´emaphores vu en cours (op´erationsPetV) au moyen d’une classe Semaphoreet des m´ethodes appropri´ees. Vous aurez le choix d’utiliser une attente active (appel´ee aussi spin-lockdans certains langages de programmation) ou une attente avec pr´eemption du thread (´ecrire les deux versions) ;

3. Utiliser vos s´emaphores pour assurer l’exclusion mutuelle pour l’exercice de la banque, tester les deux m´ethodes : l’attente active, et l’attente passive. Suivez l’evolution de l’usage du CPU, conclure.

4. Implanter une m´ecanisme de verrous. Valider votre classe 5. D´efinir un package proposant verrous et s´emaphores.

A la fin de cet exercice vous devez avoir 3 programmes utilisant diff´erentes strat´egies de verouillage` r´ealisant en toute s´ecurit´e les retraits sur le compte bancaire.

Exercice 2. Communication entre threads

Les processus concurrents qui s’ex´ecutent dans le syst`eme d’exploitation peuvent ˆetre ind´ependants ou bien coop´erants. Un processus est dit ind´ependant s’il ne peut pas influencer (ou ˆetre influenc´e par) d’autres pro- cessus. Un processus est dit coop´erant s’il peut influcencer (ou ˆetre influenc´e par) d’autres processus. Les

Eric Leclercq —http://ludique.u- bourgogne.fr/˜leclercq— D´epartement IEM —http://ufrsciencestech.u- bourgogne.fr 2

(3)

processus qui partagent des donn´ees ou les processus qui communiquent sont, par cons´equent, des proces- sus coop´erants. Dans les syst`emes d’exploitation, la communication interprocessus est g´en´eralement nomm´ee IPC (interprocess communication). Dans cet exercice on se propose d’´etudier deux modes de communication / synchronisation.

R´ealiser les programmes conrespondants aux situations de communication suivantes :

1. Producteurs/Consommateurs :dans ce programme producteurs et consommateurs partageant un buffer born´e (`a une seule place pour commencer), il s’agit pour les producteurs et les consommateurs de se synchroniser sur le buffer. Un producteur doit attendre que le buffer soit vide pour mettre la valeur produite dans le buffer. Le producteur attend que le buffer soit plein pour consommer la valeur.

2. Barri`ere de synchronisation : dans ce programme, on ex´ecute les activit´es1 pas `a pas en utilisant des barri`eres de synchronisation. Pour passer d’un pas `a un autre une activit´e doit attendre que toutes les autres activit´es aient termin´e le pas pr´ec´edent. Ainsi, on peut ainsi simuler dans un syst`eme asynchrone (par exemple cluster de calcul) des calculs qui n´ecessitent des partient synchrones (pour l’assemblage de r´esultats par exemple). Une barri`ere est un compteur qui peut ˆetre incr´ement´e et d´ecr´ement´e (mais en restant toujours entre une valeur minimalevalMinet une valeur maximalevalMax). Si l’op´eration d’incr´ementation ou de d´ecr´ementation ne peut pas se faire sans violer cette contrainte, alors l’op´eration est rendue bloquante jusqu’a ce que la condition soit valid´ee ;

3. Utiliser le paradigme producteurs consommateurs pour r´ealiser une file de messages utilis´ee par plu- sieurs processus (lorsque la file est vide ou pleine les op´erations d’acc`es sont bloquantes, c’est-`a-dire mises en attente).

4. Utiliser les barri`eres dans l’exercice de simulation de distributeurs de billets pour attendre la fin des threads avant d’afficher le message du solde restant.

Exercice 3.

Le probl`eme ditSleeping-Barber Problemest un exemple classique de la synchronisation des processus. On consid`ere un salon de coiffure qui comporte une salle d’attente avecnchaises et une autre salle avec un fauteuil de coiffure et un coiffeur. Si il n’y a pas de client, le coiffeur dort. Si un client entre et que toutes les chaises sont occup´ees, le client s’en va. Si le coiffeur est occup´e et qu’au moins une chaise est libre le client s’assied et attend. Si le coiffeur est endormi l’arriv´ee d’un client le reveille.

1. On souhaite programmer l’activit´e du coiffeur au moyen de threads. Identifier les ressources et les threads necessaires.

2. Y-a-t’il des probl`emes de concurrence ? Si oui expliquez de fac¸on pr´ecise la m´ethode que vous choisisez pour les ´eviter ?

3. ´Ecrire le programme et l’ex´ecuter.

4. On consid`ere non plus 1 coiffeur mais 4 coiffeurs, quels sont les ´el´ements `a changer dans votre solution ?

1ensemble d’instructions

Eric Leclercq —http://ludique.u- bourgogne.fr/˜leclercq— D´epartement IEM —http://ufrsciencestech.u- bourgogne.fr 3

Références

Documents relatifs

[r]

Montrer qu’il existe une solution d´ efinie sur R +∗ et la calculer..

Le probl` eme de synchronisation d’une ligne de fusiliers (firing squad problem) est un probl` eme qui consiste ` a trouver la r` egle locale d’un automate cellulaire

D` es que le transfert des donn´ ees est termin´ e, le contrˆ oleur de p´ eriph´ erique informe l’unit´ e centrale qu’il a termin´ e son op´ eration.. Il effectue

– au probl` eme de l’exclusion mutuelle pour l’acc` es ` a des donn´ ees (objets) ou ` a du code (m´ ethodes) ; – au probl` eme de la synchronisation sur des ´ ev´

Avec plusieurs threads, l’application peut poursuivre l’ex´ecution des autres threads pendant que le thread qui attend le r´esultat d’un processus lent est bloqu´e ;1.

– notify() permet `a un thread de r´eveiller un des threads qui ´etait en attente dans le wait-set de l’objet r´ecepteur de l’appel de la m´ethode.. Attention, le choix du

Attention, le choix du thread r´eveill´e par notify() n’est pas sp´ecifi´e par le langage, ainsi il se peut qu’on observe des ph´enom`enes de famine quand plusieurs threads sont