web-dev-qa-db-fra.com

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

Dans this thread, il est suggéré à l'OP d'utiliser mmap() au lieu de shmget() pour obtenir de la mémoire partagée sous Linux. J'ai visité la page this et la page this pour obtenir de la documentation, mais la seconde donne un exemple obscur concernant mmap().

Étant presque un débutant et ayant besoin de partager des informations (sous forme de texte) entre deux processus, devrais-je utiliser la méthode shmget() ou mmap()? Et pourquoi?

55
BowPark

Les deux méthodes sont viables. La méthode mmap est un peu plus restrictive que shmget, mais elle est plus facile à utiliser. shmget est l'ancien modèle de mémoire partagée System V et dispose du support le plus large. mmap/shm_open est le nouveau moyen POSIX de créer 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 vous conseillerais de continuer avec cela.

Quelques astuces:

  • Si vous créez vos enfants via fork alors 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é par POSIX .
  • Si vous démarrez les processus indépendamment, mais pouvez leur fournir un nom de mémoire partagée, alors shm_open (+ ftruncate) + mmap avec MAP_SHARED 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 dans /dev/shm/.
72
Sergey L.

Cela tient en grande partie à l’histoire et aux orientations futures.

Il était une fois deux versions principales (et quelque peu concurrentes) de Unix - System V et BSD. SysV disposait de ses propres versions d'IPC, notamment de la grande mémoire partagée, des sémaphores et des files d'attente de messages. POSIX est venu pour essayer d'unir les choses.

Nous avons donc actuellement deux versions: la mémoire partagée posix, les MQ, les sémaphores et les versions sysV. Juste pour rendre les choses un peu plus confuses, les versions de sysV font aussi partie de posix.

Donc, fondamentalement, votre question est: 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 parce que cela semble être la voie de l'avenir. Mais, de façon réaliste, le contenu sysV est tellement intégré dans tant de systèmes que vous devez avoir des doutes sérieux sur le fait que cela va disparaître.

Donc, en éliminant les problèmes à long terme, il faut déterminer ce qui convient à votre projet et à vos goûts. En général, les versions de 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. Ceci est particulièrement vrai des sémaphores sysV et des files de messages. En termes de mémoire partagée, on peut dire que sysV et posix sont maladroits. Les versions de sysV portent le maladroit ftok et les éléments clés tandis que le posix prend plusieurs appels et certaines conditions de concurrence à configurer. De l'extérieur, les versions posix ont l'avantage d'utiliser le système de fichiers et peuvent être gérées avec des fonctions de ligne de commande standard telles que 'rm' plutôt que de s'appuyer sur des programmes utilitaires distincts (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 de sysV. Certaines de leurs fonctionnalités vont au-delà des fonctionnalités des versions posix, dont vous pouvez tirer parti dans certaines situations.

35
Duck