- •Архитектура памяти Windows
- •Типы памяти
- •Физическая память
- •Виртуальная память
- •Страничные блоки памяти
- •Память файла подкачки
- •Файлы, отображаемые в память
- •Совместно используемая физическая память
- •Адресное пространство процесса
- •Использование адресного пространства в Windows 9x
- •Распределение виртуальной памяти
- •Защита памяти
- •Гранулярность при распределении памяти
- •Дескриптор виртуальных адресов
- •Пример использования функции GlobalMemoryStatus
- •Управление виртуальной памятью
- •Каталог и таблицы системных страниц
- •Совместно используемые страницы
- •Рабочие наборы
- •База данных страничных блоков
- •Кучи памяти в 32-разрядной Windows
- •Функции работы с кучей
- •Отображения виртуальной памяти
- •Содержание отчета
Файлы, отображаемые в память
В лабораторной работе №2 обсуждались файлы, отображаемые в память, там же был приведен пример отображения файла. Любой файл применяется для проецирования виртуальной памяти так же, как для этих целей используется файл подкачки. Фактически единственное назначение файла подкачки - проецирование виртуальной памяти. Поэтому файлы, проецируемые в память подобным образом, называются отображаемыми в память. На предыдущем рисунке изображены именно такие файлы. Соответствующие виртуальные страницы являются спроецированными на файл.
Функция CreateFileMapping объявляется так:
function CreateFileMapping(hFile: THandle; lpFileMappingAttributes: PSecurityAttributes; flProtect, dwMaximumSizeHigh, dwMaximumSizeLow: DWORD; lpName: PChar): THandle; stdcall;
function CreateFileMapping; external kernel32 name 'CreateFileMappingA';
Она создает объект «отображение файла», используя дескриптор открытого файла, и возвращает дескриптор этого объекта. Дескриптор может использоваться с функцией MapViewOf File, отображающей файл в виртуальную память:
function MapViewOfFile(hFileMappingObject: THandle; dwDesiredAccess: DWORD; dwFileOffsetHigh, dwFileOffsetLow, dwNumberOfBytesToMap: DWORD): Pointer; stdcall;
function MapViewOfFile; external kernel32 name 'MapViewOfFile';
Начальный адрес объекта «отображение файла» в виртуальной памяти возвращает функция MapViewOfFile. Можно также сказать, что представление проецируется на файл с дескриптором hFile.
Если параметр hFile, передаваемый функции CreateFileMapping, установлен в -1, то объект «отображение файла» (любые представления, созданные на основе этого объекта) проецируем на файл подкачки, а не на заданный файл.
Совместно используемая физическая память
О физической памяти говорят, что она совместно используется (shared), если она отображается на виртуальное адресное пространство нескольких процессов, хотя виртуальные адреса в каждом процессе могут отличаться. Следующий рисунок иллюстрирует это утверждение.
Если файл, такой как DLL, находится в совместно используемой физической памяти, то о нем можно говорить как о совместно используемом.
Одно из преимуществ
файлов, отображаемых в память, заключается
в том, что их легко использовать совместно.
Присвоение имени объекту «отображение
файла» делает возможным совместное
использование файла несколькими
процессами. В этом случае его содержимое
отображено на совместно используемую
физическую память (см. рис. 3). Возможно
также совместное пользование содержимого
файла подкачки с помощью механизма
отображения файла.
Рис. 3
В частности, можно создать такой объект, проецируемый на файл подкачки,
просто установив параметр hFile функции CreateFileMapping в -1.

Рис. 4
Адресное пространство процесса
Каждый процесс Win32 получает виртуальное адресное пространство, объем которого равен 4 Гб. Таким образом, код процесса может ссылаться на адреса с &Н00000000 по &HFFFFFFFF (или с 0 по 232 - 1 = 4 294 967 295 в десятичной системе счисления). Конечно, так как виртуальные адреса - это просто числа, заявление о том, что каждый процесс получает свое собственное виртуальное адресное пространство, выглядит довольно бессмысленным. Тем не менее, это утверждение должно означать, что Windows не видит ни какой взаимосвязи в том, что и процесс А, и процесс В используют один и тот же виртуальный адрес, например &Н40000000. В частности, Windows может сопоставить (или не сопоставить) виртуальным адресам каждого процесса разные физические адреса.
