Deux processus, une seule donnée
Une course critique est une erreur qui naît quand deux processus modifient la même donnée. Le résultat dépend alors de l’ordre de leurs gestes. Un interblocage est une attente qui ne finira jamais.
Deux caissiers qui mettent à jour le même stock en sont un exemple.
À la fin de cette leçon
Remarque
Je peux expliquer ce qu’est une course critique et ce qu’est un interblocage.
Mots-clés
| Mot | Ce que ça veut dire |
|---|---|
| Section critique | le morceau de code qui touche une donnée partagée |
| Course critique | un résultat qui dépend de l’ordre des processus |
| Verrou | un jeton qu’un seul processus peut tenir à la fois |
| Exclusion mutuelle | un seul processus à la fois dans la section critique |
| Interblocage | des processus qui s’attendent en cercle pour toujours |
| Graphe d’attente | un schéma où une flèche dit qui attend qui |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Une course critique vient d’un entrelacement malheureux
Ajouter 1 à une variable partagée demande trois gestes : lire, calculer, écrire. Le système peut interrompre un processus entre deux gestes.
Si deux processus lisent la même valeur avant que l’un ne l’écrive, une des deux additions est perdue. Le résultat change d’une exécution à l’autre.
Exemple travaillé : deux ajouts sur un stock
| Geste | Processus A | Processus B | Valeur en mémoire |
|---|---|---|---|
| 1 | lit 10 | 10 | |
| 2 | lit 10 | 10 | |
| 3 | calcule 11 | 10 | |
| 4 | calcule 11 | 10 | |
| 5 | écrit 11 | 11 | |
| 6 | écrit 11 | 11 |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Un verrou protège la section critique
Un verrou ne peut être tenu que par un seul processus. Avant la section critique, le processus prend le verrou. À la fin, il le rend.
Un processus qui trouve le verrou pris attend ou renonce. C’est l’exclusion mutuelle. Les trois gestes de l’exemple ne se mélangent plus.
Prendre un verrou et agir
flock -n /tmp/verrou-demo echo verrou-prisAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Redemander le verrou pendant qu’on le tient
flock -n /tmp/verrou-demo -c 'flock -n /tmp/verrou-demo true; echo code=$?'Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Le second verrou est refusé
Le premier Run affiche verrou-pris : flock a pris le verrou sur le fichier, a lancé echo, puis l’a rendu. L’option -n veut dire : ne pas attendre.
Le second affiche code=1. La commande extérieure tient le verrou. La commande intérieure le redemande, et se voit refuser : son code de retour est 1.
Un interblocage est un cercle d’attentes
Le processus A tient le verrou 1 et attend le verrou 2. Le processus B tient le verrou 2 et attend le verrou 1. Aucun ne peut avancer : c’est un interblocage.
Le graphe d’attente le montre : une flèche de A vers B veut dire que A attend B. Un cercle de flèches est un interblocage.
Erreur fréquente
Attention
Beaucoup de gens pensent qu’ajouter des verrous règle tout. Un verrou supprime la course, mais deux verrous pris dans un ordre différent créent un interblocage. Prenez toujours les verrous dans le même ordre : le cercle devient impossible.