Skip to content

MOOC NSI - fondamentaux.

Transcription de la vidéo

4.2.3.6 : Interblocages

[00:00:01]

Nous allons voir maintenant les inter blocages, qui sont une conséquence désagréable de la synchronisation entre activités concurrentes. Imaginons le situation suivante. Vous avez une société qui a deux pots de peinture, un pot de peinture jaune et un pot de peinture bleue. Qui sont rongés à deux endroits différents. Vous avez deux peintres de cette société qui doivent peindre en vert, donc pour faire du vert, forcément, ils ont besoin des deux pots. Alors, il y a le premier peintre qui va à l'emplacement du pot jaune, qui va le prendre, et il l'emmène dans la maison qu'il doit peindre, il y a le deuxième peintre qui vient, qui prend le bleu et qui l’emmène à sa maison à lui. Il y a le premier peintre qui vient pour chercher le bleu. Il ne le trouve pas alors du coup, il attend à ce qu'il revienne. Le deuxième peintre pareil. Il revient pour chercher le jaune. Il ne le trouve pas. Il est bloqué. Il n'est pas content, il attend. La situation est que les deux peintres sont bloqués, ne peuvent pas avancer dans leur travail et là, nous sommes dans une situation d'interblocage.

En Python, pour avoir cette situation, on peut donc modéliser nos deux pots par ce qu'on connaît, c'est-à-dire les verrous. On va avoir deux verrous, un verrou jaune et un verrou bleu. Nous allons avoir deux threads pour les deux peintres. Et donc le premier peintre,

[00:01:52]

dont le comportement est défini ici, va essayer de d'abord récupérer le pot jaune et ensuite récupérer le pot bleu. Donc, il va d'abord essayer de prendre le verrou jaune, de le verrouiller et ensuite de verrouiller le verrou bleu. L'autre peintre, il essaye de faire l'inverse. Il va d'abord essayer de prendre le bleu et ensuite le jaune. Avec la situation que je vous ai montrée et vu le fonctionnement des verrous, on sait bien que si unthread essaye de verrouiller un verrou qui est déjà verrouillé, il se retrouve bloqué. Si on exécute ce programme, on se retrouve dans la situation suivante où, effectivement, on démarre le programme, il y a le premier peintre qui prend le jaune., il y a le deuxième peintre qui prend le bleu ett à partir de là, il y a tout qui est bloqué et le programme n'avance pas.

De manière générale, pour qu'un inventaire blocage se produise, il y a besoin que plusieurs conditions soient réunies. Déjà, il faut qu'il y ait plusieurs activités en parallèle. Ensuite, il faut qu'elles travaillent sur les mêmes ressources partagées. Il faudrait que les activités aient besoin de plusieurs ressources pour effectuer leur travail et donc elles se les procurent une à une et tant qu'elles n'ont pas récupéré toutes les ressources et n'ont pas fini leur travail, elles ne relâchent pas les ressources qu'elles se sont déjà procurées.

[00:03:40]

Quand on essaie de représenter la situation où nous avons des activités qui demandent des ressources, qui les attendent, et des ressources qui sont en fait déjà récupérées par d'autres activités. Si nous nous retrouvons dans une situation où il y a un cycle, c'est que nous avons un blocage. Alors, une situation d'interblocage commune que vous pouvez rencontrer est la situation des carrefours avec priorité à droite où si nous suivons les règles à la lettre, si vous avez ici 4 voitures, les 4 voitures peuvent se retrouver bloquées. Heureusement, les chauffeurs savent communiquer et savent se mettre d'accord qui passe en premier pour que les situations se débloquent. Un autre exemple classique que nous voyons de cette problématique, c'est le problème des philosophes où nous avons des philosophes assis autour d'une table et où ils mangent et pensent et ils dorment. Pour manger, les philosophes ont besoin de deux fourchettes. Toutefois, si nous avons cinq philosophes, nous avons cinq fourchettes sur la table. Ainsi, si nous avons une situation où nous essayons de faire prendre d'abord la fourchette gauche pour manger et ensuite prendre la fourchette droite, on peut facilement se retrouver dans la situation d'interblocage où les philosophes n'ont qu'une fourchette et attendent indéfiniment pour récupérer l'autre. Donc, ils risquent de mourir de faim. Et c'est là que nous avons une situation de famine, ce qui est exactement le terme qui est utilisé dans le système d'exploitation quand des activités ne peuvent pas accéder aux ressources qu'elles demandent.

[00:05:36]

Donc, il faut à tout prix éviter les situations de famine pour un bon fonctionnement du système.

Comment gérer les interblocages? Alors déjà, on peut décider qu'on ne va rien faire si les inter blocage, c'est quelque chose qui arrive très rarement et si rebooter le système n'est pas trop grave. Si cette solution n'est pas applicable, on peut essayer de faire de sorte à ce que les interblocages ne soient pas possibles. Donc, on va prévenir les blocages. Ces mécanismes-là induisent un coût à l'exécution, donc ralentissent le fonctionnement global. Une autre alternative, c'est de guérir les blocages, c'est à dire que ce soit possible, que des interblocages surviennent, mais que le système périodiquement vérifie si c'est le cas et s' il détecte un interblocage, il répare la situation pour faire avancer le fonctionnement. Ces mécanismes là, malheureusement, ont aussi un coût et ralentissent le fonctionnement global du système.

Nous avons vu dans cette séquence ce qu'est un interblocage, une situation où des activités concurrentes s'attendent mutuellement et ne progressent pas. Les interblocages sont des situations difficiles à gérer et les mécanismes pour leur gestion sont coûteux et ralentissent le fonctionnement global du système.