О CreateMappingFile и файлах с отображением в память

#c #winapi #shared-memory

#c #winapi #разделяемая память

Вопрос:

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

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

Это правильно?

Ответ №1:

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

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

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

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

Комментарии:

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

2. @Дэвид Шварц: Что mapping на самом деле означает эта концепция? и где это делается и кем?

3. @Adban: «Отображение» означает создание чего-либо видимого через фрагмент адресного пространства. В этом случае данные в файле отображаются в память, поэтому процесс может обращаться к нему так же, как к другим структурам памяти, таким как массивы.

Ответ №2:

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

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

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

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