Программирование для Windows NT

       

Старые функции управления памятью


В 32-разрядных приложениях Microsoft Windows NT вы можете пользоваться многими функциями управления памятью операционной системы Microsoft Windows версии 3.1, которые оставлены в новой операционной системе для совместимости. Мы подробно рассмотрели эти функции в главе “Управление памятью” 13 тома “Библиотеки системного программиста”.

Напомним, что в 16-разрядном программном интерфейсе Microsoft Windows версии 3.1 существует два набора функций (глобальные и локальные), предназначенных для работы с глобальным и локальным пулом памяти. Это такие функции, как GlobalAlloc, LocalAlloc, GlobalFree, LocalFree и так далее. В 32-разрядных приложениях Microsoft Windows NT вы можете пользоваться как глобальными, так и локальными функциями, причем результат будет совершенно одинаковый. Причина этого заключается в том, что все эти функции пользуются функциями программного интерфейса Microsoft Windows NT, предназначенными для работы со стандартным пулом памяти: HeapAlloc, HeapReAlloc, HeapFree и так далее.

Вот список функций старого программного интерфейса, доступных приложениям Microsoft Windows NT:

Имя функции

Описание

GlobalAlloc, LocalAlloc



Получение глобального (локального для функции LocalAlloc) блока памяти

GlobalReAlloc, LocalReAlloc

Изменение размера глобального (локального) блока памяти

GlobalFree, LocalFree

Освобождение глобального (локального) блока памяти

GlobalLock, LocalLock

Фиксирование глобального (локального) блока памяти

GlobalUnlock, LocalUnlock

Расфиксирование глобального (локального) блока памяти

GlobalSize, LocalSize

Определение размера глобального (локального) блока памяти

GlobalDiscard, LocalDiscard

Принудительное удаление глобального (локального) блока памяти

GlobalFlags, LocalFlags

Определение состояния глобального (локального) блока памяти

GlobalHandle, LocalHandle

Определение идентификатора глобального (локального) блока памяти

Заметим, что хотя при получении памяти с помощью функции GlobalAlloc вы по-прежнему можете указывать флаг GMEM_DDESHARE, другие приложения, запущенные в среде Microsoft Windows NT, не будут иметь к этой памяти доступ. Причина очевидна - адресные пространства приложений изолированы. Однако в документации SDK сказано, что этот флаг можно использовать для увеличения производительности приложений, использующих механизм динамической передачи сообщений DDE. Этот механизм мы подробно описали в главе “Обмен данными через DDE” в 17 томе “Библиотеки системного программиста”, который называется “Операционная система Microsoft Windows 3.1. Дополнительные главы”.


Обратим ваше внимание также на то, что в среде Microsoft Windows версии 3.1 вы могли получать фиксированную (fixed), перемещаемую (moveable) и удаляемую (discardable) память.

В среде Microsoft Windows NT вы по-прежнему можете пользоваться различными типами памяти, если для получения блоков памяти используете функции GlobalAlloc или LocalAlloc. Однако теперь вам едва ли потребуется перемещаемая память, так как новая система управления памятью выполняет операцию перемещения с помощью механизма страничной адресации, не изменяя значение логического адреса.

В том случае, если вы все же решили получить блок перемещаемой памяти, перед использованием его необходимо зафиксировать функцией GlobalLock или LocalLock (соответственно, для блоков памяти, полученных функциями GlobalAlloc и LocalAlloc). Это нужно сделать потому что если вы заказываете перемещаемый блок памяти, функции GlobalAlloc и LocalAlloc возвращают не адрес блока памяти, а его идентификатор.

Если же вы получаете фиксированный блок памяти, то функции GlobalAlloc и LocalAlloc вернут вам его адрес, который можно немедленно использовать. При этом надо иметь в виду, что операционная система сможет перемещать этот блок памяти без изменения его логического адреса.

Что же касается удаляемой памяти, то ее можно использовать для хранения таких данных, которые можно легко восстановить, например, прочитав их из ресурсов приложений.


Содержание раздела