verrou

Un verrou (ou lock) est un outil système permettant de protéger une section critique (exclusion mutuelle des processus).

Il permet de s'assurer qu'un seul processus accède à une ressource à un instant donné (fichier, base de données, ...).

Le cas le plus simple, le simple verrou (verrouillage pessimiste)

Le verrou est un outil d'exclusion mutuelle très utilisé dans le cas des bases de données. On peut voir un verrou comme un type abstrait avec deux opérations mises en œuvre dans le noyau : verrouiller et déverrouiller.

class Verrou {

public Verrou() { ...} ;

public void verrouiller () { ...}  ;

public void deverrouiller () { ...} ;

protected  ....

} ;

Exemple 3.13 : Le type abstrait verrou

Un verrou peut être dans deux états: ouvert et fermé. Il est toujours possible de déverrouiller un verrou, même si celui-ci est ouvert. L'appel du service de verrouillage sur un verrou fermé entraîne le blocage du processus. L'état d'un verrou est donc caractérisé par le nombre de processus qui y sont bloqués. On peut représenter un verrou par l'automate de la figure 3.9 ou par l'automate d'état fini étendu de la figure 3.10.

La protection d'une section critique se fait alors de la façon suivante :

verrou unVerrou = new Verrou ();
....
unVerrou.verrouiller () ;
Section_critique ;
unVerrou.deverrouiller () ;

Exemple 3.14 : Utilisation du verrou

Etats d'un verrou

 

Figure 3.9 : Etats d'un verrou : Automate d'états fini

Etats d'un verrou

Figure 3.10 : Etats d'un verrou : Automate d'états fini étendu

La mise en œuvre d'une classe de gestion de verrous dans le noyau nécessite qu'à chaque verrou on associe une liste de processus bloqués :

protected enum etatVerrou {ouvert, ferme} ; // En Java 5.0 uniquement cf énumération

protected etatVerrou lEtat = ouvert ;
protected Liste <processus> laListe ;

Exemple 3.15 : Représentation interne d'un verrou

publiv void verrouiller () {

if (lEtat == ouvert)

lEtat = ferme ;

else

// Mettre le processus appelant à l'état bloqué.
// Il est chaîné dans la liste associée au verrou.
// L'allocateur prend la main pour rendre actif
// un processus à l'état prêt

}

public void deverrouiller () {

if (!liste.estVide())

// Le premier processus de la liste le_verrou.liste
// est retiré. Ce processus de l'état bloqué passe
// à l'état actif/prêt.
// L'allocateur prend la main pour rendre actif un
// processus. L'allocateur peut décider de laisser
// actif le processus appelant, ou de donner la main
// à un autre processus.

else

lEtat = ouvert ;

}

Exemple 3.16 : Représentation interne d'un verrou

Pour mettre en oeuvre les services sur verrou dans le noyau, il est nécessaire de disposer d'un mécanisme d'exclusion mutuelle de plus bas niveau (masquage des interruptions et/ou instructions spéciales). Le noyau n'assure qu'un seul service à la fois.

Le danger des verrous, l'interblocage

Bases de données. Systèmes transactionnels

Le verrou détruit le parallélisme et constitue un goulot d'étranglement. Dans le cas des systèmes transactionnels, on utilise des techniques plus élaborées.

» Glossaire : Les concepts de concurrence et de parallélisme