Описание 5 основных интерфейсов API функций управления памятью в Windows.

Для управления памятью, прикладным программам предоставляются различные интерфейсы: (первые 3 применимы в наст.время):

· VirtualMemoryAPI – набор ф-ий, позволяющих приложению работать с вирт. адресным пространством: назначать физические страницы блоку адресов и освобождать их, устанавливать атрибуты защиты.

· MemoryMappedFileAPI – наборф-ий, позволяющих работать с файлами, отображаемыми в память; новый механизм, предоставляемый Win32API для работы с файлами и взаимодействия процессов;

· HeapMemoryAPI – набор ф-ий, позволяющих работать с динамически распределяемыми областями памяти (кучами).

· Local, GlobalMemoryAPI – набор ф-ий для работы с памятью, совместимых с х16 Windows (уже не используются).

· CRTMemoryAPI – ф-ии стандартной библиотеки языка С периода исполнения (runtime).

Интерфейс Virtual Memory.

VirtualMemoryAPI – набор ф-ий, позволяющих приложению работать с вирт. адресным пространством: назначать физические страницы блоку адресов и освобождать их, устанавливать атрибуты защиты.

Блок адресов адресного пространства процесса может нах-ся в одном из состояний:

-выделен (commited) – блоку адресов назначена физическая память, либо часть файла подкачки

-зарезервирован (reserved) – блок адресов помечен как занятый, но физическая память не распределена

-свободен (free) – блок адресов не выделен и не зарезервирован

При выделении память обнуляется.

Память сначала резервируется, потом выделяется.

VirtualAlloc () – выделяет память. Его параметры определяют: размер выделяемой памяти (не более 1 Гб), где в адресном пр-ве расположить выделенный фрагмент, надо ли закреплять физическую память, вид устанавливаемой защиты. Резервирует память фрагментами 64 кб, а закрепляет ее фрагментами объемом 1 страницу (4 кб).

VirtualProtect() –позволяет изменять атрибуты защиты в адресном пространстве текущего процесса.

VirtualProtectEx() –позволяет изменять атрибуты защиты в адресном пространстве произвольного процесса.

VirualQuery() – заполняет поля структуры информацией о заданном блоке памяти.

GlobalMemoryStatus() – определяет размер и свободный объем физической памяти, страничного файла и текущего адресного пространства.

GetSystemInfo() – возвращает размер системной физической страницы.

Страницы можно блокировать в памяти (запрет на их вытеснение в файл подкачки) VirtualLock(), VirtualUnlock().

По завершении процесса ОС отменяет блокировку, освобождает использованную им память.

VirtualFree() – отменяет закрепление набора страниц, оставляя их адреса зарезервированными или освобождает память занимаемую этими страницами(даже заблокированные страницы).

Интерфейс Memory mapped file.

MemoryMappedFileAPI – набор ф-ий позволяющих работать с файлами, отображаемыми в память; новый механизм, предоставляемый Win32APIдля работы с файлами и взаимодействия процессов.

1. Исп-ся для запуска .exeи .dll.

VMMприменяется для:

-создания адресного простр-ва (размером 4 Гб)

-резервирование региона

-из ехефайластраницызагружаются в регион

-отображение в регион необходимыхdll.

2. Для работы с файлами.

-создается объект ядра «файл». CreateFile()

-создается объект ядра «проецируемый файл» CreateFileMapping(). Возвращает Handle.

-проецирование файла в вирт.память MapViewOfFile().

-убрать проецирование в память: UnmapViewFile().

Уничтожение объектов «файл», «проецируемый файл» - CloseHandle().

3. Для одновременного использования одной области данных несколькими процессами.

2 процесса могут использовать совместно, объект «проецируемый файл». При помощи MapViewOfFile() каждый процесс проецирует этот объект на свое адресное пространство и использует эту часть адресного пространства как разделяемую область данных.

Описание 5 основных интерфейсов API функций управления памятью в Windows. - student2.ru

Интерфейс Heap Memory.

HeapMemoryAPI – набор ф-ий, позволяющих работать с динамически распределяемыми областями памяти (кучами).

Куча – блок памяти, из которого прога при необходимости выделяет себе более мелкие фрагменты.

Причины группировки выделенных блоков:

-позволяет отделить и защитить группу связанных блоков.

-если все узлы связного списка находятся в одной куче, а узлы двоичного дерева – в другой, то ошибка одного алгоритма в меньшей степени скажется на работе другого алгоритма.

-объекты памяти, работающие совместно могут быть сгруппированы => подкачка страниц сводится к минимуму.

GetProcessHeap() – получить дескриптор стандартной кучи (по умолчанию) памяти.

HeapCreate() – создает кучу. В параметрах указывается начальный размер кучи и максимальный размер кучи (если он =0, то размер кучи ограничивается объемом доступной памяти).

HeapAlloc() – выделение блоков памяти из кучи.

HeapReAlloc() – повторное выделение…(изменение размера блока, после его выделения).

HeapFree() – освобождение блоков памяти.

HeapSize() –узнать точный размер любого блока.

HeapDestroy() – уничтожение «кучи».

Наши рекомендации