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


En este hilo se sugiere al OP usar mmap() en lugar de shmget() para obtener memoria compartida en Linux. Visité esta página y esta página para obtener alguna documentación, pero la segunda da un oscuro ejemplo con respecto a mmap().

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

Gracias,

Bob

Author: Community, 2014-01-23

2 answers

Ambos métodos son viables. El 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 POSIX de hacer memoria compartida y es más fácil de usar. Si su sistema operativo permite el uso de la memoria compartida POSIX entonces yo sugeriría ir con eso.

Algunas pistas:

  • Si crea a sus hijos a través de fork entonces mmap con MAP_ANONYMOUS | MAP_SHARED es, con mucho, 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/ entonces shm_open es equivalente a abrir un archivo en /dev/shm/.
 61
Author: Sergey L.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-18 00:21:12

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

Érase una vez dos versiones principales (y algo competidoras) de unix - system V y BSD. SysV tenía sus propias versiones de IPC, incluyendo la gran memoria compartida de 3, semáforos y colas de mensajes. POSIX vino a tratar de unir las cosas.

Así que en la actualidad tenemos dos versiones: memoria compartida posix, MQs y semáforos y las versiones SysV. Solo para hacer las cosas un poco más confusas las versiones de SysV son también parte de posix.

Así que básicamente tu pregunta es ¿quieres usar memoria compartida de estilo Posix o SysV? En general, la mayoría de las personas toman la visión a largo plazo y optan por Posix porque parece ser el camino hacia el futuro. Pero, siendo realistas, las cosas de SysV están tan incrustadas en tantos sistemas que debes tener serias dudas de que alguna vez desaparecerán.

Así que, eliminando las cosas a largo plazo, todo se reduce a lo que tiene sentido para su proyecto y sus gustos. En general, el Las versiones SysV tienden a ser en realidad algo más potentes, pero tienen una interfaz torpe que la mayoría de la gente encuentra un poco desconcertante al 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 SysV llevan el torpe ftok y cosas clave, mientras que el posix termina recibiendo múltiples llamadas y algunas condiciones de carrera para configurar. Desde el exterior, las versiones posix tienen una ventaja en que utilizan el sistema de archivos y se pueden mantener con funciones de línea de comandos estándar como ' rm ' en lugar de depender de programas de utilidad separados (por ejemplo, ipcs) que SysV requiere.

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

 29
Author: Duck,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-23 15:37:29