usuario sistemas shmget operativos mtab memoria hijo etc entorno compartida aplicaciones c linux posix shared-memory mmap

sistemas - shmget en c



Memoria compartida de Linux: shmget() vs mmap()? (2)

Ambos métodos son viables. mmap método mmap es un poco más restrictivo que shmget , pero más fácil de usar. shmget es el antiguo modelo de memoria compartida System V y tiene el soporte más amplio. mmap / shm_open es la nueva forma de POSIX para hacer memoria compartida y es más fácil de usar. Si su sistema operativo permite el uso de la memoria compartida POSIX, le sugiero que vaya con eso.

Algunos consejos:

  • Si creas a tus hijos mediante un fork , mmap con MAP_ANONYMOUS | MAP_SHARED MAP_ANONYMOUS | MAP_SHARED es, de lejos, la forma más fácil: solo una llamada.
  • Si inicia los procesos de forma independiente, pero puede proporcionarles un nombre de memoria compartida, entonces shm_open (+ ftruncate ) + mmap con MAP_SHARED es dos / tres llamadas. Requiere librt en algunos sistemas operativos.
  • Si su sistema operativo tiene /dev/shm/ shm_open es equivalente a abrir un archivo en /dev/shm/ .

En this hilo, se sugiere que OP utilice mmap() lugar de shmget() para obtener memoria compartida en Linux. Visité this página y this página para obtener documentación, pero la segunda ofrece un oscuro ejemplo sobre mmap() .

Siendo casi un novato, y necesitando compartir cierta información (en forma de texto) entre dos procesos, ¿debería usar el método shmget() o mmap() ? ¿Y por qué?

Gracias,

Chelín


Mucho de esto tiene que ver con la historia y las direcciones futuras.

Había una vez dos versiones principales (y algo competitivas) de Unix: sistema V y BSD. SysV tenía sus propias versiones de IPC, incluidas las grandes 3 memorias compartidas, semáforos y colas de mensajes. POSIX vino para tratar de unir cosas.

Por lo tanto, actualmente 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 también son parte de posix.

Así que, básicamente, su pregunta es, ¿desea utilizar 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 sysV están tan arraigadas en tantos sistemas que tienes que tener serias dudas de que alguna vez desaparecerán.

Entonces, al eliminar las cosas a largo plazo, todo se reduce a lo que tenga sentido para su proyecto y sus gustos. En general, las versiones sysV tienden a ser de hecho un poco más poderosas, pero tienen una interfaz torpe que la mayoría de la gente encuentra un poco desconcertante en el primer contacto. Esto es particularmente cierto para 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 de sysV llevan el ftok torpe y cosas clave, mientras que la 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 sysV requiere.

Entonces, ¿cuál deberías usar? Como regla general, las versiones posix. Pero realmente debería familiarizarse con las versiones sysV. Tienen algunas características que van más allá de las capacidades de las versiones de posix que puede aprovechar en situaciones específicas.