Перейти к содержимому

Memory Manager и системный cache Windows: paging, page combining и lazy write

На этой странице

В этой серии проверены семь параметров подкачки, объединения одинаковых страниц, кучи ядра и файлового кэша. В Windows 11 25H2 найден код чтения каждого из них. Практическая польза зависит от параметра и условий работы.

DisablePageCombining отключает фоновое объединение страниц: диспетчер памяти перестаёт выполнять эту работу, но расход RAM может вырасти. DisablePagingExecutive удерживает выгружаемый код драйверов в физической памяти; польза обычно мала. Остальные параметры применимы только к отдельным задачам ядра или накопителей либо уже имеют подходящие значения по умолчанию в 25H2.

Для каждого значения проверялись:

  1. точный путь в реестре и тип;
  2. значение по умолчанию, заданное кодом Windows 11 25H2;
  3. связанные значения той же подсистемы;
  4. системный код чтения и момент его выполнения;
  5. ограничения диапазона, преобразование значений и единицы измерения;
  6. прямой эффект и границы применимости.

Помимо кода чтения мы проверяли, где применяется параметр, какие последствия имеет его изменение и в каких сценариях оно может быть полезно. Самого наличия параметра для рекомендации недостаточно.

  • Windows 11 25H2 x64, build 26200.9168.
  • Параметры ядра сопоставлены с основной таблицей конфигурации ntoskrnl.exe и кодом их применения в Memory Manager и Cache Manager.
  • Обращения во время работы проверялись системной трассировкой реестра. Чтения на фазе 0 и в начале фазы 1 могут отсутствовать в обычной трассе загрузки: драйвер трассировки начинает запись позже.
  • Для пользовательских процессов отдельно проверялось чтение значения в ntdll.dll. Для HeapDeCommitFreeBlockThreshold в 25H2 найдено чтение в ядре, но кучи пользовательских процессов этот параметр не используют.
  • Статический анализ системных компонентов не заменяет повтор на физическом ПК, другом build или другом типе накопителя.
Registry path Value Type Default Windows 11 25H2 Применение
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management DisablePagingExecutive REG_DWORD 0 Paging pageable-кода системных драйверов
тот же путь DisablePageCombining REG_DWORD 0 Фоновое объединение одинаковых физических страниц
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager HeapDeCommitFreeBlockThreshold REG_DWORD 0x1000 (4 KB) для kernel heap Порог decommit свободных блоков kernel-mode heap
тот же путь ModifiedWriteMaximum REG_DWORD 1 единица = 1 MB Верхний предел modified page writer после clamp
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management EnableAsyncLazywrite REG_DWORD 2 Асинхронный режим Cache Manager
тот же путь CacheUnmapBehindLengthInMB REG_DWORD 8 MB Окно unmap позади последовательного чтения
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Kernel SplitLargeCaches REG_DWORD 0 Представление cache topology между processor groups

При 0 диспетчер памяти Windows может выгружать допускающие это секции системного кода и драйверов в резервное хранилище. При 1 выгружаемый код системных драйверов удерживается в физической памяти.

Код чтения найден в ntoskrnl.exe на раннем этапе инициализации ядра. Значение используется в MmResetDriverPaging, MmPageEntireDriver и при загрузке системных образов. Оно применяется раньше, чем начинается обычная пользовательская трассировка реестра. Для применения нового состояния нужен перезапуск.

  • 0: штатное состояние Windows, подкачка разрешена.
  • 1: выгружаемые секции системных драйверов удерживаются в RAM.
  • Настройка расходует RAM, чтобы сократить последующие загрузки системного кода обратно в память; сам диск быстрее не работает.

Настройка предотвращает последующую выгрузку и загрузку этих секций драйверов. Отдельного постоянного проверяющего потока CPU она не отключает. На современной системе с достаточным объёмом RAM польза обычно очень мала: код и без настройки может долго оставаться в памяти. При нехватке RAM его принудительное удержание усиливает дефицит памяти.

Чтение параметра и направление системного эффекта подтверждены кодом ntoskrnl.exe.

При 0 диспетчер памяти запускает фоновую задачу, которая ищет и объединяет одинаковые физические страницы. При 1 эта задача не выполняет объединение.

В ntoskrnl.exe найден код фонового объединения страниц с пул-тегом MmCb, что подтверждает наличие механизма.

  • 0: объединение страниц разрешено, штатное состояние Windows.
  • 1: объединение отключено.
  • Отключение сокращает фоновую работу диспетчера памяти, но может увеличить расход RAM.

Отключение полезно, если объединение страниц создаёт заметную фоновую нагрузку и у системы есть свободная RAM. Обычно эта задача малоактивна, поэтому эффект очень небольшой. При ограниченном объёме памяти экономия RAM от объединения полезнее сбережённого процессорного времени.

Код чтения и фоновой задачи подтверждён в ntoskrnl.exe. Microsoft описывает объединение страниц и компромисс между процессорной работой и экономией RAM.

Значение задаёт порог освобождения выделенной памяти (decommit) для свободного блока кучи ядра. При большем пороге такие операции для крупных свободных блоков происходят реже.

В Windows 11 25H2 код чтения находится в ntoskrnl.exe, а применение параметра связано с функцией ядра RtlCreateHeap. В ntdll.dll соответствующего кода чтения для куч обычных процессов не найдено.

  • Значение по умолчанию в коде для кучи ядра: 0x1000 (4 KB).
  • 0x40000 (256 KB) является допустимым порогом для кучи ядра.
  • Исторические документы Microsoft описывали одноимённый user-mode сценарий старых версий Windows, поэтому его нельзя автоматически переносить на Windows 11 25H2.

Для обычных приложений пользы практически нет: их кучи не используют это значение. Параметр может менять частоту освобождения памяти только в куче ядра. Без измеренной проблемы именно с ней ожидаемый эффект очень мал.

Чтение в режиме ядра подтверждено в ntoskrnl.exe. Эффект для пользовательских процессов в 25H2 не подтверждён.

Параметр задаёт верхний предел для механизма записи изменённых страниц (modified page writer). В коде используются единицы по 256 страниц, то есть одна единица равна 1 MB.

Нормализация в Windows 11 25H2:

  • 0 преобразуется в 1 единицу, то есть 1 MB;
  • значения больше 0x40 ограничиваются 0x40;
  • максимальный эффективный предел равен 64 MB, или 16 384 страницам.

Механизм начинает активную запись примерно при достижении четверти заданного лимита. Увеличение лимита меняет момент запуска записи и объём накопленных изменённых страниц. Скорость самого диска от этого не растёт.

При большем лимите до начала активной записи накапливается больше изменённых страниц. Запись может запускаться реже, но объём ещё не сохранённых данных и размер следующей порции записи растут. Если конкретной проблемы с записью нет, оставьте значение по умолчанию. Эффективный предел ограничен 64 MB.

Код чтения, единицы измерения и ограничение диапазона подтверждены в ntoskrnl.exe. Одноимённый параметр из старых документов Microsoft о BitLocker относится к другой подсистеме; эти документы здесь не используются как источник.

EnableAsyncLazywrite управляет асинхронной отложенной записью Cache Manager. В коде 25H2 задано значение по умолчанию 2: этот режим уже включён.

Связанные значения той же подсистемы:

Value Default 25H2 Роль
EnableAsyncLazywrite 2 Общий async lazy-write mode
EnableAsyncLazywriteMulti 2 Соседний multi-volume режим
EnablePerVolumeLazyWriter 2 Per-volume lazy writer

0 отключает асинхронную отложенную запись. Для 1 требуется режим отдельного обработчика отложенной записи на каждом томе. 2 включает асинхронный режим без этого требования. Cache Manager перечитывает значения при работе с конфигурацией томов.

Явная запись 2 повторяет штатную конфигурацию Windows 11 25H2 и ничего дополнительно не улучшает. Настройка пригодна прежде всего для диагностики: значение 0 позволяет отключить работающий по умолчанию механизм.

Чтение наблюдалось в системной трассировке и подтверждено в ntoskrnl.exe. Значение по умолчанию 2 подтверждено кодом и независимым описанием параметров реестра, составленным по результатам обратного анализа.

Параметр задаёт расстояние в мегабайтах, после которого Cache Manager освобождает закэшированные представления, оставшиеся позади текущей позиции последовательного чтения.

Код чтения и применения параметра находится в ntoskrnl.exe и вызывается при отображении и чтении кэша. Параметр относится к последовательному чтению больших файлов; весь файловый кэш он не отключает.

  • 0 или значение больше 128 заменяется кодом на 8.
  • Рабочий диапазон: 1..128 MB.
  • Кодовый default: 8 MB.
  • Единицы Registry value именно MB, а не байты.

Параметр имеет смысл только для специализированных задач последовательного чтения больших файлов. При большем окне отображение кэша позади текущей позиции сохраняется дольше, при меньшем освобождается раньше. Для обычной работы подходит штатное значение 8 MB; польза ручной настройки обычно мала.

Код чтения, применения и ограничения диапазона подтверждён в ntoskrnl.exe. Современная публичная документация Microsoft для этого внутреннего параметра не найдена.

При 0 API описания топологии кэша возвращает единую запись для соответствующей структуры, охватывающей несколько групп процессоров. При 1 записи разделяются по группам процессоров.

Код чтения находится в ntoskrnl.exe. Параметр используется при обработке отношения RelationCache в KeQueryLogicalProcessorRelationship.

Меняется только описание топологии, которое возвращает системный API. Выделенные физические блоки памяти не разделяются, и вероятность нехватки непрерывного блока сама по себе не уменьшается.

  • 0: значение по умолчанию.
  • 1: разделять записи топологии по группам процессоров.
  • Практический эффект возможен прежде всего на системах с несколькими группами процессоров, обычно при более чем 64 логических процессорах.
  • На обычной одногрупповой системе эффект отсутствует.

Параметр нужен только программам, которые запрашивают топологию кэша на машине с несколькими группами процессоров. Работу кэша и выделение памяти он не меняет. Для обычного настольного компьютера пользы нет.

Код чтения и применения подтверждён в ntoskrnl.exe. Значение и назначение сверены с публичным описанием обратного анализа KiSplitLargeCaches.

Параметр Практическая оценка
DisablePagingExecutive Обычно даёт очень малую пользу, удерживая больше кода в RAM
DisablePageCombining Полезен при подтверждённой нагрузке фонового объединения страниц и большом запасе RAM
HeapDeCommitFreeBlockThreshold Действует только в ядре; для обычных приложений практической пользы нет
ModifiedWriteMaximum Меняет условия записи изменённых страниц; без выявленной проблемы оставьте штатное значение
EnableAsyncLazywrite Штатное значение 2 уже включает механизм; повторная запись ничего не улучшает
CacheUnmapBehindLengthInMB Настройка последовательного чтения; штатные 8 MB подходят для обычной работы
SplitLargeCaches Меняет описание топологии для нескольких групп процессоров; на обычной системе эффекта нет

Подтверждены указанные выше пути, типы, значения по умолчанию, код и момент чтения параметров, а также ограничения диапазонов. Результаты относятся к Windows 11 25H2 build 26200.9168. Поведение может отличаться при другом обновлении Windows, объёме RAM, типе накопителя или топологии CPU.

Как повторить динамическую часть наблюдений — см. Как проверить самостоятельно.

Для возврата верните штатные значения параметров или удалите необязательные записи. Часть значений применяется при следующей загрузке Windows.

Исследование и использованные в нём инструменты принадлежат разработчику BoosterX, поэтому у разработчика есть прямой интерес к результатам. Методика и границы применимости описаны в этой статье; выводы можно проверить по открытым данным и перечисленным ниже публичным источникам.

Утверждения о коде проверены статическим анализом системных компонентов Windows 11 25H2. Декомпилированный код, смещения, исходные трассировки и внутренние материалы не публикуются.

Публичные источники проверены: 2026-09-02.

  • 2026-09-20: добавлен дисклеймер о конфликте интересов и ссылка на самостоятельную проверку динамических наблюдений в методике.
  • 2026-09-02: первая публикация; подтверждены пути, defaults, clamps и код чтения параметров, добавлены границы практической пользы.