Un concept plus général: g Variables condition On appelle variable condition une var qui peut être testée et endort le thread qui la teste si la condition est fausse le réveille quand la condition devient vraie Sont employées dans les moniteurs, mais peuvent aussi être utilisées indépendamment 21
Blocage dans les moniteurs threads attendent dans la file d entrée ou dans une file de condition (ils n exécutent rien) sur x.wait: le thread est placé dans la file de la condition (il n exécute pas) x.signal amène dans le moniteur 1 thread de la file x (si x vide, aucun effet) 22
Un pb concernant le signal Quand un thread P exécute x.signal et libère un thr. Q, il pourrait y avoir 2 thr. qui peuvent s exécuter, P et Q, ce qui est défendu. Deux solutions possibles: P pourrait attendre jusqu` à ce que Q sorte du moniteur, p.ex. dans une file spéciale (dite urgente) (v. Stallings) Q pourrait attendre jusqu à ce que P sorte du moniteur 23
Terminologie Java Les méthodes synchronisées de Java sont essentiellement des moniteurs Un seul thread à la fois peut les exécuter Il y a 2 files pour un objet: File d entrée File d attente (méthode wait) Un thread ne peut avoir que 1 file wait Limitation importante qui complique les choses en Java Wait existe en Java + ou comme décrit pour les moniteurs Signal s appelle notify Notify() libère 1 seul thread NotifyAll les libères tous Mais ils n exécutent pas: ils sont mis dans la file d entrée 24
Java: diagramme simplifié de transition d éd état threads nouveau nouveau start prêt ou en exécution exécutable = runnable stop ou term. de run mort Sleep Wait I/O join suspend b loqué = not runnable notify Fin E/S resume bloqué sur une file associée à un événement 25
Un diagramme plus complet new NEW READY start Notify, E/S terminée, resume, interrupted NOT RUNNABLE yield ou terminaison tranche ou préemption Ordonnanceur choisit fil RUNNING Sleep, wait, I/O, join, suspend RUNNABLE = READY ou RUNNING DEAD complète run method ou exception pas traitée Les méthodes suspend, resume, stop ne sont pas recommandées aujourd hui (deprecated). 26
Retour au problème des philosophes structures de données? 27
Philosophes (ctnd( ctnd) Chaque philos. a son propre state qui peut être (thinking, hungry, eating) philosophe i peut faire state[i] = eating ssi les voisins ne mangent pas Chaque condition a sa propre condition self le philosophe i peut attendre sur self [ i ] si veut manger, mais ne peut pas obtenir les 2 baguettes 28
Chaque philosophe exécute à jamais: repeat pickup eat putdown forever 29
Un philosophe mange private test(int i) { if ( (state[(i + 4) % 5]!= EATING) && (state[i] == HUNGRY) && (state[(i + 1) % 5]!= EATING) ) { state[i] = EATING; self[i].signal; } } Un philosophe mange si ses voisins ne mangent pas et s il a faim. Une fois rassasié, il signale de façon qu un autre pickup soit possible, si pickup s était arrêté sur wait Il peut aussi sortir sans avoir mangé si le test est faux 30
Chercher de prendre les baguettes public entry pickup(int i) { state[i] = HUNGRY; test(i); if (state[i]!= EATING) self[i].wait; } Phil. cherche à manger en testant, s il sort de test qu il n est pas mangeant il attend un autre pickup n est pas possible avant un self[i] signal 31
Déposer les baguettes public entry putdown(int i) { state[i] = THINKING; // tester les deux voisins test((i + 4) % 5); test((i + 1) % 5); } Une fois fini de manger, un philosophe se préoccupe de faire manger ses voisins en les testant 32
Une solution ingénieuse, cependant les baguettes ne sont que implicites 33
P/C: tampon circulaire de dimension k Peut consommer seulement si le nombre N d éléments consommables est au moins 1 (N = in-out) Peut produire seulement si le nombre E d espaces libres est au moins 1 (E = out-in) 34
Variables conditionnelles utilisées Si le tampon est plein, le producteur doit attendre qu il devienne non-plein Var conditionnelle notfull Si le tampon est vide, le consommateur doit attendre qu il devienne non-vide Var conditionnelle notempty 35
Moniteur pour P/C avec tampon fini (syntaxe un peu différente, pas orienté objet) Monitor boundedbuffer: buffer: vecteur[0..k-1] de items; nextin = 0, nextout = 0, count = 0 ; notfull, notempty: condition; Produce(v): if (count==k) notfull.wait; buffer[nextin] = v; nextin = (nextin+1 mod k); count ++; notempty.signal; Variable conditionnelle sur laquelle le producteur attend s il n y a pas d espaces libres Consume(v): if (count==0) notempty.wait; v = buffer[nextout]; nextout = (nextout+1 mod k); count --; notfull.signal; Variable conditionnelle sur laquelle le consommateur attend s il n y a pas d espaces occupés 36
La solution Java est plus compliquée surtout à cause du fait que Java n a pas de variables conditionnelles nommées 37
Relation entre moniteurs et autre mécanismesm Les moniteurs sont implantés utilisant les sémaphores ou les autres mécanismes déjà vus Il est aussi possible d`implanter les sémaphores en utilisant les moniteurs! exercices 38
Le problème de la SC en pratique... Les systèmes réels rendent disponibles plusieurs mécanismes qui peuvent être utilisés pour obtenir la solution la plus efficace dans différentes situations 39
Synchronisation en Solaris 2 (avec UCT multiples) Plusieurs mécanismes utilisés: adaptive mutex protège l accès aux données partagées pour des SC courtes sémaphores et condition variables protègent des SC plus importantes serrures lecteurs-rédacteurs (reader-writers locks) protègent des données qui normalement ne sont que lues les mêmes mécanismes sont disponibles aux usagers et dans le noyau 40
Adaptive mutex en Solaris 2 Utilisés pour des SC courtes: quand un thread veut accéder à des données partagées: Si les données sont couramm. utilisées par un thread exécutant sur un autre UCT, l autre thread fait une attente occupée Sinon, le thread est mis dans une file d attente et sera réveillé quand les données deviennent disponibles 41
Windows NT: aussi plus. mécanismesm exclusion mutuelle sur données partagées: un fils doit demander accès et puis libérer section critiques: semblables mais pour synchroniser entre fils de threads différents sémaphores event objects: semblables à condition variables 42
Concepts importants Sections critiques: pourquoi Difficulté du problème de la synch sur SC Bonnes et mauvaises solutions Accès atomique à la mémoire Solutions logiciel `pures` Solution matériel: test-and-set Solutions par appels du système: Sémaphores, moniteurs, fonctionnement Problèmes typiques: tampon borné, lecteursécrivains, philosophes, crossing-bridge, etc 43