Vous êtes sur la page 1sur 32

Les moniteurs

Extrait du cours CNAM-ACCOV Samia Bouzefrane Matre de Confrences CEDRIC CNAM samia.bouzefrane@cnam.fr http://cedric.cnam.fr/~bouzefra

NFP137 C14

Bilan du contrle de concurrence par smaphores


Le smaphore est un mcanisme qui permet le blocage et le rveil explicites de processus Le smaphore permet dassocier un nombre dautorisations daccs disponibles un objet partag Le schma des smaphores privs permet dexprimer une condition daccs propre un processus Tout paradigme de la concurrence peut tre trait par lemploi de smaphores

NFP137 C14

Bilan du contrle de concurrence par smaphores


Les contraintes de la programmation par smaphores
-respect des spcifications de programmation=> pas daccs aux objets partags incontrl ( hors protocole) attention :exceptions, erreurs, trappes -respect des spcifications de comportement : pas de boucle infinie, ni de blocage ou panne pendant lutilisation des objets partags -ventuellement spcifier les rgles dattente : priorit, anciennet, quit Le smaphore est un mcanisme simple et puissant, mais dangereux dans un emploi non contrl
NFP137 C14 3

Bilan du contrle de concurrence par smaphores


La modularit ncessaire
Encapsuler objets partags et mcanismes de contrle Mcanismes de contrle associs exclusivement aux mthodes daccs Les mthodes daccs accessibles uniquement par linterface du module, limplantation est cache Remarque : difficult valuer le comportement des processus vis--vis de proprits globales : interblocage, famine

NFP137 C14

Bilan du contrle de concurrence par smaphores


Conclusion
Les smaphores sont utiliss comme un mcanisme de bas niveau pour implanter des structures de contrle modulaires Les moniteurs spcifis par Hoare et Brinch Hansen reposent sur les principes suivants : -Exclusion mutuelle implicite entre les mthodes daccs =>file dattente au module -Conditions daccs reposant sur des tests de variables dtat =>file dattente par condition daccs
NFP137 C14 5

Les moniteurs

NFP137 C14

Les moniteurs
Les

moniteurs proposent une solution de "haut-niveau" pour la protection de donnes partages (Hoare 1974) Ils simplifient la mise en place de sections critiques Ils sont dfinis par des donnes internes (appeles aussi variables d'tat) des primitives d'accs aux moniteurs (points d'entre) des primitives internes (uniquement accessibles depuis l'intrieur du moniteur) une ou plusieurs files d'attentes

NFP137 C14

Structure dun moniteur

Type m = moniteur Dbut Dclaration des variables locales (ressources partages); Dclaration et corps des procdures du moniteur (points dentre); Initialisation des variables locales; Fin

NFP137 C14

Les moniteurs: smantique/1

Seul

un processus (ou tche ou thread) peut tre actif un moment donn l'intrieur du moniteur La demande d'entre dans un moniteur (ou d'excution d'une primitive du moniteur) sera bloquante tant qu'il y aura un processus actif l'intrieur du moniteur =>L'accs un moniteur construit donc implicitement une exclusion mutuelle
NFP137 C14 9

Les moniteurs: smantique/2


Lorsqu'un

processus actif au sein d'un moniteur ne peut progresser dans son travail (une certaine condition est fausse), il libre l'accs au moniteur avant de se bloquer. Lorsque des variables internes du moniteur ont chang, le moniteur doit pouvoir rveiller un processus bloqu.

NFP137 C14

10

Les moniteurs: smantique/3


Pour cela, il existe deux types de primitives : wait : qui libre l'accs au moniteur, puis bloque le processus appelant sur une condition signal : qui rveille sur une condition un des processus en attente l'intrieur du moniteur (un processus qui a excut prcdemment un wait sur la mme condition)

NFP137 C14

11

Les variables condition/1


Une variable condition est une variable - qui est dfinie laide du type condition; - qui a un identificateur mais, - qui n'a pas de valeur (contrairement un smaphore). Une condition : - ne doit pas tre initialise - ne peut tre manipule que par les primitives Wait et Signal. - est reprsente par une file d'attente de processus bloqus sur la mme cause; - est donc assimile sa file d'attente.

NFP137 C14

12

Les variables condition/2

La primitive Wait bloque systmatiquement le processus qui l'excute La primitive Signal rveille un processus de la file d'attente de la condition spcifie, si cette file d'attente n'est pas vide; sinon elle ne fait absolument rien.

NFP137 C14

13

Les variables condition/3


Syntaxe : cond.Wait; cond.Signal; /* cond est la variable de type condition dclare comme variable locale */ Autre syntaxe : Wait(cond) ; Signal(cond); Un processus rveill par Signal continue son excution l'instruction qui suit le Wait qui l'a bloqu.
NFP137 C14 14

Les moniteurs dans les langages de programmation

Selon les langages (ou les normes), ces mcanismes peuvent tre implments de diffrentes faons mthodes wait / notify / notifyAll en Java et mthodes synchronized primitives pthread_cond_wait / pthread_cond_signal en Posix et variables conditionnelles objets protgs en Ada La smantique des rveils peut varier : Qui rveille t-on ? le plus ancien, le plus prioritaire, un choisi au hasard, Quand rveille t-on ? ds la sortie du moniteur, au prochain ordonnancement,

NFP137 C14

15

Un RDV entre N processus laide des moniteurs


Type Rendez_vous = moniteur {variables locales } Var Nb_arrivs : entier ; Tous_Arrivs : condition ; {procdure accessible aux programmes utilisateurs } Procedure Entry Arriver ; Dbut Nb_arrivs = Nb_arrivs + 1 ; Si Nb_arrivs < N Alors Tous_Arrivs.Wait ; Tous_Arrivs.Signal ; Fin Dbut {Initialisations } Nb_arrivs = 0; Fin.

NFP137 C14

16

Un RDV entre N processus laide des moniteurs


Les programmes des processus s'crivent alors :
Processus Pi ............... Rendez_vous.Arriver ; {Point de rendez-vous qui sera bloquant si au moins un processus n'est pas arriv au point de rendez-vous } ...............

NFP137 C14

17

Producteur-Consommateur laide des moniteurs


Type ProducteurConsommateur = moniteur {variables locales } Var Compte : entier ; Plein, Vide : condition ; {procdures accessibles aux programmes utilisateurs } Procedure Entry Dposer(message M) ; Dbut si Compte=N alors Plein.Wait ; dpt(M); Compte=Compte+1; si Compte==1 alors Vide.Signal; Fin

NFP137 C14

18

Producteur-Consommateur laide des moniteurs


Procedure Entry Retirer(message M) ; Dbut si Compte==0 alors Vide.Wait ; retrait(M); Compte=Compte-1; si Compte==N-1 alors Plein.Signal; Fin Dbut {Initialisations }Compte= 0; Fin.

NFP137 C14

19

Producteur-Consommateur laide des moniteurs


Processus Producteur message M; Dbut tant que vrai faire Produire(M); ProducteurConsommateur.dposer(M) Fin Processus Consommateur message M; Dbut tant que vrai faire ProducteurConsommateur.retirer(M); Consommer(M); Fin Remarques -Adapt au cas de plusieurs producteurs, plusieurs consommateurs
NFP137 C14 20

Le repas des philosophes laide des moniteurs


Type RepasPhilosophes = moniteur type Statut =(pense, demande, mange); Var Statut tat[5]; Condition AMoi[5]; {procdures accessibles aux programmes utilisateurs } Procedure Entry Prendre(entier i); Dbut tat[i]=demande; si (tat[(i+1)%5] m ange et tat[(i-1)%5] m ange) alors tat[i]=mange; sinon AMoi[i].Wait; finsi; Fin

NFP137 C14

21

Le repas des philosophes laide des moniteurs


Procedure Entry Rendre(entier i); Dbut tat [i]=pense; {rveil ventuel dun voisin} si (tat[(i+1)%5]=demande et tat[(i+2)%5] m ange) alors tat[(i +1)%5]=mange; AMoi[(i+1)%5].Signal; sinon si (tat[(i-1)%5]=demande et tat[(i-2)%5] m ange) alors tat[(i-1)%5]=mange; AMoi[(i-1)%5].Signal ;finsi; finsi; Fin Dbut {Initialisations } Pour i de 0 4 faire tat[i]=pense; fait; Fin

NFP137 C14

22

Le repas des philosophes laide des moniteurs


Processus Philosophe i entier i= numero du processus ; Dbut tant que vrai faire penser; RepasPhilosophes.prendre(i); manger; RepasPhilosophes.rendre(i); fait; Fin

Remarque Solution sans interblocage, mais risque de famine

NFP137 C14

23

Rfrences

Samia Bouzefrane, Les Systmes dexploitation: Cours et Exercices corriges Unix, Linux et Windows XP avec C et JAVA (566 pages), Dunod Editeur, Octobre 2003, ISBN : 2 10 007 189 0. Jean-Franois Peyre, supports de cours sur linformatique industrielle-systmes temps rel, CNAM(Paris).

NFP137 C14

24

Exercice Moniteurs
Comptition daccs pour deux classes de processus

Les rgles de circulation sur la voie unique sont les suivantes : 1. Le tronon ne doit jamais tre emprunt simultanment par deux trains allant en sens inverse ; 2. le tronon peut tre emprunt par un ou plusieurs trains allant tous dans le mme sens ; 3. il ny a pas de sens de parcours prioritaire.
NFP137 C14 25

Pour tudier la rentabilit de cette ligne, on dsire effectuer une simulation du trafic, pour cela, on introduit deux classes de processus : les trains PONTOISE-ORLEANS et les trains ORLEANS-PONTOISE, qui se dcrivent comme suit :

NFP137 C14

26

Tche PONTOISE-ORLEANS : Dbut Parcours (PONTOISE, VERSAILLES) ; Entre_nord ; Parcours (VERSAILLES,CHEVREUSE) ; Sortie_sud ; Parcours (CHEVREUSE, ORLEANS) ; Fin Tche ORLEANS-PONTOISE: Dbut Parcours (ORLEANS, CHEVREUSE) ; Entre_sud ; Parcours (CHEVREUSE, VERSAILLES) ; Sortie_nord; Parcours (VERSAILLES, PONTOISE) ; NFP137 C14 Fin

27

Question : On considre le cas o toute coalition est autorise. crire un moniteur contenant les 4 points dentre Entre_nord , Sortie_sud, Entre_sud , Sortie_nord On pourra utiliser les conditions Accs_Nord, Accs_Sud et des variables dtat : NS, SN nombres de trains sur le tronon dans chaque sens, AttNS, AttSN nombre de trains en attente dans chaque sens. Dautres solutions sont possibles !

NFP137 C14

28

Type Troncon = moniteur {Variables locales} Var NS, SN, AttNS, AttSN : entier ; Accs_Nord , Accs_Sud : condition ; {points dentre} Procdure Entry Entre_Nord ; Dbut Si SN>0 alors AttNS=AttNS+1 ; Accs_Nord.Wait ; finsi ; {blocage si trains dans lautre sens} NS=NS+1 ; Si AttNS>0 alors AttNS=AttNS-1 ; Accs_Nord.Signal ; finsi ; {si des trainsNS sont en attente, alors rveil du prochain train en attente ; le premier train en attente est rveill par le dernier train SN} Fin

NFP137 C14

29

Procdure Entry Sortie_Sud ; Dbut NS=NS-1 ; Si NS==0 alors {dernier train NS} Si AttSN>0 alors AttSN = AttSN -1 ; Accs_Sud.Signal ; {si des trains SN sont en attente, alors rveil du premier train } finsi ; finsi ; Fin

NFP137 C14

30

Procdure Entry Entre_Sud ; Dbut Si NS>0 alors AttSN=AttSN+1 ; Accs_Sud.Wait ; finsi ; {blocage si trains dans lautre sens} SN=SN+1 ; Si AttSN>0 alors AttSN=AttSN-1 ; Accs_Sud.Signal ; finsi ; {si des trains SN sont en attente, alors rveil du prochain train en attente ; le premier train en attente est rveill par le dernier train NS} Fin

NFP137 C14

31

Procdure Entry Sortie_Nord; Dbut SN=SN-1; Si SN==0 alors {dernier train SN} Si AttNS>0 alors AttNS = AttNS -1; Accs_Nord.Signal; {si des trains NS sont en attente, alors rveil du premier train } nsi; nsi; Fin Dbut {initialisations des variables locales} NS=0; SN=0; AttNS=0; AttSN=0; Fin

NFP137 C14

32