Глубины памяти Windows (часть 2) — жизнь физической страницы: пять списков и правда о файле подкачки
· Go Komura · Windows, Управление памятью, Файл подкачки, Working Set, Standby, RAMMap, Мониторинг производительности
В предыдущей статье «Глубины памяти Windows (часть 1) — момент, когда виртуальный адрес становится физической RAM» мы проследили до момента, когда обработчик ошибки страницы выделяет физическую страницу при первом обращении к уже зарезервированной (Commit) странице. Куда же эта физическая страница уходит после удаления из Working Set?
Часто объяснение сводят к «её вытесняют в файл подкачки», но до и после этого есть несколько состояний. Неизменённая страница может перейти в Standby, сохранив содержимое. Изменённая страница сначала ждёт обратной записи на Modified. При повторном использовании она может пройти через Free или Zeroed, а если снова нужно то же содержимое, она может вернуться из Standby мягкой ошибкой (soft fault).
Эта статья берёт базу PFN как ось и прослеживает, как одна физическая страница движется через Active, Modified, Standby, Free и Zeroed. Чтение самих чисел опирается на вводную статью «What Does Windows’ “Memory Usage” Actually Mean? — Correctly Reading Working Set, Private Bytes, Commit, and the Page File».
«Глубины памяти Windows» — все 3 части
- Часть 1: виртуальные адреса и ошибки страниц
Прослеживаем, когда зарезервированная виртуальная страница получает физическую RAM. - Часть 2 (эта статья): жизнь физической страницы
Прослеживаем переходы состояний страницы, покинувшей Working Set, и роль файла подкачки. - Часть 3: объекты секций и копирование при записи
Прослеживаем механизм, которым DLL, отображения файлов и общая память разделяют физические страницы.
Вопрос, на который отвечает часть 2, всего один.
Физическая страница, покинувшая Working Set, исчезает, уходит на диск или остаётся в RAM?
Предполагаемые читатели — разработчики и эксплуатация, которые хотят понять с механизма, почему Available высок и Standby тоже высок, поведение после обрезки Working Set, настройку файла подкачки и сжатие памяти. Требования к среде — Windows 10/11 или актуальный Windows Server, а нужный фон — основы Working Set, Commit и мягких/жёстких ошибок. Сложность средняя; мы используем внутренние термины вроде PFN и списков страниц, но сосредотачиваемся на том, что можно наблюдать RAMMap и PerfMon без отладчика ядра.
1. Сначала вывод
Для начала — пункты, которые легко прочитать неверно.
- Страница, покинувшая Working Set, не обязательно сразу исчезает.
Чистая страница остаётся на Standby и может вернуться без чтения диска, если снова нужно то же содержимое. - Изменённую страницу нельзя сразу переиспользовать.
Частное содержимое становится повторно используемым после возможности записи в файл подкачки; отображённый файл — после возможности записи в соответствующий файл; и так далее. - Available включает Standby.
Standby — это кэш, который ещё держит содержимое, и одновременно кандидат на повторное использование, который можно сразу забрать при необходимости.1 - Запись в файл подкачки — не пакетная работа, которая начинается только после полного исчерпания RAM.
Она идёт в фоне в зависимости от списка Modified и давления памяти.23 - Файл подкачки — не просто «медленная RAM».
Он расширяет Commit Limit, становится backing store изменённых частных страниц и поддерживает дампы сбоя.4 - Отключение файла подкачки не чинит утечку памяти.
Commit Limit падает, и можно потерять варианты эффективного использования RAM и возможность снимать дампы.
Одним предложением: прежде чем отбросить страницу, Windows проверяет вероятность, что она снова понадобится, и есть ли место, откуда восстановить исходное содержимое.
2. База PFN — главная книга на стороне физической RAM
PTE из части 1 представляла перевод виртуальной страницы в физическую. Главная книга, которая смотрит на это со стороны физической страницы и следит, «для чего сейчас используется эта страница RAM», — база PFN. PFN значит Page Frame Number: физическая RAM, пронумерованная по страницам.
Запись PFN концептуально отслеживает следующую информацию.
- Текущее состояние физической страницы
- Счётчик ссылок и счётчик совместного использования
- Соответствующую PTE
- Изменена ли она
- К какому списку страниц принадлежит
- Сведения, связанные с узлом NUMA и приоритетом
В WinDbg !pfn показывает сведения о конкретном PFN, а !memusage — использование физической памяти и итоги по каждому списку страниц.56 Чтобы наблюдать тот же мир без отладчика ядра, доступен Sysinternals RAMMap. Use Counts показывает назначение и список страниц, Priority Summary — Standby по приоритету, Physical Pages — использование по страницам.7
3. Связать пять состояний на одной схеме
Эта статья рассматривает поток физической страницы как следующие пять состояний в упрощении. Строго говоря, у актуального Windows есть состояния и списки, не нарисованные здесь — Standby по приоритету, Transition, Bad и другие — а Active означает не столько единый «список Active», сколько состояние ссылки из Working Set или подобного через действительную PTE. Даже так эта схема более чем полезна для чтения поведения памяти приложения.
Рис. 1: Страница, на которую ссылаются в Working Set, переходит в Standby, если чистая, и в Modified, если грязная. То же содержимое может вернуться; другое назначение либо сразу переиспользует страницу, либо идёт через Free/Zeroed при выделении, требующем нулей.
Исходник Mermaid рисунка 1
```text flowchart LR zeroed["Zeroed\nОбнулена"] -->|Первый Touch| active["Active / Valid\nСсылается Working Set"] active -->|Трим clean| standby["Standby\nКандидат на повтор с содержимым"] active -->|Трим dirty| modified["Modified\nЖдёт обратной записи"] modified -->|Запись завершена| standby standby -->|Возврат soft fault| active standby -->|Сбросить старую идентичность| free["Free\nНе обнулена"] standby -->|Прямо под другую цель| active free -->|Для выделения с нулями| zeroed ```Самое важное в этой схеме: выйти из Working Set и потерять содержимое — не одно и то же. Кроме того, когда страницу Standby забирают под другую цель, она не обязательно проходит Free/Zeroed по порядку. Если её отдадут пользовательскому режиму как новую частную demand-zero страницу, старое содержимое нужно стереть; если всю страницу перезапишут, как при чтении файла, идентичность Standby можно снять и страницу сразу переиспользовать.
4. Active / Valid — физическая страница, на которую можно ссылаться сейчас
Страница Active/Valid ссылается из Working Set процесса или из системного пространства через действительную PTE. ЦП достигает её обычным преобразованием адресов, поэтому сам доступ не требует ошибки страницы.
Однако нет гарантии, что страница останется Active. Чтобы поддерживать доступную память, диспетчер памяти смотрит на размер Working Set, недавность использования страницы и подобное и обрезает страницы-кандидаты. Документация Microsoft по Working Set также объясняет, что диспетчер памяти удаляет страницы из Working Set, чтобы создать доступную память.8
4.1. Обрезка — не освобождение
То, что в основном меняет обрезка Working Set, — резидентное состояние «сразу можно сослаться через действительную PTE». Различайте следующие четыре как отдельные события.
- Убрать из Working Set
- Освободить Commit
- Освободить диапазон виртуальных адресов
- Потерять исходные данные
Запуск EmptyWorkingSet или «Trim Working Set» инструмента не заменяет VirtualFree или освобождение кучи. Если снова коснуться той же страницы, она вернётся мягкой ошибкой из Standby или жёсткой ошибкой из backing store. Поэтому «я уменьшил Working Set» не значит «я починил утечку».
5. Чистая страница идёт в Standby
Даже после удаления страницы из Working Set, если содержимое всё ещё совпадает с исходным файлом или у неё уже есть безопасный backing store, её можно поместить в Standby. Типичные примеры:
- Неизменённый код EXE/DLL
- Неизменённый файл, отображённый в память
- Частная страница, уже записанная обратно
- Данные, оставшиеся в файловом кэше
Страница Standby сохраняет соответствие прежнему содержимому. Когда тот же процесс или другой нуждается в этом содержимом, если страница ещё не переиспользована, достаточно мягкой ошибки, которая заново подключает PTE.
С другой стороны, если другое выделение нуждается в физической странице, старую идентичность Standby можно отбросить и страницу переиспользовать. Если место повторного использования — частная страница пользовательского режима, требующая обнуления, готовят страницу Zeroed; если всю страницу перезапишут содержимым файла и т. п., её можно сразу переназначить без обнуления.
Эта двусторонность и есть причина, почему Standby — и кэш, и Available.
5.1. Почему Available включает Standby
MEMORYSTATUSEX.ullAvailPhys представляет физическую память, которую можно сразу переиспользовать без записи на диск, и это сумма Standby, Free и Zeroed.1
flowchart LR
accTitle: Три списка страниц, из которых состоит Available
accDescr: Доступная физическая память — сумма Standby, Free и Zeroed; страницы Active, на которые ссылаются в Working Set, не входят
standby["Standby(кандидат на повторное использование с сохранённым содержимым)"] --> avail["Available(доступная физическая память)"]
free["Free(не используется, не обнулена)"] --> avail
zeroed["Zeroed(не используется и обнулена)"] --> avail
active["Active(ссылаются в Working Set)"] -.->|Не входит| avail
Рис. 2: Available — сумма Standby, Free и Zeroed. Standby, которая ещё держит содержимое, тоже считается «доступной».
Поэтому нет противоречия, когда диспетчер задач показывает «Free мало, зато Cached/Standby много, а Available достаточно». Windows не оставляет свободную RAM простой; она оставляет недавно использованные файлы и код на Standby, чтобы при необходимости быстро переиспользовать их как кэш, и забирает их, если нужна другая цель.
Не заключайте «Free мало, значит сразу нехватка памяти»; смотрите вместе Available, Commit, жёсткие ошибки и задержку обработки.
6. Грязная страница ждёт на Modified
Когда приложение пишет в страницу, это содержимое больше не совпадает с исходным backing store. Перезаписать эту грязную страницу под другую цель — значит потерять данные. Поэтому изменённая страница, удалённая из Working Set, ждёт обратной записи на Modified.
Место обратной записи зависит от вида страницы.
| Вид страницы | Типичное место обратной записи |
|---|---|
| Частная закоммиченная страница | Файл подкачки |
| Записываемый отображённый файл | Соответствующий файл данных |
| Грязные данные в файловом кэше | Соответствующий файл данных |
| Чистая страница EXE/DLL | Обратная запись не нужна. Можно перечитать из исходного образа |
Документация Microsoft по файлу подкачки также объясняет, что .dll, .exe и обычные файлы, уже существующие на диске, не нужно снова писать в файл подкачки, а изменённые данные без исходной дисковой копии становятся кандидатами в файл подкачки.2
6.1. Modified Page Writer
Modified Page Writer — системный рабочий, который сканирует грязные страницы с backing в файле подкачки, которые отслеживает диспетчер памяти, и записывает их в файл подкачки.3 На стороне отображённых файлов есть пути вроде Mapped Page Writer, которые совместно с файловой системой и диспетчером кэша пишут обратно в соответствующий файл.
Важно, что запись — не схема «ничего не делать, пока RAM не станет 0 байт». Windows в фоне готовит страницы, которые можно будет переиспользовать, в зависимости от списка Modified, Available, состояния файла подкачки и подобного. Когда обратная запись закончена и других действительных ссылок нет, страница идёт в Standby с сохранённым содержимым.
flowchart TB
accTitle: Пути обратной записи изменённой страницы
accDescr: Изменённая страница, покинувшая Working Set, ждёт на списке Modified; для частной страницы при настроенном файле подкачки Modified Page Writer пишет её в файл подкачки, а страница отображённого файла записывается Mapped Page Writer или подобным в соответствующий файл данных, затем идёт в Standby с сохранённым содержимым
dirty["Изменённая страница, покинувшая Working Set"] --> modified["Ожидание обратной записи на списке Modified"]
modified -->|"Частная страница(файл подкачки настроен)"| mpw["Modified Page Writer пишет в файл подкачки"]
modified -->|Страница отображённого файла| mapped["Mapped Page Writer или подобный пишет в соответствующий файл"]
mpw --> standby["После обратной записи в Standby с сохранённым содержимым"]
mapped --> standby
Рис. 3: Место обратной записи определяется видом страницы, и оба пути идут в фоне. На системе с отключённым файлом подкачки у частной страницы нет места обратной записи, поэтому изменённые частные страницы остаются в RAM.
6.2. Отделить вывод страниц от ввода-вывода именно файла подкачки
Следующие счётчики легко перепутать; уточните, что они значат.
Memory\\Page Writes/sec: число операций записи подкачки, выданных чтобы освободить физическую памятьMemory\\Pages Output/sec: число страниц, записанных на диск этими записямиMemory\\Page Reads/sec: число операций чтения с диска, выданных чтобы разрешить жёсткие ошибкиMemory\\Pages Input/sec: число страниц, вошедших в RAM из этих чтений
Заметьте, что Page Writes/sec и Pages Output/sec — не счётчики, которые выделяют только файл подкачки. Они могут расти и на пути обратной записи грязных страниц с файловым backing, например отображённых файлов. Наоборот, сторона ввода тоже не различает файл подкачки, DLL, EXE и файлы, отображённые в память.2 Чтобы выделить ввод-вывод именно pagefile.sys, не оценивайте только по этим четырём счётчикам; запишите File I/O и Disk I/O через ETW/WPA и подтвердите целевой файл, сопоставив FileObject и FileName.9
Ещё момент: сначала записать в файл подкачки не значит сразу прочитать обратно с диска. Если к странице не обращаются, записанную обратно страницу можно убрать из RAM и отдать физическую память чаще используемым страницам.
7. Разница между Standby, Free и Zeroed
7.1. Standby
Состояние, которое ещё держит соответствие прежнему содержимому.
- Если нужно то же содержимое, может вернуться мягкой ошибкой
- Если нужна другая цель, старую идентичность можно отбросить и переиспользовать
- Есть списки Standby по приоритету
7.2. Free
Действительное соответствие прежнему содержимому потеряно, и страницу можно выделить. Однако старый битовый узор может ещё остаться в странице. Отдать её пользовательскому режиму как есть — риск утечки сведений предыдущего процесса.
7.3. Zeroed
Содержимое — нули, и страницу можно безопасно отдать как новую страницу пользовательского режима. Ошибка demand-zero из части 1 была типичным случаем получения доступной страницы Zeroed и привязки к PTE. Подготовка из Free в Zeroed идёт по спросу и состоянию системы.
Поэтому хотя «Free» и «Zeroed» обе выглядят неиспользуемыми, они различаются готовностью, связанной с безопасностью.
8. Хранилище сжатия памяти — ещё одно место назначения внутри RAM
Начиная с Windows 10, при давлении памяти диспетчер памяти в некоторых случаях может сжимать редко используемые страницы в RAM вместо немедленной записи на диск. Это собрание сжатых страниц — хранилище сжатия.
В ранней реализации Windows 10 хранилище сжатия учитывалось внутри Working Set процесса System, но в актуальном Windows оно появляется в списках процессов отладчика как отдельный процесс Memory Compression. Поэтому, исследуя текущий объём сжатия, не следуйте только Working Set процесса System. Сама цель — держать больше приложений в физической памяти и снижать дисковый ввод-вывод — не изменилась.1011
Однако имейте в виду следующее.
- Сжатые страницы всё равно используют RAM
- Сжатие и распаковка имеют стоимость ЦП
- Сжатие не стирает обещание Commit
- Нет фиксированного порядка «всегда сжимать, затем файл подкачки»
- Политика меняется с видом страницы, давлением и историей доступа
«Используется (сжато)» диспетчера задач не значит, что сжатие полностью опустошило физическую память. Хранилище сжатия — не функция, которая делает файл подкачки ненужным; оно добавляет вариант, который тратит ЦП, чтобы снизить ввод-вывод между RAM и хранилищем.
9. Настоящая роль файла подкачки
У файла подкачки как минимум три роли.
flowchart LR
accTitle: Три роли файла подкачки
accDescr: Файл подкачки расширяет Commit Limit, становится backing store редко используемых изменённых частных страниц и становится приёмником дампа сбоя системы
pagefile["Файл подкачки"] --> limit["Расширить Commit Limit(запас у потолка)"]
pagefile --> backing["Backing store изменённых частных страниц"]
pagefile --> dump["Приёмник дампа сбоя системы"]
Рис. 4: Роль файла подкачки — не только «медленная RAM». Даже при использовании 0 он всё ещё поддерживает потолок и дампы.
9.1. Расширить Commit Limit
Commit Limit системы примерно определяется RAM плюс сумма всех файлов подкачки. Без файла подкачки Commit Limit падает до уровня чуть меньше установленной RAM. Когда Commit Total достигает потолка, новый Commit не удаётся и может привести к аварийному завершению приложения или проблемам системы.4
Это другое дело, чем «сколько ГБ сейчас записано в pagefile.sys». Файл подкачки — ещё и запас у потолка, который поддерживает обещание Commit.
9.2. Поддерживать изменённые частные страницы
Если редко используемые изменённые частные страницы имеют backing в файле подкачки, эти физические страницы можно убрать из RAM и отдать часто используемому коду и данным.4 Отключение файла подкачки уменьшает возможность убирать такие страницы из RAM. Нельзя просто сказать «быстро, потому что нет выгрузки».
9.3. Поддерживать дампы сбоя системы
Чтобы получить Memory.dmp при сбое системы, нужен файл подкачки или выделенный файл дампа, способный поддержать выбранный способ дампа.2 Полный дамп памяти, дамп памяти ядра и автоматический дамп памяти различаются по требуемому объёму.
В среде, где расследуют сбои, удаление файла подкачки только ради места может означать, что доказательств нет, когда они нужнее всего. О способах сбора см. также «Введение в сбор дампов сбоев Windows — WER/ProcDump/WinDbg».
10. Правильный размер не единообразен
Размер файла подкачки не следует решать только по фиксированной формуле вроде «1,5 × RAM». Microsoft объясняет, что подходящий размер различается по системам по следующим двум пунктам и не обобщается.2
- Пиковый System Commit Charge
- Нужный дамп сбоя системы
На практике думайте в следующем порядке.
10.1. Начать с системного управления как базы
По умолчанию Windows — системное управление. Он растёт и сжимается в зависимости от установленной RAM, спроса на Commit, требований к дампу сбоя и подобного. Без особого ограничения или результата измерения начинать отсюда безопасно.
10.2. Измерить пиковый Commit под представительной нагрузкой
Собирайте следующие счётчики в PerfMon в течение долгого периода.
Memory\\Committed BytesMemory\\Commit LimitMemory\\% Committed Bytes In UseMemory\\Modified Page List BytesPaging File(*)\\% UsageMemory\\Available MBytesMemory\\Page Reads/secMemory\\Page Writes/sec
Включите в период сбора фактические пики — месячную обработку, резервные копии, сборки, нескольких пользователей сразу и так далее.
Высокий процент использования файла подкачки сам по себе не доказывает проблему производительности хранилища. Однако прилипание к потолку — предупреждение о недостаточной ёмкости. Смотрите вместе, приближается ли Commit к потолку, ждёт ли много Modified и насыщен ли диск.2
10.3. Сначала решить требование к дампу
Решите, нужен ли полный дамп памяти, достаточно ли дампа памяти ядра или вы используете выделенный файл дампа. Если меняете на фиксированный размер, он должен удовлетворять не только пиковый Commit, но и требование к дампу.
11. Посмотреть своими глазами
11.1. Смотреть списки страниц в RAMMap
Запустите RAMMap от имени администратора и сначала откройте Use Counts.7 Элементы для просмотра следующие.
- Active
- Standby
- Modified
- Modified no write
- Free
- Zeroed
Priority Summary позволяет подтвердить, что Standby разбит по приоритету. Processes показывает Working Set каждого процесса; File Summary и File Details позволяют следить за файловыми данными в RAM.
Для пробы один раз прочитайте довольно большой локальный файл, завершите чтение и затем Refresh. Страницы этого файла могут остаться в File Summary или на стороне Standby. Повторное чтение того же файла может восстановить ещё не переиспользованные страницы без дискового ввода-вывода или с малым вводом-выводом. Результаты зависят от давления памяти, антивируса и размера файла, поэтому смотрите направление перехода состояния, а не один набор чисел.
Заметьте, что меню Empty в RAMMap искусственно меняет состояние системы. Не очищайте Standby как улучшение производительности в продакшене; используйте только в изолированной тестовой среде.
11.2. Разделить Commit и Touch с Testlimit
Testlimit — инструмент Sysinternals, который имитирует нехватку ресурсов памяти, дескрипторов, процессов, потоков и подобного. Сначала выполните следующее против имеющегося двоичного файла и подтвердите отображаемые версию и использование.
.\\testlimit64.exe -?
Далее — Testlimit v5.24. В официальном синтаксисе v5.24 -m [MB] выделяет указанный объём памяти, -d [MB] выделяет и Touch, -e [seconds] — интервал выделения, -c [count] — число выделений. Указывайте -c последним. Если локально видно иначе, предпочитайте то использование.12
Затем попробуйте понемногу на одноразовой ВМ.
# -m 64: выделить 64 МиБ, -e 1: интервал 1 секунда, -c 8: остановиться после 8 раз
.\\testlimit64.exe -m 64 -e 1 -c 8
# То же число и интервал, с -d чтобы каждая область получила Touch
.\\testlimit64.exe -d 64 -e 1 -c 8
Пока выполняется, одновременно записывайте следующее.
- «Выделено X/Y» диспетчера задач
- Active, Modified и Standby в RAMMap
Memory\\Committed BytesMemory\\Commit LimitMemory\\Available MBytesMemory\\Modified Page List Bytes
Если вы действительно воспроизводите исчерпание Commit, не делайте это на хост-ПК; увеличивайте число по шагам на ВМ со снимком. Запуск, который автоматически выделяет до потолка, может заморозить экран, аварийно завершить процессы и потерять журналы. Цель не дестабилизировать ОС; цель — наблюдать, что при приближении к Commit Limit новый Commit не удаётся.
12. Четыре неверных прочтения, которых стоит избегать на практике
12.1. «Standby высок, значит утечка памяти»
Standby — повторно используемый кэш и входит в Available. Утечку судите по тому, продолжают ли расти базовая линия частного Commit процесса и разбивка выделений даже после окончания нагрузки.
12.2. «Урезать Working Set починит утечку»
Обрезка меняет только резидентность; она не освобождает Commit или виртуальное выделение. При повторном доступе страница возвращается ошибкой.
12.3. «Использование файла подкачки 0, значит он не нужен»
Файл подкачки поддерживает не только текущий объём записи, но и Commit Limit и дампы сбоя. Решать удаление только по повседневном использованию — потерять запас на пике и доказательства в момент отказа.
12.4. «Сначала сжатие памяти, затем всегда файл подкачки»
Сжатие — не фиксированный последовательный конвейер. Windows выбирает динамически в зависимости от вида страницы, эффективности сжатия, нагрузки ЦП, давления памяти и наличия backing store.
13. Итог
- База PFN — главная книга, которая отслеживает владение, ссылки, изменение и состояние списка физической страницы.
- Чистая страница, покинувшая Working Set, остаётся на Standby и может вернуться мягкой ошибкой, если нужно то же содержимое.8
- Грязная страница ждёт на Modified и записывается в файл подкачки, если частная, или в соответствующий файл, если отображённая.3
- Available — сумма Standby, Free и Zeroed; большой Standby сам по себе не нехватка памяти.1
- Сжатие памяти сжимает страницы в RAM, чтобы снизить ввод-вывод, но не стирает роли Commit и файла подкачки.10
- Файл подкачки поддерживает Commit Limit, изменённые частные страницы и дампы сбоя системы.42
- Подходящий размер определяется пиковым Commit и требованиями к дампу; его нельзя решить единым множителем.2
- Обрезка Working Set и очистка Standby — не исправление утечки памяти.
Продолжение в части 3, «Объекты секций и копирование при записи: чем на самом деле являются DLL и отображения файлов».
Мы проследим, почему файловые страницы и DLL, оставшиеся на Standby, видны нескольким процессам как одна и та же физическая страница.
Похожие статьи
- Глубины памяти Windows (часть 1) — момент, когда виртуальный адрес становится физической RAM
- What Does Windows’ “Memory Usage” Actually Mean? — Correctly Reading Working Set, Private Bytes, Commit, and the Page File
- The Depths of Windows I/O (Part 4) — Cache Manager: When Does Your WriteFile Actually Reach the Disk?
- Введение в сбор дампов сбоев Windows — WER/ProcDump/WinDbg
- Process Explorer / Handle / VMMap in Practice — Chasing Hangs, Leaks, and “File in Use” from the State Right Now
Смежные области консультирования
KomuraSoft LLC занимается расследованиями давления памяти приложений Windows, исчерпания Commit, подкачки, роста Working Set и проектирования сбора дампов сбоя.
- Разработка Windows-приложений
- Исследование дефектов и анализ первопричин
- Использование и миграция существующих активов
- Связаться с нами
Справочные ссылки
-
Microsoft Learn, MEMORYSTATUSEX structure. О том, что
ullAvailPhys— физическая память, которую можно сразу переиспользовать без записи на диск, и что это сумма списков Standby, Free и Zeroed. ↩ ↩2 ↩3 -
Microsoft Learn, How to determine the appropriate page file size for 64-bit versions of Windows. О том, что подходящий размер зависит от пикового Commit и требований к дампу сбоя и не обобщается; список Modified, использование файла подкачки, связанные счётчики и системно управляемый файл подкачки. ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8
-
Microsoft Learn, Data corruption on IO write. О том, что Modified Page Writer — системный рабочий диспетчера памяти, который сканирует грязные страницы с backing в файле подкачки и записывает их. ↩ ↩2 ↩3
-
Microsoft Learn, Introduction to page files. О том, что файл подкачки убирает редко используемые изменённые страницы из RAM, расширяет Commit Limit и поддерживает дампы сбоя системы. ↩ ↩2 ↩3 ↩4
-
Microsoft Learn, !pfn (WinDbg). О том, что можно показать состояние, ссылки, адрес PTE и другое указанной записи PFN. ↩
-
Microsoft Learn, !memusage (WinDbg). О том, что можно суммировать использование физической памяти и состояния страниц вроде Zeroed, Free, Standby, Modified и Active. ↩
-
Microsoft Learn, RAMMap - Sysinternals. О том, что Use Counts, Processes, Priority Summary, Physical Pages, File Summary и File Details в RAMMap показывают назначение физической памяти и списки страниц. ↩ ↩2
-
Microsoft Learn, Working Set. О том, что диспетчер памяти обрезает Working Set, чтобы создать доступную память, и что страницы, оставшиеся в Transition или в Working Set другого процесса, можно разрешить мягкой ошибкой. ↩ ↩2
-
Microsoft Learn, FileIo_Name class. О том, что события File I/O ETW имеют FileObject и FileName, так что FileObject можно сопоставить с событиями Disk I/O, чтобы выделить ввод-вывод целевого файла. ↩
-
Windows Insider Blog, Announcing Windows 10 Insider Preview Build 10525. О ранней реализации хранилища сжатия Windows 10, которая помещала собрание сжатых страниц в RAM в Working Set процесса System и снижала записи на диск. ↩ ↩2
-
Microsoft Learn, Find Process ID (PID) in Windows. О примерах списков процессов актуальных Debugging Tools for Windows, где под System показан процесс
Memory Compressionс отдельным PID. ↩ -
Microsoft Learn, Testlimit - Sysinternals. Об официальном синтаксисе Testlimit v5.24, где
-mвыделяет память,-dвыделяет и Touch,-e— интервал выделения,-c— число выделений, причём-cуказывают последним. ↩
Похожие статьи
Недавние статьи с теми же тегами помогут подробнее изучить близкие темы.
Глубины памяти Windows (часть 1) — Миг, когда виртуальный адрес становится физической RAM: page fault от начала до конца
Статья связывает VirtualAlloc, VAD, таблицы страниц, TLB, demand-zero и жёсткие ошибки и объясняет миг, когда виртуальному адресу назнача...
Глубины памяти Windows (часть 3) — объекты секций и копирование при записи: чем на самом деле являются DLL и проекции файлов
Статья связывает объекты секций, проекции образа и данных, общий кэш и копирование при записи, чтобы объяснить, как DLL и общая память де...
Глубины виртуализации Windows (часть 3) — виртуальные машины, которые загружаются за секунды: почему WSL2, Windows Sandbox и контейнеры такие лёгкие
Почему WSL2 и Windows Sandbox стартуют за секунды и ощущаются такими лёгкими? Статья разбирает механизмы — от динамического базового обра...
Глубины виртуализации Windows (часть 2) — память, которую не видит даже ядро: как работают VBS, HVCI и Credential Guard
На чистой установке на совместимом оборудовании VBS включена по умолчанию и с помощью гипервизора и SLAT создаёт изоляцию сильнее ядра. С...
Глубины виртуализации Windows (часть 1) — где на самом деле работает ваш Windows? Гипервизор и разделы
Когда включают Hyper-V, сам хостовый Windows работает поверх гипервизора как корневой раздел. Статья разбирает основы виртуализации через...
Связанные темы
Эти страницы показывают тему статьи в более широком контексте услуг и решений.
Технические темы Windows
Раздел о разработке Windows, расследовании сбоев и использовании существующих активов.
Услуги по этой теме
Статья напрямую связана со следующими услугами.
Разработка приложений для Windows
Бизнес-приложения, интеграция оборудования и средства связи — от требований до разработки.
Частые вопросы
Вопросы, которые часто возникают при консультациях по теме статьи.
- Страница записывается в файл подкачки сразу после выхода из Working Set?
- Нет. Неизменённая страница переходит в Standby с сохранённым содержимым и становится кэшем, который можно сразу переиспользовать. Изменённая страница переходит в Modified и после обратной записи в файл подкачки или соответствующий файл по мере необходимости переходит в повторно используемое состояние вроде Standby.
- Включает ли «Доступно» диспетчера задач память Standby?
- Да. Доступная физическая память, которую сообщает Windows, — сумма Standby, Free и Zeroed. Standby ещё держит старое содержимое, но поскольку её можно сразу отдать под другую цель, она считается доступной памятью.
- Запись в файл подкачки начинается только после полного исчерпания RAM?
- Нет. Windows в фоне записывает редко используемые изменённые страницы в зависимости от списка Modified и состояния доступной памяти. Это не простой механизм, который ждёт абсолютного исчерпания и затем вытесняет всё разом.
- Отключение файла подкачки ускоряет Windows?
- В общем случае так утверждать нельзя. Отключение снижает Commit Limit, затрудняет удаление редко используемых изменённых страниц из RAM и влияет на дампы сбоя системы. Обычно его оставляют системно управляемым и решают, измеряя пиковый Commit и требования к дампу.
- Если есть сжатие памяти, файл подкачки не нужен?
- Он не становится ненужным. Хранилище сжатия сжимает страницы в RAM, чтобы снизить ввод-вывод, но сжатые страницы всё равно занимают физическую память и не заменяют гарантию Commit. Выбор между сжатием и выгрузкой — динамическая политика диспетчера памяти.
Об авторе
Страница с профилем автора статьи.
Го Комура
Представитель KomuraSoft LLC
Специализируется на разработке программного обеспечения для Windows, техническом консалтинге и расследовании сбоев, особенно в проектах с унаследованными системами и трудно воспроизводимыми ошибками.