2012-06-12 9 views
8

ho un buffer di grandi dimensioni:ottenere il comportamento di copia su scrittura della forcella() ing, senza forcella()

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

Se biforcato un nuovo processo, avrebbe un BUF cui la memoria condivisa con il genitore del genitore fino a quando uno o l'altro gli ha scritto. Anche allora, solo un nuovo blocco 4KiB dovrebbe essere assegnato dal kernel, il resto continuerà ad essere condiviso.

Mi piacerebbe fare una copia di buf, ma ho intenzione di cambiare solo un po 'della copia. Mi piacerebbe il comportamento copy-on-write senza biforcazione. (Come si ottiene gratuitamente quando si biforca.)

È possibile?

+0

sicuro, ma non sarà "gratuito": dovrai gestire la tua memoria e tenere traccia delle modifiche. –

+1

Sì, voglio "gratuitamente". Mi stavo chiedendo se ci fossero delle soluzioni basate su mmap, o forse qualcosa che non avevo nemmeno immaginato. – fadedbee

+0

Forse mmap con MAP_ANONYMOUS e MAP_PRIVATE farebbe il lavoro? – fadedbee

risposta

9

Si desidera creare un file su disco o un segmento di memoria condivisa POSIX (shm_open) per il blocco. La prima volta, mappalo con MAP_SHARED. Quando sei pronto per fare una copia e passare a COW, chiama di nuovo mmap con MAP_FIXED e MAP_PRIVATE per eseguire il mapping sulla parte superiore della mappa originale e con MAP_PRIVATE per creare la seconda copia. Questo dovrebbe darti gli effetti che vuoi.

+1

Sembra molto incoraggiante, ma non riesco a farlo funzionare. Ottengo un errore di bus (sulla linea 13). fd == 3. Potresti segnalare il mio stupido errore? https://gist.github.com/2924412 – fadedbee

+1

È necessario 'ftruncate' per dare al segmento di memoria condivisa una dimensione. La dimensione iniziale è zero. –

+0

Grazie, ho aggiunto un ftruncate e ora ho un segfault invece di un errore di bus, sempre alla riga 14. – fadedbee

Problemi correlati