Quiero asignar e inicializar un trozo bastante grande de memoria contigua (~ 1GB), luego marcarlo como proceso de solo lectura y horquilla múltiple (digamos varias docenas) secundarios que lo usarán, sin hacer sus propias copias de la memoria (la máquina no tendrá suficiente memoria para esto).¿Es esta una forma segura de compartir memoria de solo lectura con procesos secundarios?
Estoy en lo cierto al pensar que si malloc
la memoria como de costumbre, a continuación, marca como de sólo lectura con mprotect(addr, size, PROT_READ)
y luego fork
, esto permitirá que los procesos secundarios para utilizar con seguridad la memoria sin causar que se va a copiar? (Siempre que me asegure de que nada intente escribir en la memoria asignada después de la llamada mprotect
).
editar: Gracias por todas las respuestas.
Una pregunta de seguimiento - Yo pensaba usar shmget
, pero pensé que utiliza mm
y por lo tanto se limitaría a las asignaciones más pequeñas (véase el Restrictions section of this page). por ejemplo, /proc/sys/kernel/shmmax
es 32MB en el servidor que estoy usando este. Pero quiero 1GB de memoria contigua. ¿Me equivoco sobre esta limitación?
Ah, gracias, obviamente no leí la página del manual de mprotect lo suficiente. –
@dherefromhere 'MAP_SHARED | MAP_ANONYMOUS' aquí funciona para compartir desde un padre pre-bifurcado con cualquier elemento secundario. Si quieres compartir entre procesos arbitrarios, saca el 'MAP_ANONYMOUS' y dale un FD real en vez de' -1'; este FD puede venir de 'abrir' un archivo en el disco o de' shm_open'. – ephemient
La página del manual de linux para mprotect hace notar "En Linux, siempre es legal llamar a mprotect() en cualquier dirección en un espacio de direcciones de procesos ..." http://linux.die.net/man/2/mprotect –