2. Définir le problème et les ressources
2.1. Interblocage et blocage ordinaire
Un interblocage, ou deadlock, concerne un ensemble de processus dont chaque membre attend un événement qui ne pourrait être produit que par un autre membre de cet ensemble. Dans les exemples de la séance, l'événement attendu est la libération d'une ressource. Le processus qui devrait la libérer attend lui-même une autre ressource : les dépendances se referment et empêchent les opérations de libération d'être atteintes.
Un processus simplement bloqué peut attendre une entrée-sortie dont la fin reste possible. Sa mise en attente n'établit pas à elle seule un interblocage. Pour expliquer un deadlock, il faut montrer pourquoi les événements attendus ne peuvent plus être produits par les processus concernés. La longueur de l'attente ou le fait qu'un processus ne soit pas actuellement sur le CPU ne suffisent pas à établir ce diagnostic.
Le problème peut impliquer deux processus, comme dans l'exemple initial, ou un ensemble beaucoup plus grand. Il peut également toucher une partie des processus du système : il faut identifier les participants et les dépendances plutôt que supposer que tout le système appartient au même cycle.
2.2. Exemple initial : scanner et graveur
Deux processus doivent utiliser les mêmes périphériques dans des ordres différents : A demande le scanner avant le graveur de CD; B demande le graveur avant le scanner. Chacun doit posséder les ressources nécessaires pour effectuer son travail puis les libérer.
Une exécution peut réussir si A obtient les deux appareils, termine et les libère avant que B ne rencontre un conflit. Le même programme peut cependant produire cette trace :
| Étape | Événement | État utile pour le diagnostic |
|---|---|---|
| 1 | A obtient le scanner | Scanner détenu par A |
| 2 | B obtient le graveur | Graveur détenu par B |
| 3 | A demande le graveur | A attend B et conserve le scanner |
| 4 | B demande le scanner | B attend A et conserve le graveur |
A n'atteint pas la libération du scanner puisqu'il attend le graveur. B n'atteint pas la libération du graveur puisqu'il attend le scanner. Donner davantage de temps processeur à l'un d'eux ne rend pas disponible la ressource attendue : la dépendance concerne leurs détentions respectives.
L'enseignant utilise aussi cet exemple pour évoquer l'intégration de composants provenant d'entreprises différentes. Chaque composant peut avoir choisi son ordre d'acquisition sans connaître celui de l'autre. Le comportement global dépend alors de l'interaction entre ces protocoles.
2.3. Ressources matérielles, ressources logiques et retirabilité
Les périphériques rendent le problème facile à visualiser, mais les ressources en cause peuvent aussi être des verrous, des variables partagées, des régions mémoire ou des structures internes du noyau. Deux processus qui protègent des données différentes puis demandent mutuellement l'autre protection peuvent reproduire les dépendances de l'exemple scanner/graveur.
Le cours distingue deux catégories de ressources :
| Catégorie | Sens | Exemple et conséquence |
|---|---|---|
| Retirable | Le système peut la reprendre dans les conditions prévues sans rendre définitivement impossible la poursuite de son utilisateur | Une zone de RAM peut être transférée sur disque afin de récupérer de l'espace mémoire |
| Non retirable | Son retrait compromet le travail ou exige de respecter le protocole de son détenteur | Une impression, une gravure ou un mutex ne se reprennent pas arbitrairement sans conséquences |
Il faut distinguer la capacité de déplacer le contenu d'une zone mémoire de la possibilité de retirer librement une protection sur une donnée partagée. Le fait que des données résident en RAM ne permet pas de réattribuer leur verrou en ignorant l'état de la section critique. La notion pertinente dépend de la ressource effectivement considérée.
Les ressources non retirables sont au centre des exemples d'interblocage : le système ne dispose pas d'un retrait sans coût pour casser les dépendances. Les méthodes de récupération de la section 11 examinent précisément ce coût.
2.4. Cycle d'utilisation d'une ressource
Une utilisation normale suit les étapes requête, allocation, utilisation, libération. La requête exprime le besoin du processus. Si le système peut la satisfaire, la ressource lui est attribuée; le processus l'utilise puis la rend disponible. Si la requête ne peut pas être satisfaite, elle peut provoquer une attente.
Le risque apparaît lorsque le processus attend une nouvelle allocation tout en conservant des ressources déjà acquises. Il ne faut donc pas traiter les demandes séparément sans tenir compte des détentions au même instant. Ce sont ces deux informations combinées que les graphes et matrices vont représenter.