Согласно « Windows Internals, часть 1 » (7-е издание, версия Kindle):
Страницы в виртуальном адресном пространстве процесса либо свободны, зарезервированы, зафиксированы,или совместно используемый.
Фокусируясь только на страницах reserved
и committed
, первый тип описан в той же книге:
Резервирование памяти означает откладываниедиапазон смежных виртуальных адресов для возможного использования в будущем (например, в виде массива) при использовании незначительных системных ресурсов и последующей фиксации частей зарезервированного пространства по мере необходимости во время работы приложения.Или, если требования к размеру известны заранее, процесс может зарезервировать и зафиксировать в одном и том же вызове функции.
Как при резервировании, так и при фиксации первоначально вы получите записи в VAD (дескрипторы виртуальных адресов),но ни одна из этих операций не коснется структур PTE (записей таблицы страниц).Раньше стоимость PTE зарезервировалась до Windows 8.1, , но не больше .
Как описано выше, reserved
означает блокировку диапазона виртуальных адресов, НЕ блокируя физическую память или пространство файлов подкачкина уровне ОС.ОС не включает это в предел фиксации, поэтому, когда придет время выделять эту память, вы можете получить сюрприз.Важно отметить, что резервирование происходит с точки зрения адресного пространства процесса.Дело не в том, что зарезервирован какой-либо физический ресурс - нет отметки «нет вакансий» в пространстве ОЗУ или файлах страниц.
По аналогии с земельными участками что-то может не хватать: в качествеПлощадь земли окружена деревянными столбами, что позволяет другим теперь, когда земля занята.Но как насчет committed
?Это не может быть земля, на которой уже построены сооружения (например, дома), поскольку для них потребуются PTE, а там еще нет, поскольку мы ничего не получили.Только при прикосновении к committed
данным будут созданы PTE, что сделает страницы доступными для процесса.
Основная проблема заключается в том, что committed
память - по крайней мере, в ее начальном состоянии - функциональноочень похоже reserved
памяти.Это просто область, заблокированная в VAD.Попробуйте коснуться одного из адресов, и вы получите исключение нарушения доступа для reserved
адреса:
Попытка доступа к свободной или зарезервированной памяти приводит к исключению нарушения доступа, поскольку страница нене сопоставлено с любым хранилищем, которое может разрешить ссылку
... и начальную ошибку страницы для единицы committed
(сразу после которой создаются необходимые записи PTE).
Возвращаясь к аналогии с землей, после постройки домов этот участок земли все еще остается committed
.Тем не менее, это немного странно, так как это было еще committed
, когда там была оригинальная трава, до того, как была выкопана самая первая лопата, чтобы начать строительство.Это напоминало то же состояние, что и состояние зарезервированного патча.Возможно, было бы лучше думать об этом как о местности, подходящей для строительства.Например, у вас есть разрешение на строительство (хотя вы никогда не сможете построить столько же, сколько стену на этом участке земли).
Каковы причины использования одного типа памяти по сравнению с другим?По крайней мере, один: ОС гарантирует, что будет место для выделения committed
памяти, если это когда-либо произойдет в будущем, но не гарантирует ничего для reserved
памяти, кроме блокирования диапазона адресного пространства этого процесса.Единственный недостаток памяти committed
заключается в том, что может потребоваться увеличить размер одного или нескольких файлов подкачки, чтобы можно было сделать так, чтобы предел фиксации учитывал недавно выделенный блок, поэтому запрашивающая сторона требует использования части всехданные в будущем, ОС может предоставить доступ к ним.
Я не могу действительно думать, как аналогия земли может захватить эту деталь "гарантии".В конце концов, патч reserved
также существовал физически, покрытый той же травой, что и патч committed
в своем первозданном состоянии.
Стек - это другой сценарий, в котором память reserved
и committed
используется вместе:
Когда создается поток, диспетчер памяти автоматически резервирует заранее определенный объем виртуальной памяти, который по умолчаниюсоставляет 1 МБ. [...] Хотя 1 МБ зарезервировано, только первая страница стека будет зафиксирована [...] вместе с защитной страницей.Когда стек потока становится достаточно большим, чтобы прикоснуться к странице защиты, возникает исключение, вызывающее попытку выделить другую защиту.Благодаря этому механизму пользовательский стек не сразу потребляет все 1 МБ выделенной памяти, а вместо этого растет с ростом спроса. "
Здесь есть ответ , который объясняет, почему одинхотел бы использовать reserved
память, а не committed
. Он включает в себя хранение непрерывно расширяющихся данных - что на самом деле является описанной выше моделью стека - и наличие определенных абсолютных диапазонов адресов, доступных при необходимости (хотя я не уверен, почемухочу сделать это в процессе).
Хорошо, что я на самом деле спрашиваю?
- Что было бы хорошей аналогией для концепции
reserved
/ committed
? - Есть ли какие-либо другие причины, помимо указанных выше, которые требовали бы использования памяти
reserved
? Существуют ли какие-либо интересные случаи использования, когда обращение к памяти reserved
- это разумный ход?