2012-06-12 12 views
8

que tienen una gran memoria intermedia:obtener el comportamiento de copia por escritura del tenedor ing(), sin tenedor()

char *buf = malloc(1000000000); // 1GB 

Si bifurcada un nuevo proceso, que tendría un buf, que la memoria compartida con el buf de los padres hasta que uno o el otro le escribieron. Incluso entonces, solo un nuevo bloque 4KiB necesitaría ser asignado por el kernel, el resto continuaría siendo compartido.

Me gustaría hacer una copia de buf, pero solo voy a cambiar un poco de la copia. Me gustaría el comportamiento de copiar y escribir sin bifurcaciones. (Como se obtiene de forma gratuita al bifurcar.)

¿Esto es posible?

+0

seguro, pero no será "gratis": tendrá que gestionar su propia memoria y realizar un seguimiento de los cambios. –

+1

Sí, quiero 'gratis'. Me preguntaba si había alguna solución basada en mmap, o tal vez algo que ni siquiera había imaginado. – fadedbee

+0

¿Quizás mmap con MAP_ANONYMOUS y MAP_PRIVATE haría el trabajo? – fadedbee

Respuesta

9

Deberá crear un archivo en el disco o un segmento de memoria compartida POSIX (shm_open) para el bloque. La primera vez, asócielo con MAP_SHARED. Cuando esté listo para hacer una copia y cambiar a COW, llame de nuevo al mmap con MAP_FIXED y MAP_PRIVATE para hacer un mapa sobre el mapa original y con MAP_PRIVATE para hacer la segunda copia. Esto debería darte los efectos que deseas.

+1

Parece muy alentador, pero no puedo hacer que funcione. Aparece un error de bus (en la línea 13). fd == 3. ¿Podría señalar mi estúpido error? https://gist.github.com/2924412 – fadedbee

+1

Necesita 'ftruncate' para darle un tamaño al segmento de memoria compartida. El tamaño inicial es cero. –

+0

Gracias, agregué un ftruncate y ahora tengo un error de seg en lugar de un error de bus, todavía en la línea 14. – fadedbee