Что происходит на уровне ядра Linux при вызове системной функции fork(), например при старте воркеров Celery или Gunicorn? Каким образом дочерний процесс получает копию адресного пространства родителя без немедленного физического копирования всей оперативной памяти?

fork создаёт дочерний процесс с отдельным виртуальным адресным пространством, а физические страницы первоначально могут разделяться через copy-on-write. Копирование требуется при записи в разделяемую страницу.

Короткий ответ

Что ответить на собеседовании

fork создаёт дочерний процесс с отдельным виртуальным адресным пространством, а физические страницы первоначально могут разделяться через copy-on-write. Копирование требуется при записи в разделяемую страницу.

Подробный разбор

Ответ с пояснениями

fork создаёт дочерний процесс с отдельным виртуальным адресным пространством, а физические страницы первоначально могут разделяться через copy-on-write. Копирование требуется при записи в разделяемую страницу.

Ядро создаёт структуры процесса и отображения памяти, но не обязано немедленно копировать все пользовательские данные. При попытке изменить защищённую разделяемую страницу возникает fault, и процесс получает собственную копию там, где это необходимо. Поэтому RSS процессов нельзя просто суммировать как независимую физическую память. Работа Python со счётчиками ссылок способна загрязнять страницы. Также после fork в многопоточной программе нужно учитывать унаследованные блокировки и небезопасное состояние библиотек.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее