2012-06-12 2 views
8

У меня есть большой буфер:Получить поведение копирования при записи на вилке() Инг, без вилки()

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

Если я раздвоенный новый процесс, он будет иметь БУФ, которые в общей памяти с родительский buf, пока тот или другой не напишут ему. Даже тогда, только один новый блок 4KiB должен быть выделен ядром, остальное будет по-прежнему разделяться.

Я хотел бы сделать копию buf, но я только немного изменю копию. Я бы хотел, чтобы режим копирования на запись не разворачивался. (Как вы получаете бесплатно при разрыве.)

Возможно ли это?

+0

уверен, но это не будет «бесплатно» - вы будете иметь собственное управление памятью и отслеживать изменения. –

+1

Да, я хочу «бесплатно». Мне было интересно, есть ли какие-либо решения на основе mmap, или, может быть, то, о чем я даже не думал. – fadedbee

+0

Возможно, mmap с MAP_ANONYMOUS и MAP_PRIVATE выполнит эту работу? – fadedbee

ответ

9

Вам понадобится создать файл на диске или сегмент разделяемой памяти POSIX (shm_open) для блока. В первый раз нарисуйте его MAP_SHARED. Когда вы будете готовы сделать копию и переключиться на COW, вызовите mmap снова с MAP_FIXED и MAP_PRIVATE, чтобы перевернуть карту поверх вашей исходной карты и с помощью MAP_PRIVATE сделать вторую копию. Это должно дать вам нужные вам эффекты.

+1

Это выглядит очень обнадеживающим, но я не могу заставить его работать. Я получаю ошибку шины (в строке 13). fd == 3. Не могли бы вы указать на мою тупую ошибку? https://gist.github.com/2924412 – fadedbee

+1

Вам нужно 'ftruncate', чтобы предоставить сегменту разделяемой памяти размер. Начальный размер равен нулю. –

+0

Спасибо, я добавил ftruncate и теперь имею segfault вместо ошибки шины, все еще в строке 14. – fadedbee

Смежные вопросы