GNU/Linux >> Tutoriales Linux >  >> Linux

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

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 entonces mmap con MAP_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 con MAP_SHARED son 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/ .

Linux
  1. Linux – ¿Uso de memoria real?

  2. ¿Manual del programador de Posix Vs Manual del programador de Linux?

  3. Asesino de falta de memoria de Linux

  4. Eliminando las bibliotecas compartidas de Linux

  5. ¿La asignación de memoria en Linux no bloquea?

Uso de memoria de Linux

Cómo verificar la memoria compartida de Linux usando el comando ipcs

Cómo borrar la memoria de intercambio en Linux

Gestión de memoria de Linux:intercambio, cachés y VM compartida

Lanzamiento de Kali Linux 2018.1

Ejemplos de comandos gratuitos en Linux