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


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


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

rihter15-1.jpg

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

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

rihter15-2.jpg

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

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

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




Начало  Назад  Вперед