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
puismmap
avecMAP_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
avecMAP_SHARED
c'est deux/trois appels. Nécessitelibrt
sur certains systèmes d'exploitation. - Si votre système d'exploitation a
/dev/shm/
puisshm_open
équivaut à ouvrir un fichier en/dev/shm/
.