Вся память процесса, выделенная при помощи одной из следующих функций ( HeapAlloc, VirtualAlloc, GlobalAlloc или LocalAlloc) доступна только в вызвавшем эту функцию процессе. Даже память, которая выделется в DLL, выделяется в адресном пространстве того процесса, который обратился к DLL, и не доступна для всех остальных процессов, пусть даже использующих эту же DLL. Для того, чтобы создать память, общую для нескольких процессов, вы должны использовать файлы проецируемые в память.
Свое название файлы проецируемые в память получили из-за того, что они позволяют легко создавать в памяти фрагменты, разделяемые несколькими процессами. Любой процесс может задать специфичное имя и затем использовать его при вызове функции CreateFileMapping с целью создания файла, проецируемого в память. Другие процессы по указанному имени могут получить дескриптор файла проецируемого в память при помощи одного из вызовов функции CreateFileMapping или OpenFileMapping
Каждый процесс по указанному дескритору файла проецируемого в память может использовать функцию MapViewOfFile для того, чтобы просмотреть содержимое файла в своем адресном простанстве. Просмотр веми процессами одного файла проецируемого в память приводит к тому, что страницы памяти каждого из процессов, отвеающие одному и тому же фрагменту файла проецируемого в память, будут ссылаться на одно и то же место в физической памяти или на диске. Тем не менее, адреса виртуальной памяти процессов, отвечающих одному и тому же файлу проецируемому в память может варьироваться от одного процесса к другому, если, конечно, при вызове функции MapViewOfFilex этот адрес не был жестко указан. Не смотря на общий доступ, станицы физической памяти системы, отвечающие файлу подкачки, не являются глобальными и не доступны процессам, которые не производили проекцию этого файла в память.
Любые страницы памяти, которые были переданы процессу путем создания просмотра файла проецируемого в память, освобождаются либо при завершении процесса, создавшего просмотр файла, проецируемого в память, либо при вызове функции UnmapViewOfFile. В этот момент содержимое файла (или файлов), отвечающих просмотру, обновляется. Обновление файла, отвечающего просмотру, может быть выполнено непосредственно путем вызова функции FlushViewOfFile.
Для большей информации по данному вопросу, смотрите раздел "Файлы проецируемые в память". Пример общей памяти, организованный в DLL, можно встретить в разделе "Использование общей памяти в динамически компонуемой библиотеке".
Если несколько процессов ведут запись в файл, проецируемый в память, вы должны синхронизировать доступ к памяти. Для более детальной информации смотрите раздел "Синхронизация".
Состояние страниц |
Работа с виртуальной памятью![]() |
© Mystic, 2002