Составители:
Рубрика:
#include <windows.h>
#define DEFAULT_SECURITY (LPSECURITY_ATTRIBUTES)NULL
int main( void )
{
HANDLE hFile, hMapping;
LPVOID pMapping;
LPSTR p;
int i;
hFile = CreateFile(
“abc.dat”, GENERIC_WRITE|GENERIC_READ,
FILE_SHARE_WRITE, DEFAULT_SECURITY,
CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL
);
hMapping = CreateFileMapping(
hFile, DEFAULT_SECURITY, PAGE_READWRITE, 0, 256, NULL
);
pMapping = MapViewOfFile( hMapping, FILE_MAP_WRITE, 0,0, 0 );
for ( p = (LPSTR)pMapping, i=0; i<256; i++ ) *p++ = (char)i;
UnmapViewOfFile( hMapping );
CloseHandle( hMapping );
CloseHandle( hFile );
return 0;
}
7.2.2.3. Межпроцессное взаимодействие с использованием проецирования файлов
Проецирование файлов используется для создания разделяемой па-
мяти: для этого один процесс должен создать объект «проекция файла», а
другой – открыть его. После этого система будет гарантировать когерент-
ность данных в этой проекции во всех процессах, которые ее используют,
хотя проекции могут размещаться в разных диапазонах адресов.
В примере ниже приводится текст двух приложений (first.cpp и sec-
ond.cpp), которые обмениваются между собой данными через общий объ-
ект «проекция файла»:
/* FIRST.CPP */
#include <windows.h>
#define DEFAULT_SECURITY (LPSECURITY_ATTRIBUTES)NULL
int main( void )
{
HANDLE hMapping;
LPVOID pMapping;
STARTUPINFO si;
PROCESS_INFORMATION pi;
Разработка параллельных приложений для ОС Windows
247
мать специальные меры для передачи данных из адресного пространства
одного процесса в адресное пространство другого.
Доступная пользователю часть адресного пространства процесса вы-
деляется реально не в физической оперативной памяти, а в файлах, дан-
ные которых проецируются на соответствующие фрагменты адресного
пространства. Выделение памяти без явного указания проецируемого
файла приведет к тому, что область для проецирования будет автоматиче-
ски выделяться в файле подкачки страниц. Физическая оперативная па-
мять в значительной степени является кэшем для данных файлов. Выделе-
ние физической оперативной памяти применяется очень редко, напри-
мер, средствами расширения адресного пространства (Address Windowing
Extension, AWE), позволяющими использовать более чем 4Г адресного
пространства в 32-х разрядном приложении Win32.
Важная особенность средств управления адресным пространством и
проецированием файлов – они используют так называемую гранулярность
выделения ресурсов (ее можно узнать с помощью функции GetSystemInfo);
в современных версиях Win32 гранулярность составляет 64К. Это означает,
что если вы попробуете спроецировать в память файл размером 100 байт, то
в адресном пространстве будет занят фрагмент в 65536 байт длиной, из ко-
торого реально будут заняты только первые 100 байт.
Для управления адресным пространством предназначены функции
VirtualAlloc, VirtualFree, VirtualAllocEx, VirtualFreeEx, VirtualLock и
VirtualUnlock. С их помощью можно резервировать пространство в адрес-
ном пространстве процесса (без передачи физической памяти из файла) и
управлять передачей памяти из файла подкачки страниц указанному диа-
пазону адресов.
Механизмы проецирования файлов в память различаются для обыч-
ных и для исполняемых файлов. Функции создания процессов
(CreateProcess...) и загрузки библиотек (LoadLibrary, LoadLibraryEx), по-
мимо специфичных действий, выполняют проецирование исполняемых
файлов в адресное пространство процесса; при этом учитывается их деле-
ние на сегменты, наличие секций импорта, экспорта и релокаций и др.
Обычные файлы проецируются как непрерывный блок данных на непре-
рывный диапазон адресов.
Для явного проецирования файлов используется специальный объ-
ект ядра проекция файла (file mapping object). Этот объект предназначен для
описания файла, который может быть спроецирован в память, но реаль-
ного отображения файла или его части в память при создании проекции
не происходит. Описатель объекта «проекция файла» можно получить с
помощью функций CreateFileMapping и OpenFileMapping. Для проецирова-
ния файла или его части в память предназначены функции MapViewOfFile,
MapViewOfFileEx и UnmapViewOfFile:
246
CIL и системное программирование в Microsoft .NET
246 CIL и системное программирование в Microsoft .NET Разработка параллельных приложений для ОС Windows 247 мать специальные меры для передачи данных из адресного пространства #includeодного процесса в адресное пространство другого. #define DEFAULT_SECURITY (LPSECURITY_ATTRIBUTES)NULL Доступная пользователю часть адресного пространства процесса вы- int main( void ) деляется реально не в физической оперативной памяти, а в файлах, дан- { ные которых проецируются на соответствующие фрагменты адресного HANDLE hFile, hMapping; пространства. Выделение памяти без явного указания проецируемого LPVOID pMapping; файла приведет к тому, что область для проецирования будет автоматиче- LPSTR p; ски выделяться в файле подкачки страниц. Физическая оперативная па- int i; мять в значительной степени является кэшем для данных файлов. Выделе- hFile = CreateFile( ние физической оперативной памяти применяется очень редко, напри- “abc.dat”, GENERIC_WRITE|GENERIC_READ, мер, средствами расширения адресного пространства (Address Windowing FILE_SHARE_WRITE, DEFAULT_SECURITY, Extension, AWE), позволяющими использовать более чем 4Г адресного CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL пространства в 32-х разрядном приложении Win32. ); Важная особенность средств управления адресным пространством и hMapping = CreateFileMapping( проецированием файлов – они используют так называемую гранулярность hFile, DEFAULT_SECURITY, PAGE_READWRITE, 0, 256, NULL выделения ресурсов (ее можно узнать с помощью функции GetSystemInfo); ); в современных версиях Win32 гранулярность составляет 64К. Это означает, pMapping = MapViewOfFile( hMapping, FILE_MAP_WRITE, 0,0, 0 ); что если вы попробуете спроецировать в память файл размером 100 байт, то for ( p = (LPSTR)pMapping, i=0; i<256; i++ ) *p++ = (char)i; в адресном пространстве будет занят фрагмент в 65536 байт длиной, из ко- UnmapViewOfFile( hMapping ); торого реально будут заняты только первые 100 байт. CloseHandle( hMapping ); Для управления адресным пространством предназначены функции CloseHandle( hFile ); VirtualAlloc, VirtualFree, VirtualAllocEx, VirtualFreeEx, VirtualLock и return 0; VirtualUnlock. С их помощью можно резервировать пространство в адрес- } ном пространстве процесса (без передачи физической памяти из файла) и управлять передачей памяти из файла подкачки страниц указанному диа- 7.2.2.3. Межпроцессное взаимодействие с использованием проецирования файлов пазону адресов. Проецирование файлов используется для создания разделяемой па- Механизмы проецирования файлов в память различаются для обыч- мяти: для этого один процесс должен создать объект «проекция файла», а ных и для исполняемых файлов. Функции создания процессов другой – открыть его. После этого система будет гарантировать когерент- (CreateProcess...) и загрузки библиотек (LoadLibrary, LoadLibraryEx), по- ность данных в этой проекции во всех процессах, которые ее используют, мимо специфичных действий, выполняют проецирование исполняемых хотя проекции могут размещаться в разных диапазонах адресов. файлов в адресное пространство процесса; при этом учитывается их деле- В примере ниже приводится текст двух приложений (first.cpp и sec- ние на сегменты, наличие секций импорта, экспорта и релокаций и др. ond.cpp), которые обмениваются между собой данными через общий объ- Обычные файлы проецируются как непрерывный блок данных на непре- ект «проекция файла»: рывный диапазон адресов. /* FIRST.CPP */ Для явного проецирования файлов используется специальный объ- #include ект ядра проекция файла (file mapping object). Этот объект предназначен для #define DEFAULT_SECURITY (LPSECURITY_ATTRIBUTES)NULL описания файла, который может быть спроецирован в память, но реаль- int main( void ) ного отображения файла или его части в память при создании проекции { не происходит. Описатель объекта «проекция файла» можно получить с HANDLE hMapping; помощью функций CreateFileMapping и OpenFileMapping. Для проецирова- LPVOID pMapping; ния файла или его части в память предназначены функции MapViewOfFile, STARTUPINFO si; MapViewOfFileEx и UnmapViewOfFile: PROCESS_INFORMATION pi;
Страницы
- « первая
- ‹ предыдущая
- …
- 128
- 129
- 130
- 131
- 132
- …
- следующая ›
- последняя »