Зафиксировано против зарезервированной памяти - PullRequest
0 голосов
/ 20 апреля 2019

Согласно « 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. Он включает в себя хранение непрерывно расширяющихся данных - что на самом деле является описанной выше моделью стека - и наличие определенных абсолютных диапазонов адресов, доступных при необходимости (хотя я не уверен, почемухочу сделать это в процессе).

Хорошо, что я на самом деле спрашиваю?

  1. Что было бы хорошей аналогией для концепции reserved / committed?
  2. Есть ли какие-либо другие причины, помимо указанных выше, которые требовали бы использования памяти reserved? Существуют ли какие-либо интересные случаи использования, когда обращение к памяти reserved - это разумный ход?

1 Ответ

1 голос
/ 21 апреля 2019

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

Если вы посмотрите на преобразование логической памяти, для страницы есть только два состояния.Используя вашу терминологию, они БЕСПЛАТНЫЕ и ОБЯЗАТЕЛЬНЫЕ.Свободная страница - это страница, у которой нет сопоставления с физическим фреймом страницы, а страница COMMITTED имеет такое сопоставление.

В системе виртуальной памяти операционная система должна сохранять копию адресного пространства во вторичном хранилище.,Как это сделать, зависит от операционной системы.Как правило, процесс будет отображаться в несколько разных файлов для вторичного хранения.Операционная система делит адресное пространство на то, что обычно называется РАЗДЕЛОМ.

Например, код и данные только для чтения могут храниться виртуально как один или несколько РАЗДЕЛОВ в исполняемом файле.Код и статические данные в разделяемых библиотеках могут находиться в разных разделах, которые выгружаются в разделяемые библиотеки.У вас может быть карта общего ресурса, поданная процессу, который использует память, к которой могут обращаться несколько процессов, образующих другой раздел.Большая часть данных для чтения / записи, вероятно, находится в файле страницы в одном или нескольких разделах.То, как операционная система отслеживает, где она фактически хранит каждый раздел данных, зависит от системы.

Для окон это дает определение одному из ваших терминов: Sharable.Раздел с общим доступом - это раздел, в котором диапазон адресов может быть сопоставлен с разными процессами по разным (или, возможно, одинаковым) логическим адресам.

Тогда ваш последний термин резервируется.Если вы посмотрите документацию по функции Windoze VirtualAlloc,

https://docs.microsoft.com/en-us/windows/desktop/api/memoryapi/nf-memoryapi-virtualalloc

, вы увидите, что (среди ваших вариантов) вы можете ЗАБРОНИРОВАТЬ или УСТАВИТЬ.Если вы резервируете, вы создаете раздел VIRTUAL MEMORY, который не имеет привязки к физической памяти.

Эта модель RESERVE / COMMIT зависит от Windows (хотя другие операционные системы могут делать то же самое).Вероятной причиной было сэкономить место на диске.Когда разрабатывался Windoze NT, все еще использовались 600-мегабайтные диски размером со стиральную машину.

В наши дни 64-битные адресные пространства эта система хорошо работала (как вы говорите) для расширения данных.Теоретически, обработчик исключений для переполнения стека может просто расширить стек.Резервирование 4 ГБ памяти занимает не больше ресурсов, чем резервирование одной страницы (что было бы невозможно в 32-битной системе - см. Выше).Если у вас 20 потоков, это делает резервное пространство стека эффективным.

Что было бы хорошей аналогией для концепции зарезервированного / зафиксированного?

Можно сказать, что RESERVE похож напокупка опционов на покупку, и COMMIT использует опцион.

Есть ли какие-либо другие причины, помимо указанных выше, которые потребовали бы использования зарезервированной памяти?Существуют ли какие-либо интересные случаи использования, когда прибегание к зарезервированной памяти является разумным ходом?

ИМХО, наиболее вероятные места для РЕЗЕРВИРОВАНИЯ без COMMITTING - для создания стеков и куч, причем первое является наиболее важным.

...