Динамическое распределение памяти в MS Windows. Габрельян Б.В. - 9 стр.

UptoLike

Составители: 

Эта утилита позволяет проследить за тем, как приложение использует
глобальную память. В главном окне этой программы отображается список строк,
каждая из которых содержит информацию об одном блоке памяти: адрес
(ADDRESS), дескриптор (HANDLE), размер в байтах (SIZE), счетчик
фиксирования блока памяти (плюс к тому, если P - для блока запрещен страничный
обмен, если L - блок зафиксирован) (LOCK), флаг
(FLG) содержащий F - если блок
фиксированный и D - если discardable, наличие локальной кучи (HEAP) - если есть,
то Y, имя приложения, владеющего блоком (OWNER), тип объекта (сегмент кода,
данных, ресурс и т.п.) (TYPE). В меню Walk пункт Walk Heap позволяет увидеть
список блоков. Пункт Walk LRU List - список всех удаляемых объектов, GC(0) -
дефрагментировать глобальную кучу и выделить блок памяти размером 0 байт,
GC(-1) and Walk - удалить все удаляемые сегменты
и посмотреть список объектов.
ЗАДАНИЕ 2.
1) Используйте функцию GlobalMemoryStatus для определения
параметров конкретной системы, на которой Вы работаете. Запишите и
объясните полученные результаты. 2) Определите, сколько реально памяти
можно динамически захватить в Вашей вычислительной системе.
Объясните результат. 3) Используйте heapwalk (только Windows 9x) для
нахождения заблокированных участков памяти. Можно ли использовать
heapwalk для освобождения заблокированных участков памяти?
ЗАДАНИЕ 3.
(только для MS Windows NT). Используйте функцию HeapWalk
для исследования всех блоков всех куч процесса. Создайте консольное
приложение для отображения информации, выдаваемой HeapWalk.
HepWalk возвращает нулевое значение, если возникла ошибка или
просмотрены все блоки кучи. Чтобы получить информацию о первом блоке
в куче необходимо перед вызовом HeapWalk присвоить полю lpData
структуры PROCESS_HEAP_ENTRY значение NULL. Вызывая HepWalk
снова, не меняя значений
полей структуры PROCESS_HEAP_ENTRY,
получаем информацию о следующем блоке и т.д. Чтобы не возникало
коллизий между разными потоками, которые могут менять состояние кучи,
прежде чем вызывать HeapWalk нужно заблокировать (зафиксировать) кучу,
после возврата из HeapWalk - разблокировать.
Приложение.
1. GlobalAlloc
Функция GlobalAlloc захватывает указанное число байт в куче. Поддерживается
только для совместимости с Win16.
HGLOBAL GlobalAlloc(
UINT uFlags, // аттрибуты захватываемого блока
DWORD dwBytes // число байт в захватываемом блоке
);
Параметры:
uFlags - определяет, каким будет захваченный блок. Возможны следующие
значения и их комбинации:
       Эта утилита позволяет проследить за тем, как приложение использует
глобальную память. В главном окне этой программы отображается список строк,
каждая из которых содержит информацию об одном блоке памяти: адрес
(ADDRESS), дескриптор (HANDLE), размер в байтах (SIZE), счетчик
фиксирования блока памяти (плюс к тому, если P - для блока запрещен страничный
обмен, если L - блок зафиксирован) (LOCK), флаг (FLG) содержащий F - если блок
фиксированный и D - если discardable, наличие локальной кучи (HEAP) - если есть,
то Y, имя приложения, владеющего блоком (OWNER), тип объекта (сегмент кода,
данных, ресурс и т.п.) (TYPE). В меню Walk пункт Walk Heap позволяет увидеть
список блоков. Пункт Walk LRU List - список всех удаляемых объектов, GC(0) -
дефрагментировать глобальную кучу и выделить блок памяти размером 0 байт,
GC(-1) and Walk - удалить все удаляемые сегменты и посмотреть список объектов.

ЗАДАНИЕ 2. 1) Используйте функцию GlobalMemoryStatus для определения
параметров конкретной системы, на которой Вы работаете. Запишите и
объясните полученные результаты. 2) Определите, сколько реально памяти
можно динамически захватить в Вашей вычислительной системе.
Объясните результат. 3) Используйте heapwalk (только Windows 9x) для
нахождения заблокированных участков памяти. Можно ли использовать
heapwalk для освобождения заблокированных участков памяти?

ЗАДАНИЕ 3. (только для MS Windows NT). Используйте функцию HeapWalk
для исследования всех блоков всех куч процесса. Создайте консольное
приложение для отображения информации, выдаваемой HeapWalk.
HepWalk возвращает нулевое значение, если возникла ошибка или
просмотрены все блоки кучи. Чтобы получить информацию о первом блоке
в куче необходимо перед вызовом HeapWalk присвоить полю lpData
структуры PROCESS_HEAP_ENTRY значение NULL. Вызывая HepWalk
снова, не меняя значений полей структуры PROCESS_HEAP_ENTRY,
получаем информацию о следующем блоке и т.д. Чтобы не возникало
коллизий между разными потоками, которые могут менять состояние кучи,
прежде чем вызывать HeapWalk нужно заблокировать (зафиксировать) кучу,
после возврата из HeapWalk - разблокировать.

                                Приложение.
1. GlobalAlloc
Функция GlobalAlloc захватывает указанное число байт в куче. Поддерживается
только для совместимости с Win16.
HGLOBAL GlobalAlloc(
 UINT uFlags, // аттрибуты захватываемого блока
 DWORD dwBytes // число байт в захватываемом блоке
);
Параметры:
uFlags - определяет, каким будет захваченный блок. Возможны следующие
значения и их комбинации: