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

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

étant presque un internaute novice, et ayant besoin de partager certaines informations (sous forme de texte) entre deux processus, devrais-je utiliser le shmget() méthode ou mmap() ? Et pourquoi?

Merci,

Bob

48
demandé sur Community 2014-01-23 18:33:26

2 réponses

les Deux méthodes sont viables. mmap 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 du plus large soutien. 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 autorise L'utilisation de la mémoire partagée de POSIX, je vous suggérerais d'aller dans ce sens.

quelques conseils:

  • si vous créez votre enfants via fork puis mmap avec MAP_ANONYMOUS | MAP_SHARED est de loin la voie la plus facile - juste un appel.
  • 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 c'est deux/trois appels. Nécessite librt sur certains os.
  • si votre OS a /dev/shm/ alors shm_open est équivalent à ouvrir un fichier dans /dev/shm/ .
61
répondu Sergey L. 2015-05-18 00:21:12

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

il était une fois deux versions principales (et un peu concurrentes) d'unix - system V et BSD. SysV avait ses propres versions de la CIB, y compris la mémoire partagée, les sémaphores et les files d'attente de messages. POSIX est venu pour essayer d'unir les choses.

donc nous avons actuellement deux versions - la mémoire partagée posix, MQs, et les sémaphores et les versions sysV. Juste pour faire des choses un peu plus confus les versions sysV sont aussi partie de posix.

donc fondamentalement, votre question Est de savoir si vous voulez utiliser la mémoire partagée de style Posix ou sysV? En général, la plupart des gens ont 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 système sysV est tellement intégré dans tant de systèmes qu'il faut avoir de sérieux doutes qu'il disparaîtra un jour.

donc, en éliminant le long terme des trucs, c'est ce qui fait sens pour votre projet et de vos goûts. En général, les versions sysV ont tendance à être en fait un peu plus puissantes, mais elles ont une interface clunky que la plupart des gens trouvent un peu déconcertante au premier contact. Cela 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 argumenter que sysV et posix sont maladroits. Les versions sysV portent le clunky ftok et des trucs clés tandis que le posix finit par prendre plusieurs appels et certaines conditions de course. 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 compter sur des programmes utilitaires séparés (par exemple ipcs ) que sysV exige.

alors, que devez-vous utiliser? En règle générale, les versions posix. Mais vous devriez vraiment vous familiariser avec les versions sysV. Ils ont certaines caractéristiques qui vont au-delà des capacités de les versions posix dont vous pouvez profiter dans des situations spécifiques.

29
répondu Duck 2014-01-23 15:37:29