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

UptoLike

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

LPVOID GlobalLock(GLOBALHANDLE hMem);
BOOL GlobalUnlock(GLOBALHANDLE hMem);
Пример 2.
GLOBALHANDLE h = GlobalAlloc( GHND, 4096 ); // Перемещаемый,
заполненный
// нулями блок
int *ptr = (int *)GlobalLock( h );
ptr[100] += 10;
GlobalUnlock( h );
GlobalFree( h );
См. Help по этим функциям в MSDN и в приложении.
Для определения параметров виртуальной и физической памяти можно
использовать функцию GlobalMemoryStatus:
VOID GlobalMemoryStatus( LPMEMORYSTATUS lpBuffer );
См. Help по структуре LPMEMORYSTATUS, выдаваемый MSDN, в приложении.
Блоки памяти перемещаются из памяти в файл подкачки и наоборот
фиксированными порциями - страницами. Размер страницы
зависит от аппаратной
платформы, на которой работает Windows. Для архитектуры Intel страницы имеют
размер 4Kb. Узнать (в частности) размер страниц можно с помощью функции
GetSystemInfo см. приложение.
В Win32 базовыми функциями являются VirtualAlloc и VirtualFree. Они
обеспечивают возможности захвата или резервирования блоков памяти в любом
месте адресного пространства процесса. Но, часто в программе удобнее
использовать простую традиционную
схему динамического распределения памяти.
В Win32 каждый процесс может использовать не одну, но произвольное
количество отдельных куч. Windows обязательно создает для процесса
"стандартную" кучу размером 1Mb, который, при необходимости может
увеличиваться. Память, захватываемая с помощью malloc, calloc, realloc или new
принадлежит этой куче. Но любой поток процесса может создавать (HeapCreate) и
освобождать (HeapDestroy) дополнительные кучи. Каждая куча (в
том числе
стандартная) управляется через собственный дескриптор. Для вновь создаваемой
кучи дескриптор возвращается функцией HeapCreate, дескриптор стандартной кучи
возвращает функция GetProcessHeap, кроме того (только в Windows NT 3.5 и
старше), используя функцию GetProcessHeaps, можно получить массив
дескрипторов для всех куч процесса.
Зная дескриптор кучи, можно захватывать в ней блок памяти (HeapAlloc),
изменять размер захваченного блока (HeapReAlloc) и освобождать
блок (HeapFree),
узнать размер блока, захваченного в куче и адресуемое заданным указателем
(HeapSize). В Windows NT 3.5 и старше, кроме того, можно блокировать
(HeapLock), разблокировать (HeapUnlock), проверять состояние (HeapValidate),
дефрагментировать (HeapCompact) и просматривать информацию об отдельных
блоках кучи (HeapWalk).
Описание функций см. в приложении.
4). Утилита heapwalk (только Windows 9x).
      LPVOID GlobalLock(GLOBALHANDLE hMem);
      BOOL GlobalUnlock(GLOBALHANDLE hMem);

Пример 2.
GLOBALHANDLE h = GlobalAlloc( GHND, 4096 );         //         Перемещаемый,
заполненный
                                                     // нулями блок
int *ptr = (int *)GlobalLock( h );
ptr[100] += 10;
GlobalUnlock( h );
GlobalFree( h );
        См. Help по этим функциям в MSDN и в приложении.
Для определения параметров виртуальной и физической памяти можно
использовать функцию GlobalMemoryStatus:
        VOID GlobalMemoryStatus( LPMEMORYSTATUS lpBuffer );
См. Help по структуре LPMEMORYSTATUS, выдаваемый MSDN, в приложении.
        Блоки памяти перемещаются из памяти в файл подкачки и наоборот
фиксированными порциями - страницами. Размер страницы зависит от аппаратной
платформы, на которой работает Windows. Для архитектуры Intel страницы имеют
размер 4Kb. Узнать (в частности) размер страниц можно с помощью функции
GetSystemInfo см. приложение.
        В Win32 базовыми функциями являются VirtualAlloc и VirtualFree. Они
обеспечивают возможности захвата или резервирования блоков памяти в любом
месте адресного пространства процесса. Но, часто в программе удобнее
использовать простую традиционную схему динамического распределения памяти.
        В Win32 каждый процесс может использовать не одну, но произвольное
количество отдельных куч. Windows обязательно создает для процесса
"стандартную" кучу размером 1Mb, который, при необходимости может
увеличиваться. Память, захватываемая с помощью malloc, calloc, realloc или new
принадлежит этой куче. Но любой поток процесса может создавать (HeapCreate) и
освобождать (HeapDestroy) дополнительные кучи. Каждая куча (в том числе
стандартная) управляется через собственный дескриптор. Для вновь создаваемой
кучи дескриптор возвращается функцией HeapCreate, дескриптор стандартной кучи
возвращает функция GetProcessHeap, кроме того (только в Windows NT 3.5 и
старше), используя функцию GetProcessHeaps, можно получить массив
дескрипторов для всех куч процесса.
        Зная дескриптор кучи, можно захватывать в ней блок памяти (HeapAlloc),
изменять размер захваченного блока (HeapReAlloc) и освобождать блок (HeapFree),
узнать размер блока, захваченного в куче и адресуемое заданным указателем
(HeapSize). В Windows NT 3.5 и старше, кроме того, можно блокировать
(HeapLock), разблокировать (HeapUnlock), проверять состояние (HeapValidate),
дефрагментировать (HeapCompact) и просматривать информацию об отдельных
блоках кучи (HeapWalk).
Описание функций см. в приложении.

                  4). Утилита heapwalk (только Windows 9x).