
En informatique , la mémoire partagée est une mémoire à laquelle plusieurs programmes peuvent accéder simultanément dans le but d'assurer la communication entre eux ou d'éviter les copies redondantes. La mémoire partagée est un moyen efficace de transmettre des données entre les programmes. Selon le contexte, les programmes peuvent s'exécuter sur un seul processeur ou sur plusieurs processeurs distincts.
L'utilisation de la mémoire pour la communication au sein d'un seul programme, par exemple entre ses multiples threads , est également appelée mémoire partagée.
Dans le matériel

Dans le matériel informatique, la mémoire partagée fait référence à un bloc (généralement grand) de mémoire vive (RAM) auquel peuvent accéder plusieurs unités centrales de traitement (CPU) différentes dans un système informatique multiprocesseur .
Les systèmes de mémoire partagée peuvent utiliser :
- accès mémoire uniforme (UMA) : tous les processeurs partagent la mémoire physique de manière uniforme ;
- accès mémoire non uniforme (NUMA) : le temps d'accès à la mémoire dépend de l'emplacement mémoire par rapport à un processeur ;
- architecture de mémoire cache uniquement (COMA) : les mémoires locales des processeurs de chaque nœud sont utilisées comme cache plutôt que comme mémoire principale réelle.
Un système de mémoire partagée est relativement facile à programmer puisque tous les processeurs partagent une vue unique des données et la communication entre les processeurs peut être aussi rapide que les accès mémoire au même emplacement. Le problème avec les systèmes de mémoire partagée est que de nombreux processeurs ont besoin d'un accès rapide à la mémoire et mettront probablement en cache la mémoire , ce qui entraîne deux complications :
- dégradation du temps d'accès : lorsque plusieurs processeurs tentent d'accéder au même emplacement mémoire, cela provoque une contention . Tenter d'accéder à des emplacements mémoire proches peut entraîner un partage erroné . Les ordinateurs à mémoire partagée ne peuvent pas évoluer très bien. La plupart d'entre eux ont dix processeurs ou moins ;
- Manque de cohérence des données : chaque fois qu'un cache est mis à jour avec des informations qui peuvent être utilisées par d'autres processeurs, le changement doit être répercuté sur les autres processeurs, sinon les différents processeurs travailleront avec des données incohérentes. De tels protocoles de cohérence de cache peuvent, lorsqu'ils fonctionnent bien, fournir un accès extrêmement performant aux informations partagées entre plusieurs processeurs. En revanche, ils peuvent parfois être surchargés et devenir un goulot d'étranglement des performances.
Des technologies telles que les commutateurs crossbar , les réseaux Omega , HyperTransport ou le bus front-side peuvent être utilisées pour atténuer les effets de goulot d'étranglement.
Dans le cas d'une architecture système hétérogène (architecture de processeur qui intègre différents types de processeurs, tels que des CPU et des GPU , avec une mémoire partagée), l' unité de gestion de la mémoire (MMU) du CPU et l' unité de gestion de la mémoire d'entrée-sortie (IOMMU) du GPU doivent partager certaines caractéristiques, comme un espace d'adressage commun.
Les alternatives à la mémoire partagée sont la mémoire distribuée et la mémoire partagée distribuée , chacune présentant un ensemble similaire de problèmes.
Dans le logiciel
Dans les logiciels informatiques, la mémoire partagée est soit
- une méthode de communication interprocessus (IPC), c'est-à-dire un moyen d'échanger des données entre des programmes exécutés en même temps. Un processus crée une zone dans la RAM à laquelle d'autres processus peuvent accéder ;
- une méthode de conservation de l'espace mémoire en dirigeant les accès à ce qui serait normalement des copies d'un élément de données vers une seule instance, en utilisant des mappages de mémoire virtuelle ou avec un support explicite du programme en question. Cette méthode est le plus souvent utilisée pour les bibliothèques partagées et pour l'exécution sur place (XIP).
Étant donné que les deux processus peuvent accéder à la zone de mémoire partagée comme une mémoire de travail ordinaire, il s'agit d'un moyen de communication très rapide (contrairement à d'autres mécanismes d'IPC tels que les canaux nommés , les sockets de domaine Unix ou CORBA ). En revanche, il est moins évolutif, car par exemple les processus communicants doivent s'exécuter sur la même machine (parmi les autres méthodes IPC, seuls les sockets de domaine Internet, et non les sockets de domaine Unix, peuvent utiliser un réseau informatique ), et il faut veiller à éviter les problèmes si les processus partageant la mémoire s'exécutent sur des processeurs distincts et que l'architecture sous-jacente n'est pas cohérente avec le cache .
L'IPC par mémoire partagée est utilisé par exemple pour transférer des images entre l'application et le serveur X sur les systèmes Unix, ou à l'intérieur de l'objet IStream renvoyé par CoMarshalInterThreadInterfaceInStream dans les bibliothèques COM sous Windows .
Les bibliothèques dynamiques sont généralement conservées en mémoire une fois et mappées à plusieurs processus, et seules les pages qui ont dû être personnalisées pour le processus individuel (car un symbole y est résolu différemment) sont dupliquées, généralement avec un mécanisme appelé copie sur écriture qui copie de manière transparente la page lorsqu'une écriture est tentée, puis laisse l'écriture réussir sur la copie privée.
Par rapport aux systèmes d'exploitation à espace d'adressage multiple, le partage de mémoire - en particulier des procédures de partage ou des structures basées sur des pointeurs - est plus simple dans les systèmes d'exploitation à espace d'adressage unique .
Prise en charge des systèmes de type Unix
POSIX fournit une API standardisée pour l'utilisation de la mémoire partagée, POSIX Shared Memory . Elle utilise la fonction shm_opende sys/mman.h. La communication interprocessus POSIX (qui fait partie de l'extension POSIX:XSI) inclut les fonctions de mémoire partagée shmat, shmctl, shmdtet shmget. Unix System V fournit également une API pour la mémoire partagée. Elle utilise shmget de sys/shm.h. Les systèmes BSD fournissent une « mémoire mappée anonyme » qui peut être utilisée par plusieurs processus.
La mémoire partagée créée par shm_openest persistante. Elle reste dans le système jusqu'à ce qu'elle soit explicitement supprimée par un processus. Cela présente un inconvénient : si le processus plante et ne parvient pas à nettoyer la mémoire partagée, elle restera jusqu'à l'arrêt du système ; cette limitation n'est pas présente dans une implémentation spécifique à Android appelée ashmem.
POSIX fournit également l' mmapAPI pour mapper des fichiers en mémoire ; un mappage peut être partagé, permettant au contenu du fichier d'être utilisé comme mémoire partagée.
Les distributions Linux basées sur le noyau 2.6 et les versions ultérieures proposent /dev/shm comme mémoire partagée sous la forme d'un disque RAM , plus précisément sous la forme d'un répertoire accessible en écriture (un répertoire dans lequel chaque utilisateur du système peut créer des fichiers) qui est stocké en mémoire. Les distributions basées sur RedHat et Debian l'incluent par défaut. La prise en charge de ce type de disque RAM est entièrement facultative dans le fichier de configuration du noyau .
Prise en charge sur Windows
Sous Windows, on peut utiliser les fonctions CreateFileMappinget MapViewOfFilepour mapper une région d'un fichier en mémoire dans plusieurs processus.
Prise en charge multiplateforme
Certaines bibliothèques C++ fournissent un accès portable et orienté objet à la fonctionnalité de mémoire partagée. Par exemple, Boost contient la bibliothèque C++ Boost.Interprocess et Qt fournit la classe QSharedMemory.
Prise en charge du langage de programmation
Pour les langages de programmation avec des liaisons POSIX (par exemple, C/C++), les régions de mémoire partagée peuvent être créées et accessibles en appelant les fonctions fournies par le système d'exploitation. D'autres langages de programmation peuvent avoir leurs propres façons d'utiliser ces fonctions d'exploitation pour un effet similaire. Par exemple, PHP fournit une API pour créer une mémoire partagée, similaire aux fonctions POSIX .