Є налаштування ядра
/ proc / sys / vm / overcommit_memory
Цитування з чудової статті :
Since 2.5.30 the values are: 0 (default): as before: guess about how much
overcommitment is reasonable, 1: never refuse any malloc(), 2: be precise
about the overcommit - never commit a virtual address space larger than swap
space plus a fraction overcommit_ratio of the physical memory. Here
/proc/sys/vm/overcommit_ratio (by default 50) is another user-settable
parameter. It is possible to set overcommit_ratio to values larger than 100.
(See also Documentation/vm/overcommit-accounting.)
Це стосується як виделок, так і звичайного лоскуса. Тобто, якщо ви встановите його на 0, форк буде копіюватися при записі. Копіювати при написанні означає, що раз додаток роздвоєне, обидві копії поділяться сторінками пам’яті утилітами дочірнього або оригінал починає змінювати пам’ять.
У більшості дистрибутивів я знаю, що перевиконання дорівнює 0. Але якщо встановити його на 2, всі сторінки пам'яті будуть повністю підкріплені реальною пам'яттю, а в деяких випадках під високим тиском пам'яті будуть більш стабільними, але деякі програми (я зіткнувся з gitk), на які покладаються на перевиконання не вдасться.
If enough is available the kernel will commit to the full virtual size of the parent for both processes after the fork.
Так дякую. Це означає, що зменшення віртуального сліду процесу в середовищі з обмеженою пам'яттю (оперативна пам'ять і своп) може вирішити проблему неможливості розщедритися.