Несколько процессов могут иметь разные виртуальные адреса, но содержать абсолютно одинаковые данные:
Process A Process B
0x400000 ──→ Page X 0x900000 ──→ Page Y
\ /
одинаковые
KSM (Kernel Samepage Merging) периодически сканирует подходящие anonymous pages и ищет одинаковое содержимое.
Если страницы совпали, kernel оставляет одну physical page и меняет mappings:
Process A ──┐
├──→ Page X
Process B ──┘
Теперь оба процесса читают одну и ту же страницу.
Самое интересное начинается при записи.
Process A ──┐
├──→ Page X
Process B ──┘
Process A: write()
↓
Copy-on-write
↓
Process A ──→ Page Z
Process B ──→ Page X
KSM помечает объединённую страницу так, чтобы запись не могла тихо изменить данные сразу для всех процессов. При попытке записи возникает page fault, после чего kernel создаёт отдельную копию страницы для записавшего процесса.
Проверить состояние KSM можно здесь:
cat /sys/kernel/mm/ksm/pages_shared
cat /sys/kernel/mm/ksm/pages_sharing
cat /sys/kernel/mm/ksm/pages_unshared
pages_shared показывает количество физических страниц, которые сейчас используются несколькими mappings.⚡️KSM экономит память не за счёт сжатия данных, а за счёт того, что разные процессы временно начинают указывать на одну physical page. Как только один из них меняет содержимое, обычный Copy-on-Write разводит их обратно.
