L'interblocage
Problème: Lorsque
(au moins) deux processus sont en exclusion mutuelle sur (au moins) 2 ressources
critiques il y a risque d'interblocage. Des processus se bloquent mutuellement
sur une ressource critique détenue par l'autre.
Programme
A
{ ...
P(S1);
P(S2);
...
V(S2);
V(S1); }
|
Programme B
{ ...
P(S2);
P(S1);
...
V(S1);
V(S2);}
|
Imaginons que les sémaphores sont tous les deux initialisés
à 1 et qu'un processus P1 est associé au programme A et qu'un
processus P2 est associé à B. Supposons que P1 se fait interrompre
juste après P(S1), et que P2 exécute P(S2) alors il se bloque
sur P(S1). Lorsque P1 reprend l'UC, il se bloque sur P(S2) ... IL Y A UN INTERBLOCAGE.
Solution: La seule solution
consiste à détruire un ou tous les processus interbloqués
et de les relancer plus tard. Il peut y avoir une solution préventive,
le calcul d'un graphe qui doit être sans circuit mais elle coute très
chère en temps.
Exemple
Une personne veut tracer un trait
avec une règle et un crayon, une autre a besoin de la règle
et du crayon pour faire un schéma. Si l'une prend la règle
et l'autre le crayon, il y a interblocage. Il y a une seule règle
et un seul crayon.
Programme
tracer-trait
{ P(règle);
P(crayon);
tracer-le-trait;
V(crayon);
V(règle);}
|
Programme faire-schéma
{ P(crayon);
P(règle);
faire-le-schéma;
V(règle);
V(crayon);}
|
suivant
plan