Згідно з Вікіпедією (що може бути неправильним)
Коли видається системний виклик fork (), створюється копія всіх сторінок, що відповідають батьківському процесу, завантажується в окреме місце пам'яті ОС для дочірнього процесу. Але це не потрібно в певних випадках. Розглянемо випадок, коли дитина виконує "
exec
" системний виклик (який використовується для виконання будь-якого виконуваного файлу з програми C) або закінчується дуже скоро післяfork()
. Коли дитині потрібно просто виконати команду для батьківського процесу, немає необхідності в копіюванні сторінок батьківського процесу, оскількиexec
замінює адресний простір процесу, який викликав його, командою, яку потрібно виконати.У таких випадках використовується техніка, яка називається копіювати на запис (COW). За допомогою цієї методики, коли виникає роздвоєння, сторінки батьківського процесу не копіюються для дочірнього процесу. Натомість сторінки діляться між дочірнім та батьківським процесом. Щоразу, коли процес (батько чи дитина) змінює сторінку, окрема копія цієї конкретної сторінки робиться лише для цього процесу (батька чи дитини), який здійснив модифікацію. Потім цей процес використовуватиме щойно скопійовану сторінку, а не загальну у всіх майбутніх посиланнях. Інший процес (той, який не змінив спільну сторінку) продовжує використовувати оригінальну копію сторінки (яка зараз більше не надається). Ця методика називається копіювати при записі, оскільки сторінка копіюється, коли якийсь процес пише на неї.
Здається, що коли будь-який з процесів намагається записати на сторінку, нова копія сторінки виділяється та призначається процесу, який генерував помилку сторінки. Оригінальна сторінка після цього стає позначеною для запису.
Моє запитання: що відбувається, якщо fork()
дзвінки викликаються кілька разів, перш ніж будь-який з процесів зробив спробу записати на загальну сторінку?
pmap -XX PID
або cat /proc/PID/smap
.