Описание 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() каждый процесс проецирует этот объект на свое адресное пространство и использует эту часть адресного пространства как разделяемую область данных.
Интерфейс Heap Memory.
HeapMemoryAPI – набор ф-ий, позволяющих работать с динамически распределяемыми областями памяти (кучами).
Куча – блок памяти, из которого прога при необходимости выделяет себе более мелкие фрагменты.
Причины группировки выделенных блоков:
-позволяет отделить и защитить группу связанных блоков.
-если все узлы связного списка находятся в одной куче, а узлы двоичного дерева – в другой, то ошибка одного алгоритма в меньшей степени скажется на работе другого алгоритма.
-объекты памяти, работающие совместно могут быть сгруппированы => подкачка страниц сводится к минимуму.
GetProcessHeap() – получить дескриптор стандартной кучи (по умолчанию) памяти.
HeapCreate() – создает кучу. В параметрах указывается начальный размер кучи и максимальный размер кучи (если он =0, то размер кучи ограничивается объемом доступной памяти).
HeapAlloc() – выделение блоков памяти из кучи.
HeapReAlloc() – повторное выделение…(изменение размера блока, после его выделения).
HeapFree() – освобождение блоков памяти.
HeapSize() –узнать точный размер любого блока.
HeapDestroy() – уничтожение «кучи».