Цілісність з fork()
реалізуються з допомогою ММАПА / копіювання при записі.
Це не тільки впливає на купу, але й спільні бібліотеки, стеки, області BSS.
Це, до речі, означає, що вилка - це надзвичайно легка операція, поки два результуючі процеси (батька та дитини) фактично не почнуть записувати в діапазони пам'яті. Ця особливість є головним фактором летальності форк-бомб - ви закінчуєте занадто багато процесів, перш ніж ядро перевантажується реплікацією та диференціацією сторінки.
Вам буде важко знайти в сучасній ОС приклад операції, коли ядро виконує друковану копію (виняток становлять драйвери пристроїв) - використовувати функціонал VM просто набагато, набагато простіше та ефективніше.
Навіть execve()
, по суті, "будь-ласка, перегляньте бінарне / ld.so / whatnot, за яким слід виконати" - і VM обробляє фактичне завантаження процесу в оперативну пам'ять та виконання. Локальні неініціалізовані змінні в кінцевому підсумку перетворюються на "нульову сторінку" - спеціальна сторінка для копіювання на записі, що містить лише нульове читання, що містить нулі, локальні ініціалізовані змінні в кінцевому підсумку перетворюються на копіювання (копіювання під час запису, знову) від самого бінарного файлу, тощо.