Plus facile à lire avec un fond crème, une teinte, plus de contraste ou un texte plus grand ? Choisissez vos couleurs et votre texte, une fois pour toutes les pages.

Leçon gratuite

Concurrence : course critique et interblocage

Après cette leçon: Je peux expliquer ce qu’est une course critique et ce qu’est un interblocage.

Leçon de 55 min2 commandesLab Linux du quotidien : la trentaine de commandes que les ingénieurs tapent de tête

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

MotCe que ça veut dire
Section critiquele morceau de code qui touche une donnée partagée
Course critiqueun résultat qui dépend de l’ordre des processus
Verrouun jeton qu’un seul processus peut tenir à la fois
Exclusion mutuelleun seul processus à la fois dans la section critique
Interblocagedes processus qui s’attendent en cercle pour toujours
Graphe d’attenteun 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

GesteProcessus AProcessus BValeur en mémoire
1lit 1010
2lit 1010
3calcule 1110
4calcule 1110
5écrit 1111
6écrit 1111

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

Commande
flock -n /tmp/verrou-demo echo verrou-pris

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.

Redemander le verrou pendant qu’on le tient

Commande
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.

À propos de ce labo et de sa source: Lab Linux du quotidien : la trentaine de commandes que les ingénieurs tapent de tête

Vous enseignez à une classe ? Proposez ce module à vos étudiants avec un guide de l'enseignant, des devoirs corrigés et un laboratoire pour chaque étudiant.