TNSI : Processus - Interblocage / Deadlock⚓︎
Introduction⚓︎
Le Système d'Exploitation dispose d'un ordonnanceur qui permet de gérer les accès concurrents aux ressources (des accès qui peuvent être réalisés de manière indépendante, et dans un ordre quelconque - non séquentiel) et prévenir certains problèmes d'accès aux ressources (interblocage/deadlock, famines, etc..) 1.
Un Problème de Synchronisation⚓︎
Une Situation⚓︎
- Considérons un programme de jeu multijoueurs (par ex. minecraft) utilisant une variable globale
nb_epees
qui représente le nombre d'épées sur un même serveur/monde. - Cette variable globale
nb_epees
en réserve (commune) est gérée par une même fonction. - Imaginons deux joueurs utilisant cette même fonction
Des Processus Concurrents⚓︎
- La double exécution de cette fonction se traduit par la création de deux processus
P1
etP2
. - Supposons maintenant qu'il ne reste qu'une seule épée en réserve:
P1
est élu, lance la prise d'une épée, mais est interrompu par l'ordonnanceur pour élireP2
avant queP1
n'ait décrémenténb_epees
.P2
a, quant à lui, le temps de décrémenternb_epees
. QuandP1
est élu à nouveau, il reprend où il en était et ne vérifie pas s'il reste une épée et ne voit donc pas d'anomalie.
- Chaque joueur se retrouve donc avec une épée, alors qu'il n'en restait plus qu'une
Pour gérer convenablement les accès concurrents à des mémoires partagés, des systèmes de
Processus Concurrents
Dans ce cas, on dit que les processus P1
et P2
sont
car ils sollicitent tous deux la (ou les) mêmes ressources, de manière indépendante l'un de l'autre, sur des intervalles de temps entrelacés (qui se chevauchent, entre leur début et leur fin).
Programmation Concurrente
La
Un Problème d'Interblocage⚓︎
Une analogie humoristique⚓︎
Col
4 Priorités à droite... circulaires
Interblocage⚓︎
Imaginons dans cette partie que deux processus P1
et P2
se répartissent deux ressources : R1
et R2
.
P1
est élu, demande et obtient une ressourceR1
, puis :P1
est commuté par l'ordonnanceur :P2
est élu, demande et obtientR2
,P2
demandeR1
, mais il ne peut l'obtenir car détenue parP1
P2
est donc commuté :P1
est élu (carR1
est détenue parP1
) et il demandeR2
, mais il ne peut pas l'obtenir carR2
est détenu parP2
.P1
est à son tour commuté :P2
est élu (carR2
est détenue parP2
) et il demandeR1
- etc..
- Les processus sont alors bloqués dans l'attente l'un de l'autre dans un cycle sans fin : On parle dans ce cas d'
interblocage /
deadlock . Des solutions (détection/guérison ou prévention) sont mises en place qui ne seront pas étudiées ici.
Caractérisation des Interblocages⚓︎
- Ensemble de Ressources:
- Partageables, ou pas
- Réquisitionnables, ou pas
- Chaque Ressource est dans l'état:
- Libre
- Verrouillée en mode exclusif
- Verrouillée en mode partagé
- Chaque Processus utilise une ressource de la manière suivante :
- Demande (si conflit \(\rightarrow\) attente)
- utilisation
- libération
\(\quad\quad\quad\) État Demande |
Libre | Verrou Partagé |
Verrou Exclusif |
---|---|---|---|
Partagé | Oui | Oui | |
Exclusif | Oui |
Les Conditions de Coffman⚓︎
La situation d'interblocage est le grand danger de la progammation concurrente : Elle a été théorisée par l'informaticien Edward Coffman (1934-)4 qui a énoncé, dans un article de \(1971\), quatre conditions nécessaires et suffisantes (appelées conditions de coffman) pour mener à l'interblocage :
- Exclusion mutuelle (mutex) : au moins une des ressources du système doit être en accès exclusif.
- Rétention des ressources : un processus détient au moins une ressource et requiert une autre ressource détenue par un autre processus
- Non préemption : Seul le détenteur d'une ressource peut la libérer.
- Attente circulaire : Chaque processus attend une ressource détenue par un autre processus.
P1
attend une ressource détenue parP2
qui à son tour attend une ressource détenue par (P3
etc... qui attend une ressource détenue par)P1
, ce qui clos la boucle.
Il existe heureusement des stratégies pour éviter ces situations. Nous ne rentrerons pas ici dans ces considérations qui dépassent le cadre du programme.