Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
шпора 97.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
778.75 Кб
Скачать

Другие функции для работы с кучей

Функция HeapCompact делает попытку объединения, или дефрагментации, смеж­ных свободных блоков в куче; HeapValidate пробует определить повреждение кучи; HeapWalk перебирает блоки в куче, а GetProcessHeap получает все дескрипторы ку­чи, действительные для данного процесса.

Функции HeapLock и HeapUnlock позволяют потоку упорядочить доступ к куче.

Резюме по управлению кучей

Обычная последовательность действий при работе с кучей такова.

  1. Получить дескриптор кучи с помощью функций CreateHeap или GetProcessHeap

  2. Выделить блоки в куче, используя HeapAlloc.

3. По необходимости освободить все или некоторые блоки функцией HeapFree.

4. Уничтожить кучу и закрыть дескриптор функцией HeapDestroy.

Лекция 8. Тема: Отображаемые в память файлы

Динамическая память для кучи должна физически резервироваться в файле под­качки. Часть операционной системы, управляющая памятью, регулирует перемещение страниц между физической памятью и файлом подкачки, а также отображает в него виртуальное адресное пространство процесса. Когда процесс завершается, физическое пространство в файле освобождается.

Возможность отображения файлов в память Win32 также применима и для ото­бражения в память обычных файлов. При этом проявляется ряд преимуществ.

• Нет необходимости выполнять прямой ввод-вывод из файла (запись и чтение).

• Структуры данных, созданные в памяти, могут быть сохранены в файле для дальнейшего использования в той же или другой программе. Будьте осторожны при использовании указателей.

• Удобные и эффективные алгоритмы для работы в памяти (сортировка, деревья поиска, обработка строк и т.д.) могут обрабатывать данные файла, даже если его размер намного превышает объем доступной физической памяти. При этом в случае больших файлов быстродействие будет определяться характером подкач­ки страниц.

• В некоторых случаях может быть значительно повышена производительность обработки файлов.

• Отсутствует потребность в уцравлении буферами и данными файла, которые они содержат. Эту работу эффективно и надежно выполняет операционная сис­тема.

• Несколько процессов могут совместно использовать одну область па­мяти, отображая свои виртуальные адресные пространства в один файл или в файл подкачки (межпроцессное разделение памяти — главная предпосылка для отображения в файл подкачки).

• Нет необходимости расходовать пространство файла подкачки.

Сама операционная система использует отображение в память для реализации библиотек динамической компоновки (DLLs), а также для загрузки исполняемых (.ехе) файлов и их выполнения.

Объекты отображения файлов

Первый этап — создание для открытого файла объекта отображения файла, кото­рый имеет дескриптор, и последующее отображение адресного пространства процесса на весь файл или на его часть. Объекты отображения файлов могут получать имена, поэтому они доступны другим процессам для разделения памяти. Также отображае­мый объект имеет защиту, атрибуты безопасности и размер.

HANDLE CreateFileMapping ( HANDLE hFile,

LPSECURITY_ATTRIBUTES lpsa, DWORD fdwProtect,

DWORD dwMaximumSizeHigh, DWORD dwMaximumSizeLow,

LPCTSTR lpszMapName)

Возвращаемое значение: дескриптор отображения файла или NULL при неудаче.

hFile — дескриптор открытого файла с флагами защиты, совместимыми с пара­метром fdwProtect. Значение (типа HANDLE) 0xFFFFFFFF (эквивалентно константе INVALID_HANDLE_VALUE) указывает на файл подкачки, и вы можете использовать это значение для межпроцессного разделения памяти без создания отдельного файла.

Тип LPSECURITY_ATTRIBUTES позволяет защитить объект отображения. Параметр определяет доступ к отображенному файлу с помощью описанных ниже флагов. Для специальных целей разрешены дополнительные флаги; например, флаг SEC_IMAGE определяет исполняемый образ (подробнее это описано во встроенной до­кументации).

• Установленный флаг PAGE_READONLY означает, что программа может только чи­тать страницы в отображенной области и не может записывать или исполнять их. Файл hFile должен быть открыт с правом доступа GENERIC_READ.

• Флаг PAGE_READWRITE предоставляет полный доступ к объекту, если файл hFile открыт с правами доступа GENERIC_READ и GENERIC_WRITE.

• Флаг PAGE_WRITECOPY определяет, что при изменении содержимого отображен­ной памяти собственная (для данного процесса) копия записывается в файл подкачки, а не в исходный файл. Отладчик может использовать этот флаг при определении точек останова в разделяемом коде. Результат будет различным в Windows 2000/NT и Windows 9x

Параметры dwMaximumSizeHigh и dwMaximumSizeLow определяют размер объекта отображения. Если указан нуль, используется текущий размер; обязательно опреде­ляйте размер при использовании файла подкачки. Если ожидается, что размер файла увеличится, используйте ожидаемый размер, и при необходимости будет немедленно установлен нужный размер файла. Не отображайте область файла за указанной гра­ницей — объект отображения не может расти.

lpszMapName указывает имя объекта отображения, что позволяет другим процес­сам совместно использовать объект. Регистр символов в имени не учитывается. Если разделение памяти не используется, указывайте значение null.

Об ошибке сообщает возвращаемое значение null (a не INVALID_HANDLE_VALUE).

Указав имя существующего объекта отображения, можно получить дескриптор отображения файла. Имя должно быть получено предшествующим вызовом функции CreateFileMapping. Два процесса могут совместно использовать память, разделяя отображение файла. Первый процесс создает отображение файла, а следующий от­крывает это отображение, используя имя. Если названного объекта не существует, от­крыть его не удастся..

HANDLE OpenFileMapping ( DWORD dwDesiredAccess,

BOOL bInheritHandle, LPCTSTR lpName);

Возвращаемое значение: дескриптор отображения файла или null при неудаче.

dwDesiredAccess использует тот же набор флагов, что и параметр функции CreateFileMapping. Значение lpName — имя, полученное вызовом функции CreateFileMapping. Параметр blnheritHandle - наследование дескриптора.

Функция CloseHandle, как и ожидалось, уничтожает дескрипторы отображения.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]