Создание эффективных WIN32-приложений с учетом специфики 64-разрядной версии Windows

Программа-пример VMAIloc


Эта программа, "15 VMAllocexe" (см листинг на рис 15-1),демонстрирует примене ние механизма виртуальной памяти для управления массивом структур Файлы исход ного кода и ресурсов этой программы находятся в каталоге 15-VMAlloc на компакт диске, прилагаемом к книге После запуска VMAlloc на экране появится диалоговое окно, показано ниже

Изначально для массива не резервируется никакого региона, и все адресное про странство, предназначенное для нею, свободно, что и отражено па карте памяти Если щелкнуть кнопку Reserve Region (50,2KB Structures), программа VMAlloc вызовет Vtrtual Alloc для резервирования региона, что сразу отразится на карте памяти После этого сланут активными и остальные кнопки в диалоговом окне

Теперь к поле можно ввести индекс и щелкнуть кнопку Use При этом по адресу, где должен располагаться указанный элемент массива, передается физическая память Долее карта памяти вновь перерисовывается и уже отражает состояние региона, за резервированного под весь массив Когда Вы, зарезервировав регион, вновь щслкне те кнопку Use, чтобы пометить элементы 7 и 46 как занятые, окно (при выполнении программы на процессоре с размером страниц по 4 Кб) будет выглядеть так

ЛюбоЙ элемент массива, помеченный как занятый, можно освободить щелчком кнопки Clear Но это не приведет к возврату физической памяти, переданной под элемент массива Дело в том, что каждая страница содержит несколько структур и освобождение одной структуры не влечет за собой освобождения других Если бы память была возвращена, то пропали бы и данные, содержащиеся в остальных струк

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

Однако освобождение структуры приводит к тому, что ее элемент fInUse устанав ливается в FALSE Это нужно для того, чтобы функция сбора мусора могла вернуть не используемую больше физическую память Кнопка Garbage Collect, если Вы еще не догадались, заставляет программу VMAlloc выполнить функцию сбора мусора Для упрощения программы я не стал выделять эту функцию в отдельный поток


Чтобы посмотреть, как работает функция сбора мусора, очистите элемент масси ва с индексом 46. Заметьте, что карта памяти пока не изменилась Теперь щелкните кнопку Garbage Collect. Программа освободит страницу, содержащую 46-й элемент, и карта памяти сразу жс обновится, как показано ниже Заметьте, что функцию Garbage Collect можно легко использовать в любых других приложениях Я реализовал ее так, чтобы она работала с массивами структур данных любого размера; при этом струк тура не обязательно должна полностью умещаться на странице памяти. Единствен ное требование заключается в том, что первый элемент структуры должен быть зна чением типа BOOL, которое указывает, задействована ли данная структура



И, наконец, хоть это и не видно на экране, закрытие окна приводит к возврату всей переданной памяти и освобождению зарезервированного региона.

Но есть в этой программе еще одна особенность, о которой я пока не упоминал Программе приходится определять состояние памяти в адресном пространстве ре гиона в трех случаях

  • После изменения индекса. Программе нужно включить кнопку Use и отклю чить кнопку Clear (или наоборот)


  • В функции сбора мусора. Программа, прежде чем проверять значение флага fInUse, должна определить, была ли передана память.


  • При обновлении карты памяти Программа должна выяснить, какие страницы свободны, какие — зарезервированы, а какие — переданы


  • Все эти проверки VMAlloc осуществляет через функцию VirtualQuery, рассмотрен ную в предыдущей главе.

    VMAIIoc


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