Выделенная память уходит в физическую память или резервирует место в файле подкачки? - PullRequest
3 голосов
/ 15 мая 2010
  1. Когда я делаю VirtualAlloc с MEM_COMMIT, это «выделяет физическую память в памяти или в файле подкачки на диске для указанных зарезервированных страниц памяти» (цитата из статьи MSDN http://msdn.microsoft.com/en-us/library/aa366887%28VS.85%29.aspx).

До сих пор все в порядке, НО:

  1. В описании счетчика зафиксированных байтов говорится, что «зарезервированная память - это физическая память, в которой зарезервировано пространство для файла (ов) подкачки диска».

  2. Я также читаю «Windows через C / C ++ 5-е издание», и в этой книге говорится, что выделение памяти означает резервирование места в файле подкачки ....

Последние два случая не имеют смысла для меня ... Если вы фиксируете память, не означает ли это, что вы фиксируете физическую память (ОЗУ)? Файл подкачки, предназначенный для замены неиспользуемых в настоящее время страниц памяти в случае, если память становится мало.

В книге говорится, что когда вы фиксируете память, вы фактически резервируете место в файле подкачки. Если бы это было правдой, то это означало бы, что для фиксированной страницы есть место, зарезервированное в файле подкачки и фрейм страницы в физической памяти ... Так что требуется вдвое больше места ?! Разве целью файла подкачки не является увеличение общего объема физической памяти? Если у меня 1 ГБ ОЗУ с файлом подкачки 1 ГБ => 2 ГБ используемой «физической памяти» (в книге также говорится об этом, но сразу после этого говорится, что я описал в пункте 2).

Что мне не хватает? Спасибо.

РЕДАКТИРОВАТЬ: То, как я вижу, прекрасно описано здесь: http://support.microsoft.com/kb/555223

"Показывает, сколько байтов было выделено процессами и для которых операционная система зафиксировала фрейм страницы ОЗУ или слот страницы в файле подкачки (возможно, оба)"

но я прочитал слишком много вещей, которые противоречат моей вере, например, эти два пункта выше и другие, как этот, например: http://blogs.msdn.com/ricom/archive/2005/08/01/446329.aspx

Ответы [ 2 ]

9 голосов
/ 15 мая 2010

Вы неправильно понимаете, как работает модель памяти Windows. Терминология и документация немного путают, что не помогает.

Когда вы фиксируете память, ОС предоставляет вам «обязательство» предоставить страницу для поддержки этой памяти. На самом деле он не выделяется ни из физической памяти, ни из файла подкачки, он просто проверяет, что счетчик «незафиксированных страниц» больше нуля, а затем уменьшает его. Если это удается, страница помечается как зафиксированная в вашей таблице страниц.

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

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

2 голосов
/ 20 августа 2011

Каждая страница физической памяти поддерживается либо файлом подкачки (для непостоянных страниц памяти, таких как данные), либо дисковым файлом (для страниц памяти только для чтения, таких как код и ресурсы). Когда я говорю backed , я имею в виду поведение / процесс, когда операционная система считывает ее из файла на диске, когда она больше не нужна, операционная система освобождает ее и очищает содержимое к файлу диска.

Когда вы фиксируете блок виртуальной памяти, диспетчер виртуальной памяти (VMM) выделит вам запись в дереве дескриптора виртуального адреса (VAD) процесса и зарезервирует место в файле подкачки. Физическая память будет выделяться только до тех пор, пока не будет получен доступ к этой памяти блока. В случае, если файл подкачки отключен, пространство будет зарезервировано непосредственно в физической памяти.

Пожалуйста, обратитесь к этим ссылкам: Управление виртуальной памятью и Управление файлами, отображаемыми в память

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...