вательного набора страниц с одинаковыми атрибутами.
В поле BaseAddress функция VirtualQuery() возвращает адрес первой страни-
цы меньшего блока, который содержит ячейку с адресом, заданным аргументом
lpvAddress. В поле AllocationBase возвращается адрес большего зарезервированно-
го блока страниц, содержащего данную ячейку. Значение параметра AllocationBase
совпадает со значением, возвращаемым функцией VirtualAlloc(). Если функция
VirtualAlloc() применила к указанному диапазону определенный флаг защиты, он
может быть возвращен в виде значения поля AllocationProtect (PAGE_NOACCESS,
PAGE_READONLY или PAGE_READ – WRITE).
В остальных полях описывается меньшая подгруппа страниц: указывают-
ся ее размер, текущее состояние и флаги защиты. В последнем поле всегда
возвращается значение MEM_PRIVATE,
которое свидетельствует
о том, что другие процессы не могут совместно использовать заданный блок
памяти. Наличие данного поля указывает, что впоследствии Microsoft может
рассмотреть вопрос о применении других механизмов для совместного ис-
пользования памяти различными процессами.
Хотя функции GlobalMemoryStatus() и GetSystemInfo() не входят в набор
команд, предназначенных для работы с виртуальной памятью, они возвращают
полезную информацию о памяти. Функция GlobalMemoryStatus() определяет
размер и свободный объем физической памяти, страничного файла и текущего
адресного пространства. Функция GetSystemInfo() наряду с другой информа-
цией возвращает размер системной физической страницы, а также младший
и старший виртуальные адреса, доступные для процессов и DLL-файлов. Обычно
эти значения составляют 4 Кб, 0 × 00 010 000 и 0 × 7FFEFFFF соответственно.
Выделенные страницы можно заблокировать в памяти, т. е. запретить их вы-
теснение в файл подкачки. Для этих целей служит пара функций VirtualLock() и
VirtualUnlock(). Заблокированная страница не может быть перекачана на диск при
выполнении программы. Однако если ваша программа в данный момент не вы-
полняется, на диск могут быть перекачаны все страницы, включая заблокирован-
ные. В сущности блокировка выступает гарантией того, что страница будет посто-
янной и неотъемлемой частью рабочего набора программы. При перегрузке
операционной системы менеджер рабочих наборов может ограничить количество
страниц, блокируемых одним процессом. Максимальное количество блокируемых
страниц для любого процесса колеблется от 30 до 40 и зависит от объема систем-
ной памяти и рабочего набора приложения.
Блокировка страниц является нежелательной, поскольку она препятствует
работе менеджера виртуальной памяти и затрудняет организацию физической
памяти. Как правило, все страницы блокируются только драйверами устройств и
другими компонентами системного уровня. Программы, которые должны очень
быстро реагировать на системные сигналы, блокируют только часть
страниц, чтобы реакция на неожиданный системный сигнал не задерживалась
из-за медленного выполнения операций чтения с диска:
BOOL VirtualLock
50