Vous êtes sur la page 1sur 2

Les moniteurs

Les moniteurs proposent une solution de "haut-niveau" pour la protection de données partagées
.Ils simplifient la mise en place des sections critiques.

Ils sont définis par :


– des données internes (appelées aussi variables d'état)
– des primitives d'accès aux moniteurs (points d'entrée)
– des primitives internes (uniquement accessibles de l'intérieur du moniteur).
– une ou plusieurs files d'attentes

Structure d’un moniteur :


Type m = moniteur
Début
Déclaration des variables locales (ressources partagées);
Déclaration et corps des procédures du moniteur(points d’entrée);
Initialisation des variables locales;
Fin

Principe de fonctionnement :
 Seul un processus peut être actif à un moment donné à l'intérieur du moniteur.
 La demande d'entrée dans un moniteur sera bloquée tant qu'il y aura un processus
actif à l'intérieur du moniteur.

L'accès à un moniteur construit donc implicitement une exclusion mutuelle.

Interprétation
 Lorsqu’un processus actif au sein d'un moniteur ne peut progresser dans son travail, il
libère l'accès au moniteur avant de se bloquer.
 Lorsque des variables internes du moniteur sontchangées, le moniteur doit pouvoir
« réveiller » un processus bloqué.

Pour cela, il existe deux types de primitives :


 wait : qui libère l'accès au moniteur, puis bloque le processus appelant sur une
condition.(La primitive Wait bloque systématiquement le processus quil'exécute).
 signal : qui réveille sur une condition un des processus en attente à l'intérieur du
moniteur (un processus qui a exécuté précédemment un wait sur la même condition).
Ainsi cette primitive  « Signal » réveille un processus de la file d'attente de la
condition spécifiée, si cette file d'attente n'est pas vide;sinon elle ne fait absolument
rien.
Le problème du producteur et du consommateur avec les fils d'attente :

Pour synchroniser les producteurs et les consommateurs, on utilise deux files d'attente :
 une pour les processus en attente d'un elément à consommer.
 une pour les processus en attente d'une place dans le tampon.

public class PCbuffer


{
private Object buffer[ ] ; /* M_emoire partag_ee */
private int N ; /* Capacit_e de la zone */
private int count, in, out; /* nb d'_el_ements, pointeurs */
private Waitqueue notfull, notempty; /* files d'attente */

public PCbuffer(int argSize)


{ N = argSize; /*cr_eation d'un tampon de taille
argSize */

buffer = new Object[N];


count = 0; in = 0; out = 0;
notfull = new Waitqueue(); notempty = new Waitqueue();

public synchronized void append(Object data)


{ if (count == N) notfull.qWait();
buffer[in] = data;
in = (in + 1) % N; count++;
notempty.qSignal();
}

public synchronized Object take()


{ Object data;
if (count == O) notempty.qWait();
data = buffer[out];
out = (out + 1) % N;
count--; notfull.qSignal();
return data;

}
}

Vous aimerez peut-être aussi