GNU/Linux >> Tutoriels Linux >  >> Linux

Mémoire partagée Linux :shmget() vs mmap() ?

Cela a beaucoup à voir avec l'histoire et les orientations futures.

Il était une fois deux versions principales (et quelque peu concurrentes) d'Unix - système V et BSD. SysV avait ses propres versions d'IPC, y compris les 3 grands - mémoire partagée, sémaphores et files d'attente de messages. POSIX est venu essayer d'unir les choses.

Donc, à l'heure actuelle, nous avons deux versions - la mémoire partagée posix, les MQ et les sémaphores et les versions sysV. Juste pour rendre les choses un peu plus confuses, les versions sysV sont également partie de posix.

Donc, fondamentalement, votre question est la suivante:voulez-vous utiliser la mémoire partagée de style Posix ou sysV? En général, la plupart des gens adoptent une vision à long terme et optent pour Posix car cela semble être la voie de l'avenir. Mais, de manière réaliste, les éléments sysV sont tellement intégrés dans tant de systèmes que vous devez avoir de sérieux doutes sur leur disparition.

Donc, en éliminant les trucs à long terme, il s'agit de ce qui a du sens pour votre projet et vos goûts. En général, les versions sysV ont tendance à être un peu plus puissantes, mais elles ont une interface maladroite que la plupart des gens trouvent un peu déroutante au premier contact. C'est particulièrement vrai pour les sémaphores sysV et les files d'attente de messages. En termes de mémoire partagée, on peut dire que sysV et posix sont gênants. Les versions sysV portent le maladroit ftok et des éléments clés tandis que le posix finit par prendre plusieurs appels et certaines conditions de course à mettre en place. De l'extérieur, les versions posix ont un avantage en ce qu'elles utilisent le système de fichiers et peuvent être maintenues avec des fonctions de ligne de commande standard comme 'rm' plutôt que de s'appuyer sur des programmes utilitaires séparés (par exemple ipcs ) requis par sysV.

Alors, lequel devriez-vous utiliser? En règle générale, les versions posix. Mais vous devriez vraiment vous familiariser avec les versions sysV. Ils ont certaines fonctionnalités qui vont au-delà des capacités des versions posix dont vous voudrez peut-être tirer parti dans des situations spécifiques.


Les deux méthodes sont viables. mmap la méthode est un peu plus restrictive que shmget , mais plus facile à utiliser. shmget est l'ancien modèle de mémoire partagée System V et bénéficie de la prise en charge la plus large. mmap /shm_open est la nouvelle façon POSIX de faire de la mémoire partagée et est plus facile à utiliser. Si votre système d'exploitation permet l'utilisation de la mémoire partagée POSIX, je suggérerais d'y aller.

Quelques conseils :

  • Si vous créez vos enfants via fork puis mmap avec MAP_ANONYMOUS | MAP_SHARED est de loin le moyen le plus simple - un seul appel. MAP_ANONYMOUS est cependant une extension Linux non spécifiée par POSIX.
  • Si vous démarrez les processus indépendamment, mais que vous pouvez leur fournir un nom de mémoire partagée, alors shm_open (+ ftruncate ) + mmap avec MAP_SHARED c'est deux/trois appels. Nécessite librt sur certains systèmes d'exploitation.
  • Si votre système d'exploitation a /dev/shm/ puis shm_open équivaut à ouvrir un fichier en /dev/shm/ .

Linux
  1. Comment effacer le cache mémoire sous Linux

  2. Linux - Utilisation réelle de la mémoire ?

  3. Manuel du programmeur Posix Vs Manuel du programmeur Linux ?

  4. Gestion de la mémoire Linux - Permutation, caches et VM partagées

  5. Suppression des bibliothèques partagées Linux

Comment vérifier la mémoire partagée Linux à l'aide de la commande ipcs

Comment effacer la mémoire d'échange sous Linux

exemples de commandes gratuits sous Linux

Comment répertorier les processus attachés à un segment de mémoire partagée sous Linux ?

Comment utiliser la mémoire partagée avec Linux en C

Mémoire inactive Linux