Я читал об использовании COW-подхода после выполнения fork
в современных UNIX-подобных системах.
Предположим, у нас есть процесс — P1. Он разветвляется; получаем еще один процесс — P2. Их виртуальная память поддерживается теми же физическими страницами из-за COW. Существует страница, на которой расположена одна статическая глобальная переменная (например, static long variable;
вне main
) (в сегменте .data), поддерживаемая физической страницей A.
Теперь P1 изменяет свою статическую глобальную переменную; ядро после обработки сбоя защиты отображает новую страницу (страницу B) в виртуальную память P1 для хранения этой измененной переменной.
Точно так же, как P2 изменяет свою статическую глобальную переменную, ядро после обработки сбоя защиты отображает новую страницу (страницу C) в виртуальную память P1 для хранения этой измененной переменной.
Теперь ничто не ссылается на страницу А. Где она находится? Я полагаю, это не «висит в воздухе», удерживая одну физическую страницу неиспользуемой, тем самым тратя память?