10
votes

Pourquoi utiliser SYSV ou POSIX Mémoire partagée VS MMAP ()?

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).

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.

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?

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é.


1 commentaires

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. -> 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é.


4 Réponses :


1
votes

Si la mémoire sert, la seule raison d'utiliser SYSV / POSIX sur MMAP est la portabilité. Dans les systèmes UNIX particulièrement anciens ne prenant pas en charge map_anon . Solaris, Linux, les BSD et OS X font , cependant, donc en pratique, il y a peu de raison pour ne pas utiliser mmap .


0 commentaires

1
votes

shm sous Linux est typiquement implémenté via un fichier / dev / shm get mmap PED, donc, la performance doit être équivalente - J'irais avec MMAP (w / map_anon et map_shared 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.


1 commentaires

memfd_create () est maintenant Également implémenté dans presque toutes les versions prises en charge du noyau Linux.



8
votes

Si vous avez une relation parent / enfant, il est parfaitement bien d'utiliser MMAP.

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.

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.


2 commentaires

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 si elles sont rendues via un fichier réel.



0
votes

aussi loin que le Documentation sait, vous devez utiliser la mémoire partagée SYSV si vous souhaitez utiliser xlib / XCB Images de mémoire partagée .


0 commentaires