Common Intermediate Language и системное программирование в Microsoft.Net. Макаров А.В - 130 стр.

UptoLike

#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;