сохранение и сохранение памяти - PullRequest
10 голосов
/ 22 ноября 2010

Я читаю и вот несколько цитат.

Когда процесс создается и получает свое адресное пространство, большая часть этого используемого адресного пространства свободна или нераспределена,Чтобы использовать части этого адресного пространства, вы должны выделить регионы внутри него, вызвав VirtualAlloc. Акт выделения области называется резервированием .

Чтобы использовать зарезервированную область адресного пространства, вы должны выделить физическое хранилище, а затем отобразить это хранилище в зарезервированном регионе. Этот процесс называется фиксацией физического хранилища .

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

Вот пара вопросов:

  • Почемумы должны следовать парадигме резерва-комита при использовании памяти?то есть, почему мы должны следовать этой двухэтапной парадигме вместо того, чтобы выделять некоторую физическую память напрямую и использовать ее?

  • Если физическое хранилище, выделенное для региона, выделяется из подкачки системыфайл, зачем нам оперативка (звучит смешно)?На мой взгляд, область адресного пространства должна быть сопоставлена ​​с ОЗУ (через механизм подкачки), а страницы ОЗУ должны быть подкреплены файлом подкачки.

Возможно, на этот вопрос можно было бы ответитьобъясняя следующие 2 аспекта:

  • Что делает резервирование?

  • Что делает фиксация?

Обновление - 1:48 PM 11/23/2010

Следующая цитата из вызывает у меня недоумение.

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

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

Итак, где находится ОЗУ?Что, если я настрою свой компьютер без файла подкачки?

Ответы [ 2 ]

2 голосов
/ 22 ноября 2010

Весь смысл резервирования страниц состоит в том, чтобы гарантировать, что непрерывное адресное пространство доступно для некоторой задачи. Например, мы хотим, чтобы стек мог увеличиваться до 1 МБ, но мы не хотим фиксировать всю эту память, потому что она на самом деле еще не будет использоваться. Поэтому мы резервируем 1 МБ страниц, но выделяем небольшое количество, например, 64 КБ. Установив защитную страницу в конце области фиксации, мы можем определить, когда нам нужно выделить больше памяти.

Выделение памяти - это действие по отображению некоторого вида хранилища на страницу. Это может быть расположено в физической памяти, где она является частью рабочего набора, или в файле подкачки. Это может также быть отображено в или частной памяти. NtAllocateVirtualMemory / VirtualAlloc может резервировать и фиксировать одновременно для удобства.

ПРАВКА для обновленного вопроса: когда вы фиксируете страницы, это оплачивается в соответствии с квотой процесса файла подкачки / общесистемным пределом обязательств. Этот предел определяется объемом доступной физической памяти и размером файла подкачки. На самом деле это не означает, что страницы хранятся или записываются в файл подкачки. Они могут быть, если памяти мало, но в остальном страницы в основном хранятся в физической памяти.

0 голосов
/ 22 ноября 2010
  • На самом деле вам не обязательно следовать двухэтапной схеме распределения резервов / фиксаций.

    Дело в том, что VirtualAlloc и VirtualFree могут сделать несколько вещей.И иногда это действительно полезно.Однако вам не нужно.

  • Область выделенной памяти - это та область, для которой система выделяет физическую память.

    Вам не нужно беспокоиться о том, где именно он расположен: ОЗУ или файл подкачки.Это должно быть прозрачно для вас (если вы не пишете драйвер устройства в режиме ядра).Более того, большинство страниц памяти могут быть выгружены в файл подкачки и загружены в оперативную память по требованию.

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

    В обычном сценарии, когда вы фиксируете страницы памяти, используйте ее в течение некоторого периода времени и освобождайте ее - скорее всего, она вообще не достигнет файла подкачки.1019 *

...