Область выделенной памяти

Вся память, выделяемая процессом с помощью функций выделения памяти ( HeapAlloc, VirtualAlloc, GlobalAlloc или LocalAlloc), доступна только для процесса. Однако память, выделенная библиотекой DLL, выделяется в адресном пространстве процесса, который вызвал библиотеку DLL, и недоступна другим процессам, использующим ту же библиотеку DLL. Чтобы создать общую память, необходимо использовать сопоставление файлов.

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

Каждый процесс задает свой дескриптор объекту сопоставления файлов в функции MapViewOfFile , чтобы сопоставить представление файла с собственным адресным пространством. Представления всех процессов для одного объекта сопоставления файлов сопоставляются на одних и том же общих страницах физического хранилища. Однако виртуальные адреса сопоставленных представлений могут отличаться в разных процессах, если для сопоставления представления по указанному адресу не используется функция MapViewOfFileEx . Несмотря на то, что страницы физического хранилища, используемые для сопоставленного представления файлов, не являются глобальными; они недоступны для процессов, которые не сопоставляют представление файла.

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

Дополнительные сведения см. в разделе Сопоставление файлов. Пример общей памяти в библиотеке DLL см. в статье Использование общей памяти в библиотеке Dynamic-Link.

Если несколько процессов имеют доступ на запись в общую память, необходимо синхронизировать доступ к памяти. Дополнительные сведения см. в разделе Синхронизация.