Blog ENI : Toute la veille numérique !
🐠 -25€ dès 75€ 
+ 7 jours d'accès à la Bibliothèque Numérique ENI. Cliquez ici
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
  1. Livres et vidéos
  2. Programmation système
  3. Communication interprocessus (IPC)
Extrait - Programmation système Maîtrisez les appels système Linux avec le langage C (Nouvelle édition)
Extraits du livre
Programmation système Maîtrisez les appels système Linux avec le langage C (Nouvelle édition) Revenir à la page d'achat du livre

Communication interprocessus (IPC)

Principes de communication interprocessus

Nous avons étudié dans les chapitres précédents différents mécanismes permettant à des processus de communiquer entre eux, pour échanger des données et pour se synchroniser. Il s’agit des tubes et des fichiers projetés en mémoire, pour les données, des signaux et des verrous de fichiers, pour la synchronisation.

D’autres mécanismes plus élaborés ont été mis en place au cours de l’évolution des systèmes de type Unix : les segments de mémoire partagée, les files d’attente de messages et les sémaphores.

Les sockets, mécanisme d’échange de données en local, mais surtout à travers un réseau, font l’objet du chapitre suivant.

1. IPC System V et IPC POSIX

D’abord implémentés dans le cadre d’Unix System V, le système Unix développé par ATT, ces mécanismes de communication interprocessus (Inter Process Communication) ont ensuite été revus et améliorés pour la normalisation POSIX. C’est la raison pour laquelle, bien que les deux ensembles, IPC System V et IPC POSIX, proposent les mêmes types de fonctionnalités, Linux, comme la plupart des systèmes de type Unix, supporte les deux.

On considère généralement...

Les segments de mémoire partagée

Les segments de mémoire partagée sont le moyen le plus performant pour partager des données entre processus. Une fois créés, ils sont accessibles à tout processus, sous réserve du contrôle d’accès mis en place par le processus créateur du segment de mémoire partagée. Ils sont persistants au niveau noyau, ce qui signifie que leur durée de vie maximale est celle du noyau, ils sont automatiquement supprimés à l’arrêt du système.

Une fois qu’un processus s’est attaché au segment, il peut accéder à la zone de données correspondante, en lecture et/ou en écriture, pour y gérer des variables, comme si elles étaient dans son espace mémoire virtuel.

La zone mémoire partagée est projetée dans l’espace virtuel du processus. Par conséquent, toute modification effectuée par un processus est immédiatement visible des autres processus attachés au segment. C’est la raison pour laquelle, sauf cas particuliers, il faut mettre en place un mécanisme de synchronisation entre les processus pour éviter les problèmes d’accès concurrents (race conditions).

Il existe deux mécanismes de segments de mémoire partagée utilisables avec Linux, ceux d’origine Unix System V et intégrés dans les standards SUS, ceux plus récents mis en place dans le cadre des normes POSIX. Nous allons décrire successivement les deux.

1. Les segments de mémoire partagée System V

Les IPC System V, segments de mémoire partagée, files d’attente de messages et sémaphores, partagent une logique et des outils communs. Leur implémentation s’appuie sur des attributs et des méthodes cohérents, facilitant leur utilisation, en contrepartie de la complexité de certains d’entre eux.

Un segment de mémoire partagée System V est un objet géré par le noyau, créé à la demande d’un processus et soumis à des permissions d’accès définies par le processus créateur.

Un processus qui souhaite accéder à un segment de mémoire partagée doit s’y attacher...

Les files d’attente de messages

Les files d’attente de messages sont un mécanisme de communication permettant à des processus de s’échanger des messages. Les messages sont stockés dans une file d’attente par les processus émetteurs et délivrés aux processus récepteurs, un processus pouvant jouer les deux rôles.

Les files d’attente de messages sont gérées en mémoire vive par le noyau. Il existe deux implémentations sur les systèmes de type Unix, les files d’attente de messages System V et les files d’attente de messages POSIX. Depuis quelques années, Linux intègre les deux, les files d’attente POSIX étant les plus récemment mises en place.

1. Les files d’attente de messages System V

Une file d’attente de messages System V est un objet géré par le noyau, créé à la demande d’un processus et soumis à des permissions d’accès définies par le processus créateur.

Un processus qui souhaite utiliser une file d’attente de messages, en lecture ou en écriture, doit fournir l’identifiant de la file d’attente. Le noyau contrôle les droits du processus et autorise ou non l’accès.

Un message est une entité indivisible. Cela implique qu’un programme ne peut écrire un message que complètement ou pas du tout. De même en lecture, un processus prélève le message entier de la file, et ne peut lire qu’un message à la fois. Ce découpage de la communication en messages distincts est une différence importante par rapport à la communication à travers un tube, où les informations sont traitées comme un flot d’octets unique.

La lecture est destructive : le message lu est supprimé de la file d’attente.

Chaque message est doté d’un attribut de type, sous la forme d’un entier. Cela permet une lecture sélective des messages, en spécifiant des plages de valeurs pour cet attribut.

Par défaut, l’écriture est bloquante. Si la file d’attente est pleine, le processus reste en attente jusqu’à ce que son écriture puisse être entièrement effectuée.

De même, par défaut...

Les sémaphores

Les sémaphores sont des outils de synchronisation entre processus. Ils sont gérés en mémoire vive par le noyau et permettent à différents processus de contrôler le bon déroulement de leur coopération, en particulier pour accéder à des ressources partagées en évitant les conflits d’accès.

Un sémaphore est un objet logique qui peut être pris ou libéré par un processus. Par convention entre les différents processus d’une application, seul le processus qui a pris le sémaphore peut accéder à une ressource, les autres processus se mettant en attente du sémaphore. Dès que celui-ci est relâché, un autre processus peut le prendre et accéder à la ressource.

Cette méthode est de type coopératif, car rien n’empêche un processus de ne pas tenir compte du sémaphore et d’accéder directement à la ressource, contrairement à d’autres méthodes de type impératif, comme par exemple le verrouillage impératif d’une zone de fichier.

Linux implémente deux mécanismes ayant des fonctionnalités similaires, les sémaphores System V et les sémaphores POSIX.

Les sémaphores System V sont les plus anciens dans le monde Unix, ils sont très complets, mais complexes à gérer et présentent quelques limites de conception.

Les sémaphores POSIX sont plus récents, implémentés sur Linux depuis seulement quelques années, ils sont plus simples à mettre en œuvre et évitent les problèmes rencontrés avec les sémaphores System V.

1. Les sémaphores System V

Les sémaphores System V ont longtemps été le standard de fait pour les systèmes de type Unix. Ils offrent de larges fonctionnalités, mais sont d’un usage délicat.

Le noyau gère des jeux de sémaphores (semaphores set), composés d’un certain nombre de sémaphores élémentaires. Chaque sémaphore élémentaire a une valeur entière positive ou nulle. La valeur d’un sémaphore peut être augmentée jusqu’à la valeur maximale autorisée...