Выбор ответа Senior Процессы и сигналы обновлено
Copy-on-write после fork
Вопрос
Процесс Redis с 10 ГБ данных делает fork() для сохранения снапшота. Что происходит с памятью?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Страницы общие до первой записи, потом копируются по одной. После fork() ядро помечает страницы общими и только для чтения (copy-on-write).
Варианты ответа
- Сразу копируются все 10 ГБ, поэтому нужен двойной запас RAM
- Потомок получает пустое адресное пространство и читает с диска
- Память общая навсегда, и изменения родителя видны потомку
- Страницы общие до первой записи, потом копируются по однойправильный ответ
Разбор
После fork() ядро помечает страницы общими и только для чтения (copy-on-write). Копия создаётся, когда кто-то пишет в страницу. Поэтому снапшот почти бесплатен при малом числе записей, но при интенсивной записи память может вырасти до двойной. Сразу копировать всё ядро не будет, а изменения родителя потомку не видны: это разные адресные пространства. Ещё одна ловушка: Transparent Huge Pages увеличивают размер копируемой страницы.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.