Одна из функций диспетчера памяти — это сжатие страниц памяти. Основными кандидатами на сжатие являются используемые страницы процессов UWP-приложений.
Алгоритм сжатия страниц
В MicroSoft разработали специальный алгоритм для сжатия страниц памяти — «Microsoft Xpress«. Этот алгоритм сжимает страницы приблизительно до 30-50%.
Чтобы этот механизм освобождал память а не нагружал её еще сильнее, придумали следующие требования.
- В системе не может быть не сжатой страницы и такой-же сжатой. Если система успешно создала сжатый дубликат страницы, то оригинальную страницу нужно освободить.
- Если страница не может быть сжата достаточно эффективно, то она и не будет сжиматься.
- Сжатые страницы должны отображаться как свободные, хотя на сомом деле это страницы рабочего набора одного из системных процессов (об этом ниже).
В клиентских версиях ОС сжатие памяти включено по умолчанию. Серверные версии пока не поддерживают сжатие памяти вплоть до Windows Server 2019.
Пример сжатия
Допустим у нас есть:
- 8 свободных страниц, которые могут быть использованы работающими процессами в системе;
- 2 страницы которые сейчас находятся в работе;
- 6 страниц которые уже не являются частью рабочего набора процессов, но содержат не сохраненные данные.
Дальше диспетчер памяти хочет провести усечение списка измененных страниц. Информация на страницах 11, 12, 13 сжимается и помещается в одну страницу — 1 из свободных. А страницы 11, 12, 13 освобождаются.
Допустим ситуация повторилась, и теперь три страницы (14, 15, 16) сжались в две из свободных (2, 3):
Допустим теперь диспетчер памяти решил произвести усечение рабочего набора процесса сжатия памяти. Для этого он страницы 1 и 2 перемещает в измененные. Такие страницы все еще содержат данные, но уже не являются частью рабочего набора процесса:
Всё это сжатие позволило освободить оперативную память не обращаясь к диску. Используя только процесс сжатия памяти, а значит процессорное время. А если произойдет нехватка памяти, то измененные страницы просто запишутся на диск, а так как это сжатые страницы то и записывать на диск придется меньше.
Вот так сжатие памяти немного нагружая процессор заставляет систему меньше обращаться к дисковой подсистеме.
Процесс «Memory Compression»
Сжатая память хранится в рабочем наборе процесса «Memory Compression«. Кстати, объем рабочего набора этого процесса должен совпадать в диспетчере задач со сжатой памятью:
Этот процесс просто предоставляет адресное пространство для работы. В нем ничего не выполняется, то есть сжимает данные не он, а диспетчер памяти.