Avoir besoin d'utiliser IPC pour passer de grandes quantités de données (200 kb +) à partir d'un processus enfant à un parent sur OS X 10.4 et plus, j'ai lu la mémoire partagée sur des mécanismes de mémoire partagés System V et POSIX spécifiquement. Ensuite, j'ai réalisé que MMAP () peut être utilisé avec les drapeaux map_anon et map_shared pour faire une chose similaire (ou simplement avec le drapeau map_shared, si cela ne vous dérange pas de créer un fichier régulier). p>
Ma question est, y a-t-il une raison pour ne pas utiliser MMAP ()? Il semble beaucoup plus simple, la mémoire est toujours partagée et il n'est pas nécessaire de créer un fichier réel si j'utilise map_anon. Je peux créer le fichier dans le processus parent puis Fork () et EXEC () l'enfant et l'utiliser dans le processus d'enfant. p>
La deuxième partie de la question est de savoir quelles raisons que cette approche n'est pas suffisante et qu'il faudrait utiliser des mécanismes de mémoire partagés SYSV ou POSIX? p>
Notez que je prévoyais de faire la synchronisation à l'aide de tuyaux dont j'ai besoin pour une autre communication, c'est-à-dire que le parent demande des données sur le tuyau, l'enfant l'écrit à la mémoire partagée et réagit sur le tuyau qui est prêt. Pas de lecteurs multiples ou d'écrivains impliqués. La portabilité n'est pas une priorité. P>
4 Réponses :
Si la mémoire sert, la seule raison d'utiliser SYSV / POSIX sur MMAP code> est la portabilité. Dans les systèmes UNIX particulièrement anciens ne prenant pas en charge map_anon code>. Solaris, Linux, les BSD et OS X font em>, cependant, donc en pratique, il y a peu de raison pour ne pas utiliser mmap code>. P>
shm code> sous Linux est typiquement implémenté via un fichier / dev / shm code> get mmap code> PED, donc, la performance doit être équivalente - J'irais avec MMAP code> (w / map_anon code> et map_shared code> comme vous le mentionnez) pour la simplicité, si je sais que la portabilité n'est pas un problème comme vous le dites le cas pour vous. p>
memfd_create () code> est maintenant Également implémenté dans presque toutes les versions prises en charge du noyau Linux.
Si vous avez une relation parent / enfant, il est parfaitement bien d'utiliser MMAP. P>
SYSV_SHM est la implémentation UNIX d'origine qui permet des processus associés et non liés à partager la mémoire. POSIX_SHM Mémoire partagée normalisée. p>
Si vous êtes sur le système POSIX sans MMAP, vous utiliseriez POSIX_SHM. Si vous êtes sur un Unix sans POSIX_SHM, vous utiliseriez SYSV_SHM. Si vous n'avez besoin que de partager la mémoire vs un parent / enfant que vous utilisiez du MMAP si disponible. P>
Vous ne pouvez pas utiliser POSIX_SHM sans MMAP, cette partie est absurde. Vous avez raison dans le premier paragraphe, POSIX_SHM permet au MMAP lorsque vous n'avez pas de relation mère / enfant.
Les processus non liés peuvent partager la mémoire avec MMAP code> si elles sont rendues via un fichier réel.
aussi loin que le Documentation forte > sait, vous devez utiliser la mémoire partagée SYSV si vous souhaitez utiliser xlib / XCB Images de mémoire partagée . p>
Si j'utilise map_anon. Je peux créer le fichier dans le processus parent puis Fork () et EXEC () l'enfant et l'utiliser dans le processus d'enfant. I> -> Avez-vous réussi à accomplir cela en quelque sorte? Au mieux que je puisse dire, il n'y a aucun moyen d'avoir MMAP () Ed Memory survivre à un EXED. Il survit à la fourchette mais pas exécuté.