2015-10-09 1 views
1

Брус действительно найти специфику на это, Heres все, что я знаю о ММФ-х в окнах:Что происходит с файлами с отображением памяти и фактическим использованием памяти?

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

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

Тогда theres странность с Whats на самом деле в ram и что на диске. В больших mmf с распределенным видом доступа, иногда скорость там, а иногда и нет. Я предполагаю, что некоторые из них иногда хранятся в файле, если они привязаны к нему или файлу подкачки, но на самом деле я понятия не имею.

В любом случае проблема, побудившая меня исследовать это, заключается в том, что у меня есть файл ~ 2gb, который я хочу разделить несколькими программами. Я не могу создать представление 2gb в каждом из них, так как я просто «из памяти», поэтому мне приходится создавать/уничтожать более мелкие. Это создает много накладных расходов из-за дополнительных вычислений смещения и создания самого представления. Может ли кто-нибудь объяснить мне, почему это так?

+0

Предполагая, что ОС сделает несколько копий отображения памяти, по одному для каждой программы. Это может быть не так. Вы должны продолжить исследование, выполнив поиск на сайте MSDN. –

+0

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

+0

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

ответ

5

Операционная система с виртуальной памятью с запросом, подобная Windows, вид MMF занимает адресное пространство. Просто номера процессора, по одному на каждые 4096 байт. Вы только начинаете использовать ОЗУ до тех пор, пока не будете использовать представление. Чтение или запись данных. В этот момент вы вызываете ошибку страницы и заставляете ОС отображать страницу виртуальной памяти в физическую память. «Запрошенная страница».

Вы не можете получить один кусок 2 ГБ адресного пространства в 32-битном режиме, так как не было места ни для чего другого. Предел - это самое большое отверстие в адресном пространстве между другими распределениями для кода и данных, обычно колеблется около ~ 650 мегабайт, давайте или принимаем. Вам нужно настроить таргетинг на x64. Или создайте программу x86, связанную с/LARGEADDRESSAWARE и работающую в 64-разрядной операционной системе. Бэкдор, который в наши дни становится довольно бессмысленным.

0

Вещь в картографированном файле памяти заключается в том, что она позволяет вам управлять своими данными без вызовов ввода-вывода. Из-за этого поведения, когда вы обращаетесь к файлу, окна загружают его в физическую память, поэтому в нем можно манипулировать, а не на диске. Вы можете прочитать об этом здесь: http://blogs.msdn.com/b/khen1234/archive/2006/01/30/519483.aspx

+1

Я так не думаю: «... данные без вызовов ввода/вывода». Для извлечения данных из файла должны быть вызовы ввода/вывода. Отображение памяти означает, что ОС обрабатывает чтение и буферизацию для вас. Есть еще вызовы ввода-вывода; с отображением памяти, ОС выполняет вызовы. –

+0

Конечно, есть вызовы ввода-вывода, потому что, как вы сказали, файл необходимо извлечь, но я имел в виду, что не каждая манипуляция с файлом ведет к вызову ввода-вывода. – ByoTic

0

В любом случае, проблема, которая заставила меня расследовать это то, что у меня есть 2gb файл ~, который я хочу несколько программ для совместного использования. Я не могу создать представление 2gb в каждом из них, так как я просто «из памяти», поэтому мне приходится создавать/уничтожать более мелкие.

Наиболее вероятная причина в том, что программы являются 32-разрядными. 32-разрядные программы (по умолчанию) имеют только 2 ГБ адресного пространства, поэтому вы не можете сопоставить 2GB-файл в одном представлении. Если вы перестраиваете их в 64-битном режиме, проблема должна исчезнуть.

Смежные вопросы