Station MinuitPortail personnel de révision

IFT-2001 — Systèmes d’exploitationAutomne 2026

Semaine 5 — Concurrence

5. Blocage, réveil perdu et producteur-consommateur

LECTURE 08 / 203 repèresSynthèse avec omissions acceptées

5. Blocage, réveil perdu et producteur-consommateur

5.1 Tampon borné

Le patron producteur-consommateur comprend :

  • une file de capacité N;
  • un compteur count;
  • un producteur qui ajoute des éléments;
  • un consommateur qui les retire.

Le producteur doit attendre lorsque la file est pleine; le consommateur doit attendre lorsqu’elle est vide. Ils doivent aussi s’exclure pendant la modification de la structure.

5.2 Pourquoi sleep/wakeup ne suffit pas

La solution naïve endort le consommateur lorsque count == 0 et le réveille après une production. Une course subsiste :

  1. le consommateur lit count == 0;
  2. il est interrompu avant sleep;
  3. le producteur ajoute un élément et appelle wakeup;
  4. le réveil est perdu, car le consommateur ne dort pas encore;
  5. le consommateur reprend et s’endort malgré la présence d’un élément.

Le problème est encore une séquence « vérifier puis agir » non atomique. Une primitive correcte doit réunir le test, la modification d’état et le blocage, ou mémoriser la permission à consommer.

Réveil perdu et permission de sémaphore : deux tracesDeux colonnes comparent des traces possibles, pas des durées. À gauche : C constate count=0, est interrompu avant sleep; P insère un élément, count=1 et wakeup ne trouve aucun dormeur; C reprend et dort malgré l’élément présent. À droite : full est initialisé à 0; P insère et fait post avant le wait de C; la permission disponible vaut 1 puis C la consomme par wait, retire sous protection distincte et full finit à 0. Un producteur, un consommateur, une production, appels réussis, aucun autre réveil ni annulation. Les traits ordonnent les étapes de chaque trace; aucun ordre général entre threads n’est promis. Le sémaphore mémorise une permission, sans remplacer le mutex du tampon. La condition n’est pas dessinée comme un compteur : elle exige un prédicat sous mutex, une attente atomique et un retest.Réveil perdu : événement non mémoriséSémaphore : permission mémorisée1 C lit count=0 puis est interrompu2 P insère : count=13 P réveille : aucun dormeur4 C reprend et dortÉlément présent, C bloqué1 full=0 ; C n’attend pas encore2 P insère puis post(full)3 full=1 : permission conservée4 C : wait(full), puis retraitfull=0 ; pas de réveil perdu
Réveil perdu et permission de sémaphore : deux traces

Deux colonnes comparent des traces possibles, pas des durées. À gauche : C constate count=0, est interrompu avant sleep; P insère un élément, count=1 et wakeup ne trouve aucun dormeur; C reprend et dort malgré l’élément présent. À droite : full est initialisé à 0; P insère et fait post avant le wait de C; la permission disponible vaut 1 puis C la consomme par wait, retire sous protection distincte et full finit à 0. Un producteur, un consommateur, une production, appels réussis, aucun autre réveil ni annulation. Les traits ordonnent les étapes de chaque trace; aucun ordre général entre threads n’est promis. Le sémaphore mémorise une permission, sans remplacer le mutex du tampon. La condition n’est pas dessinée comme un compteur : elle exige un prédicat sous mutex, une attente atomique et un retest.

Source : 05 - Concurrence/SOMMAIRE_MAITRE_SEMAINE_05.md · §5.2, §6.1–6.3 et §8; schéma original du portail, relu le 15 octobre 2026.

Retour au sommaire de l’unitéHaut de page
Récupérer manuellement les données locales

Copier séparément les données ci-dessous dans des fichiers texte avant de fermer la page ou de modifier le stockage. Une valeur illisible ou incompatible reste en place. Aucun effacement ni rétablissement écrasant n’est effectué automatiquement. L’export/import JSON est disponible sur la page Progression du cours. Cette récupération séparée reste utile pour une valeur brute ou un conflit.

Clé de ce cours : . Format v1 porté par cette clé; dates UTC et identifiants durables.

Si l’accès est refusé, la valeur persistée peut rester inaccessible. Réautoriser le stockage dans le navigateur puis rouvrir ce cours permet de la relire. Une réinitialisation exige une décision explicite après récupération; aucune commande de suppression n’est proposée ici. Les données restent sur cette origine et cet appareil, sans transfert automatique.