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

UptoLike

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

(освобождения) блока. Более того, VirtualAlloc() позволяет размещать блок по
указанным (свободным) адресам (с учетом выравнивания на границу страницы) и
задавать для него уровень доступа, т.е. обеспечивает уровень управления
недоступный для функций динамического распределения памяти в MS DOS и MS
Windows 3.x. С другой стороны это усложняет работу по динамическому
распределению памяти. Иногда старая, простая дисциплина
работы с некоторой
"кучей" более удобна. И программист может использовать ее в программе. Для
этого существует набор функций работы с "кучами" (HeapCreate(), HeapAlloc() и
т.д.). Эти функции позволяют создать в программе несколько куч. Но, в любом
случае, процесс окажется владельцем хотя бы одной кучи. Эту кучу не нужно
создавать и нельзя
уничтожить, но стандартные функции malloc(), calloc() и т.д. и
операции new, delete распределяют память из этой кучи.
I. Имена, используемые в Windows для указателей и дескрипторов.
Application Programming Interface (API) включает в себя, помимо функций,
также большой набор имен для различных типов данных - синонимов для
стандартных типов и новых имен для новых составных типов. Каждая Windows-
программа содержит файл
windows.h "... поскольку он определяет очень широкий
набор констант, структур, макросов и функций, которые составляют скелет всех
Windows-программ". "Внутри windows.h вы найдете объявления ... большинства
функций и типов среды Windows". "windows.h - это место, где объясняются многие
таинства" [2]. Структура файла windows.h для новых (после 3.x) версий Windows
изменилась радикально. Теперь это небольшой файл, в который помещаются
директивы #include. Сами же определения
разбросаны по многим .h-файлам.
Поэтому для поиска нужной информации удобно использовать утилиты типа
grep.exe из пакета Borland C++.
ЗАДАНИЕ 1
. Найдите в файлах windows.h, windef.h и т.п. объявления имен
UINT, LPSTR, HANDLE, HINSTANCE, DWORD, HGLOBAL, LPVOID, BOOL,
GLOBALHANDLE и запишите как, в конечном счете, соответствующие
описания выражаются через стандартные типы языка Си. Попробуйте
определить назначение именованной константы STRICT.
II. Динамическое распределение памяти.
При запросе на динамическое выделение блока памяти указывается тип
блока: фиксированный (fixed), перемещаемый (movable) или удаляемый
(снимаемый, отбрасываемый) (discardable). Фиксированный
блок памяти Windows
может перемещать в физической памяти, но его виртуальный адрес остается
неизменным. Приложение имеет дело только с виртуальными адресами, поэтому
для работы с таким блоком можно использовать указатель, не интересуясь его
дескриптором. Movable-блок может быть перемещен Windows как в физическом,
так и в виртуальном адресном пространстве (чтобы избежать фрагментации
виртуальной памяти
). Неизменным останется лишь дескриптор блока. Поэтому при
работе с перемещаемым блоком памяти нужно сначала его заблокировать (вызвав
функцию GlobalLock см. ниже). Это приведет, во-первых, к фиксации виртуальных
адресов ячеек блока, во-вторых, функция вернет указатель на начало блока и, в-
(освобождения) блока. Более того, VirtualAlloc() позволяет размещать блок по
указанным (свободным) адресам (с учетом выравнивания на границу страницы) и
задавать для него уровень доступа, т.е. обеспечивает уровень управления
недоступный для функций динамического распределения памяти в MS DOS и MS
Windows 3.x. С другой стороны это усложняет работу по динамическому
распределению памяти. Иногда старая, простая дисциплина работы с некоторой
"кучей" более удобна. И программист может использовать ее в программе. Для
этого существует набор функций работы с "кучами" (HeapCreate(), HeapAlloc() и
т.д.). Эти функции позволяют создать в программе несколько куч. Но, в любом
случае, процесс окажется владельцем хотя бы одной кучи. Эту кучу не нужно
создавать и нельзя уничтожить, но стандартные функции malloc(), calloc() и т.д. и
операции new, delete распределяют память из этой кучи.

       I. Имена, используемые в Windows для указателей и дескрипторов.
        Application Programming Interface (API) включает в себя, помимо функций,
также большой набор имен для различных типов данных - синонимов для
стандартных типов и новых имен для новых составных типов. Каждая Windows-
программа содержит файл windows.h "... поскольку он определяет очень широкий
набор констант, структур, макросов и функций, которые составляют скелет всех
Windows-программ". "Внутри windows.h вы найдете объявления ... большинства
функций и типов среды Windows". "windows.h - это место, где объясняются многие
таинства" [2]. Структура файла windows.h для новых (после 3.x) версий Windows
изменилась радикально. Теперь это небольшой файл, в который помещаются
директивы #include. Сами же определения разбросаны по многим .h-файлам.
Поэтому для поиска нужной информации удобно использовать утилиты типа
grep.exe из пакета Borland C++.

ЗАДАНИЕ 1. Найдите в файлах windows.h, windef.h и т.п. объявления имен
UINT, LPSTR, HANDLE, HINSTANCE, DWORD, HGLOBAL, LPVOID, BOOL,
GLOBALHANDLE и запишите как, в конечном счете, соответствующие
описания выражаются через стандартные типы языка Си. Попробуйте
определить назначение именованной константы STRICT.

                   II. Динамическое распределение памяти.
      При запросе на динамическое выделение блока памяти указывается тип
блока: фиксированный (fixed), перемещаемый (movable) или удаляемый
(снимаемый, отбрасываемый) (discardable). Фиксированный блок памяти Windows
может перемещать в физической памяти, но его виртуальный адрес остается
неизменным. Приложение имеет дело только с виртуальными адресами, поэтому
для работы с таким блоком можно использовать указатель, не интересуясь его
дескриптором. Movable-блок может быть перемещен Windows как в физическом,
так и в виртуальном адресном пространстве (чтобы избежать фрагментации
виртуальной памяти). Неизменным останется лишь дескриптор блока. Поэтому при
работе с перемещаемым блоком памяти нужно сначала его заблокировать (вызвав
функцию GlobalLock см. ниже). Это приведет, во-первых, к фиксации виртуальных
адресов ячеек блока, во-вторых, функция вернет указатель на начало блока и, в-