Mucho de esto tiene que ver con la historia y las direcciones futuras.
Érase una vez dos versiones principales (y algo competitivas) de Unix:system V y BSD. SysV tenía sus propias versiones de IPC, incluidos los 3 grandes:memoria compartida, semáforos y colas de mensajes. POSIX apareció para intentar unir las cosas.
Entonces, en la actualidad, tenemos dos versiones:memoria compartida posix, MQ y semáforos y las versiones sysV. Solo para hacer las cosas un poco más confusas, las versiones sysV son también parte de posix.
Entonces, básicamente, su pregunta es si desea usar la memoria compartida de estilo Posix o sysV. En general, la mayoría de la gente tiene una visión a largo plazo y opta por Posix porque parece ser el camino hacia el futuro. Pero, de manera realista, las cosas de sysV están tan integradas en tantos sistemas que debe tener serias dudas de que alguna vez desaparecerán.
Entonces, eliminando las cosas a largo plazo, todo se reduce a lo que tiene sentido para su proyecto y sus gustos. En general, las versiones de sysV tienden a ser un poco más poderosas, pero tienen una interfaz torpe que la mayoría de las personas encuentran un poco desconcertante al primer contacto. Esto es particularmente cierto en el caso de los semáforos sysV y las colas de mensajes. En términos de memoria compartida, se puede argumentar que tanto sysV como posix son incómodos. Las versiones sysV llevan el torpe ftok
y cosas clave mientras que el posix termina tomando múltiples llamadas y algunas condiciones de carrera para configurar. Desde el exterior, las versiones posix tienen la ventaja de que utilizan el sistema de archivos y se pueden mantener con funciones de línea de comando estándar como 'rm' en lugar de depender de programas de utilidad separados (por ejemplo, ipcs
) que requiere sysV.
Entonces, ¿cuál deberías usar? Por regla general, las versiones posix. Pero realmente debería familiarizarse con las versiones de sysV. Tienen algunas características que van más allá de las capacidades de las versiones de posix que quizás desee aprovechar en situaciones específicas.
Ambos métodos son viables. mmap
el método es un poco más restrictivo que shmget
, pero más fácil de usar. shmget
es el antiguo modelo de memoria compartida de System V y tiene el soporte más amplio. mmap
/shm_open
es la nueva forma POSIX de hacer memoria compartida y es más fácil de usar. Si su sistema operativo permite el uso de memoria compartida POSIX, le sugiero que lo haga.
Algunos consejos:
- Si crea sus hijos a través de
fork
entoncesmmap
conMAP_ANONYMOUS | MAP_SHARED
es, con mucho, la forma más fácil:solo una llamada.MAP_ANONYMOUS
sin embargo, es una extensión de Linux no especificada por POSIX. - Si inicia los procesos de forma independiente, pero puede proporcionarles un nombre de memoria compartida, entonces
shm_open
(+ftruncate
) +mmap
conMAP_SHARED
son dos/tres llamadas. Requierelibrt
en algunos sistemas operativos. - Si su sistema operativo tiene
/dev/shm/
entoncesshm_open
es equivalente a abrir un archivo en/dev/shm/
.