Программное обеспечение САПР. Операционные системы. Майстренко Н.В - 19 стр.

UptoLike

этогоустановить соответствующий элемент в обоих каталогах страниц на одну и ту же таблицу страниц и, следовательно,
на один и тот же страничный блок. Таким образом, процессы могут совместно использовать физическую память.
Кучи памяти в 32-разрядной ОС Windows
При создании процесса Windows назначает ему кучу по умолчанию, т.е. изначально резервирует область виртуальной
памяти объемом 1 Мб. Тем не менее, при необходимости система будет регулировать размер кучи, которая используется
самой Windows для различных целей.
API-функция GetProcessHeap используется для получения дескриптора кучи. При помощи функции HeapCreatе, воз-
вращающей дескриптор кучи, программист может создавать дополнительные кучи.
Есть несколько причин создавать дополнительные кучи вместо того, чтобы использовать кучу по умолчанию. Напри-
мер, те кучи, которые предназначены для конкретных задач, часто оказываются более эффективными. Кроме того, ошибки
записи данных в кучу, память для которой выделена из специализированной кучи, не затронут данных других куч. Наконец,
выделение памяти из специализированной кучи в общем случае будет означать, что данные в памяти упакованы более плот-
но друг к другу, а это может уменьшить потребность в загрузке страниц из файла подкачки. Следует также упомянуть, что
доступ к куче упорядочен, т.е. система заставляет каждый поток, пытающийся обратиться к памяти кучи, дожидаться своей
очереди, пока другие потоки не закончат производимые операции. Следовательно, только один поток в каждый момент вре-
мени может выделять или освобождать память кучи во избежание неприятных конфликтов.
Функции работы с кучей
Для работы с кучами используются следующие функции:
1. GetProcessHeap возвращает дескриптор кучи процесса по умолчанию;
2. GetProcessHeaps возвращает список дескрипторов всех куч, используемых в данный момент процессом.
3. HeapAlloc выделяет блок памяти из заданной кучи.
4. HeapCompact дефрагментирует кучу, объединяя свободные блоки; может также освобождать неиспользуемые стра-
ницы памяти кучи.
5. HeapCreate создает новую кучу в адресном пространстве процесса.
6. HeapDestroy удаляет заданную кучу.
7. HeapFree освобождает предварительно выделенные блоки памяти кучи.
8. HeapLock блокирует кучу, при использовании данной функции только один поток имеет к ней доступ. Другие потоки,
запрашивающие доступ, переводятся в состояние ожидания до тех пор, пока поток, владеющий кучей, не разблокирует ее. Это
одна из форм синхронизации потоков, т.е. тот прием, которым система реализует упорядоченность доступа.
9. HeapReAlloc перераспределяет блоки памяти кучи. Используется для изменения размера блока.
10. Heapsize возвращает размер выделенного блока памяти кучи.
11. HeapUnlock разблокирует кучу, которая до этого была заблокирована функцией HeapLock.
12. HeapValidate проверяет пригодность кучи (или отдельного ее блока), если имеются ли какие-либо повреждения.
13. HeapWalk позволяет программисту просматривать содержимое кучи. Обычно используется при отладке.
Отображения виртуальной памяти
Функция Win32 API VirtualQuery может использоваться для получения информации о состоянии адресов виртуальной
памяти. Синтаксис ее таков:
DWORD VirtualQuery(
LPCVOID IpAddress, // Адрес области.
PMEMORY_BASICONFORMATION IpBuffer, // Адрес информационного
// буфера.
DWORD dwLength // Размер буфера.
);
Используется также функция VirtualQueryEx, расширенная версия VirtualQuery, которая позволяет получать информа-
цию о внешних виртуальных адресных пространствах:
DWORD VirtualQueryEx(
HANDLE hProcess // Дескриптор процесса.
LPCVOID IpAddress, // Адрес области.
MEMORY_BASIC_INFORMATION IpBuffer, // Адрес информационного
// буфера.
DWORD dwLength // Размер буфера.
);
Параметр hProcess это дескриптор процесса. Параметр IpAddress это начальный адрес для записи результирующих
данных, который будет округляться в меньшую сторону до ближайшего кратного размеру страницы (4 Кб). Обе функции воз-
вращают информацию в следующую структуру:
Struct MEMORY_BASIC_INFORMATION {
PVOID BaseAdciress; // Базовый адрес области.
PVOID AllocationBase; // Базовый адрес выделенной
// области.
DWORD AllocationProtect; // Первоначальная защита от
// доступа.