О файлах CreateMappingFile и Memory - PullRequest
       2

О файлах CreateMappingFile и Memory

0 голосов
/ 22 октября 2011

Я пытался прочитать много ресурсов о CreateMappingFile, но, к сожалению, у меня нет такого хорошего английского, поэтому мне нужно спросить вас о том, что я сделал вывод, если это правда или нет:

CreateMappingFile создает RAM-подобную структуру для файла в виртуальной памяти, а не в RAM, поэтому эта структура (или как она там называется) расположена на жестком диске, но в форме, в которой она готова для передачи в RAM.И когда нам нужно перенести эту структуру в ОЗУ, мы используем MapViewOfFile.

Это верно?

Ответы [ 2 ]

6 голосов
/ 22 октября 2011

CreateFileMapping просто подготавливает файл для сопоставления и выделяет дескриптор для сопоставления файлов.MapViewOfFile фактически дает это сопоставление адреса в виртуальном адресном пространстве вызывающего процесса.

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

Управление объемом физической ОЗУиспользуется отображение полностью зависит от операционной системы.Как правило, операционная система создает резервные копии страниц сопоставления с помощью физической ОЗУ, когда к ним осуществляется доступ (возможно, на несколько страниц вперед), и удаляет страницы только тогда, когда у нее есть другое использование этой памяти, которое она считает более важным.

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

1 голос
/ 22 октября 2011

Эта функция позволяет программе из пользовательского пространства запрашивать у ОС создание отображения памяти.

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

В * nix есть один вызов (mmap()), который позволяет вам создать это отображение. Windows отделяет «подготовку» отображения (выделение дескриптора и присвоение ему имени) от фактической «реализации» этого отображения.

Таким образом, в Windows, чтобы разделить сопоставление между процессами (так называемая общая память), вы должны CreteFileMapping() от каждого процесса, используя одно и то же "имя", затем, прежде чем получить доступ к сопоставлению, вы создадите его с помощью MapViewOfFile() в * nix вы бы передавали MAP_SHARED флаг mmap, и часть ядра vm разделяла бы память; я думаю, что разница в основном вызвана разными предпочтениями стиля API на каждой платформе).

...