2010-02-14 13 views
22

Al haber aprendido un poco sobre el tema, ¿alguien puede decir cuál es la verdadera diferencia entre la memoria compartida POSIX (shm_open) y los archivos asignados POSIX (mmap)?memoria compartida Posix vs archivos asignados

Ambos parecen usar el subsistema/dev/tmpfs, en lugar del viejo mecanismo IPC.

Entonces, ¿hay alguna ventaja de usar el archivo mmap sobre la memoria compartida?

Gracias.

Respuesta

2

Según tengo entendido, esa memoria compartida está construida sobre los archivos mapeados, pero This Page parece indicar que la capacidad de utilizar archivos mapeados en memoria como memoria compartida es condicional.

El uso de la función mmap() está restringido por el valor del sistema QSHRMEMCTL. Cuando el valor de este sistema es 0, la función mmap() puede no crear una asignación compartida que tenga la capacidad PROT_WRITE. Básicamente, esto evita la creación de un mapa de memoria que podría alterar el contenido del archivo de flujo que se está mapeando. Si el parámetro flags indica MAP_SHARED, el parámetro prot especifica PROT_WRITE y el valor del sistema QSHRMEMCTL es 0, entonces las funciones mmap() fallarán y se producirá un número de error de EACCES.

memoria
+2

Bastante cierto QSHRMEMCTL es específico de iSeries. No se menciona en http://www.opengroup.org/onlinepubs/007908775/xsh/mmap.html, por ejemplo. Al igual que muchas preguntas sobre Unix apis, la respuesta realmente depende de qué Unix. –

+0

@Logan: bastante justo, parecía una restricción irracional. –

-1

compartida Básicamente es una forma de IPC.The región compartida se crea en/dev/shm que se crea en la memoria solamente (RAM) y que no requiere operaciones de disco, por lo que es un método más rápido del IPC. Aunque IPC se puede hacer usando un archivo de disco y luego usando mmap también, pero sería comparativamente lento. Alternativamente siempre puedes usar MAP_ANONYMOUS con mmap que no hace una copia de seguridad con ningún archivo de disco.

+1

¿Cómo lleva MAP_ANONYMOUS a la memoria compartida? – Flexo

+0

MAP_ANONYMOUS puede generar memoria compartida entre procesos relacionados (hijos, nietos, etc. y el proceso que los bifurcó). –

Cuestiones relacionadas