Выбор ответа Senior Процессы и сигналы обновлено

Copy-on-write после fork

Вопрос

Процесс Redis с 10 ГБ данных делает fork() для сохранения снапшота. Что происходит с памятью?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Страницы общие до первой записи, потом копируются по одной. После fork() ядро помечает страницы общими и только для чтения (copy-on-write).

Варианты ответа

  1. Сразу копируются все 10 ГБ, поэтому нужен двойной запас RAM
  2. Потомок получает пустое адресное пространство и читает с диска
  3. Память общая навсегда, и изменения родителя видны потомку
  4. Страницы общие до первой записи, потом копируются по однойправильный ответ

Разбор

После fork() ядро помечает страницы общими и только для чтения (copy-on-write). Копия создаётся, когда кто-то пишет в страницу. Поэтому снапшот почти бесплатен при малом числе записей, но при интенсивной записи память может вырасти до двойной. Сразу копировать всё ядро не будет, а изменения родителя потомку не видны: это разные адресные пространства. Ещё одна ловушка: Transparent Huge Pages увеличивают размер копируемой страницы.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.