Skip to content

MOOC NSI - fondamentaux.

Transcription de la vidéo

4.2.2.5 : Communication inter-processus I

[00:00:01]

Dans cette vidéo, nous allons introduire la question de communication entre processus, une question qui va nous occuper pendant plusieurs séquences vidéo à venir. Avant de parler de communication, nous allons expliquer que la communication entre processus est difficile puisque par défaut, les processus sont isolés, c'est-à-dire qu'ils ne partagent rien et ils évoluent chacun de manière indépendante.

Pour illustrer cet aspect, nous allons considérer le programme Python qui est montré ici. Nous avons un premier processus qui va être lancé lors du lancement du programme, qui va commencer par l'exécution de la fonction main. Dans main il déclare une variable locale, il lui affecte la valeur 10, il fait un affichage et il appelle la fonction fork. Si tout se passe bien après le fork nous avons deux processus : un processus fils et un processus père. Vu que fork renvoie 0 au processus fils, pour le fils newpid va être égal à zéro et il va pouvoir continuer avec la suite des instructions en exécutant la partie if du bloc if-else. Pour le père le fork renvoie l'identifiant du fils qui est une valeur positive différente de zéro et donc le père va continuer avec le bloc if-else, mais lui va exécuter la partie else. Vous voyez bien que le fils va faire moins un (-1) sur i alors que le père va faire plus un (+1) sur i. Schématiquement, il va se passer la chose suivante : à gauche, nous avons le père qui a sa maison, son espace mémoire. A droite, nous allons avoir le fils qui est lui aussi dans son propre espace. Ce qu'il faut comprendre, c'est que si le fils est une copie conforme du père, alors il a une copie de la variable i. Donc, le i que nous voyons des deux côtés, ce n'est pas la même variable qui serait partagée entre les deux processus,

[00:02:14] mais nous avons bien deux variables distinctes: un i du père et un i du fils. Donc, après le fork, les deux processus continuent avec les instructions qui suivent le fork. Côté père, on fait +1 et donc, naturellement, le i du père prend la valeur 11, alors que côté fils, on fait -1 et donc nous nous retrouvons avec la valeur de son i à lui qui vaut 9. Si nous regardons la trace d'exécution, nous voyons bien cette situation là. Ici, le père, c'est l'affichage des deux premières lignes. On retrouve bien le i qui vaut 11 et le fils c'est l'affichage des deux lignes à la fin et on a le i qui vaut neuf.

Alors, l'isolation, c'est un mécanisme par défaut pour les processus et c'est un mécanisme de sécurité, c'est-à-dire que le système d'exploitation ne permet pas au processus de communiquer facilement pour les protéger. En effet, il faut garantir qu'un processus ne puisse pas corrompre l'exécution ou les données d'un autre processus. Et ça, ça peut être possible, soit parce qu'il y a des actions malveillantes, des attaques, soit par des erreurs de programmation. Donc, par défaut, le système d'exploitation garantit que deux processus différents ne partagent rien et donc ne peuvent pas communiquer. Mais du coup, comment peut-on faire pour faire interagir des processus? Il existe différents mécanismes qui sont soit pour des processus qui s'exécutent sur la même machine, soit pour des processus qui s'exécutent sur des machines différentes. Ensemble, nous allons voir dans les vidéos qui suivent la communication en utilisant les signaux, ainsi que la communication par tube. Vous allez également voir dans le bloc 4 la communication par sockets.