Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОС / Методические рекомендации по выполнению лабораторных работ.doc
Скачиваний:
243
Добавлен:
11.04.2015
Размер:
1.17 Mб
Скачать

Лабораторная работа № 5. Управление виртуальной памятью вWindowsприложениях вWin32api Цель работы

  1. Изучение функций управления виртуальной памятью процесса в Windows приложениях.

  2. Изучение функций механизма отображения файлов в память в Windows приложениях.

  3. Изучение функций управления динамически распределяемой памятью в Windows приложениях.

  4. Овладение навыками использования функций по управлению памятью при разработке Windows приложений.

Краткие теоретические сведения

Операционные системы, основанные на Win32, реализуют три механизма управления с памятью:

  • виртуальная память (virtual memory) – наиболее подходящая для операций с большими массивами объектов или структур;

  • файлы, проецируемые в память (memory-mapped files) – наиболее подходящие для операций с интенсивными потоками данных (обычно из файлов) и для обеспечения процессам совместного доступа к данным;

  • кучи (heaps) – наиболее подходящие для операций с большим количеством малых объектов.

Виртуальная память процесса может находиться в одном из трех состояний:

  • свободная – память, которая может быть зарезервирована или размещена;

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

  • размещенная – память, которая была зарезервирована и которой выделена физическая память.

Адресное пространств, выделенное процессу в момент создания, практически все свободно (не зарезервировано). Чтобы воспользоваться какой-либо его частью, нужно выделить в нем определенную область – зарезервировать регион. Регион всегда состоит из целого числа страниц и начинается с 64-килобайтной страницы (по объему может быть меньше 64 Кбайт). Для использования зарезервированного региона ему нужно выделить физическую память и спроецировать ее на этот регион. Такая операция называется передачей физической памяти (размещением). Физическая память может быть передана и не всему региону, а лишь части его страниц. Если физическая память региону больше не нужна, она может быть освобождена. Региону могут быть назначены любые допустимые атрибуты защиты.

Основные функции управления виртуальной и физической памяти:

  • VirtualAlloc – зарезервировать или фиксировать область;

  • VirtualFree – освободить область или отменить фиксацию области;

  • VirtualProtect – изменить режим доступа к области;

  • VirtualQuery – узнать состояние области;

  • VirtualLock – сделать область резидентной в памяти (запрещает вытеснение этой области в страничный файл);

  • VirtualUnlock – разрешить выгрузку области в страничный файл;

Как и виртуальная память, проецируемые файлы позволяют резервировать регион адресного пространства и передавать ему физическую память. Различие между этими механизмами заключается в том, что в последнем случае физическая память не выделяется из страничного файла, а берется из файла, уже находящегося на диске. Как только файл спроецирован в память, к его данным можно обращаться так, будто он целиком в неё загружен, то есть по указателям.

Проецируемые файлы применяются в следующих случаях:

  • загрузка и выполнение EXE- и DLL- файлов. Это позволяет существенно экономить как на размере страничного файла, так и на времени, необходимом для подготовки приложения к выполнению;

  • организация доступа к файлу данных, размещенному на диске. При этом можно исключить операции файлового ввода-вывода и буферизацию его содержимого;

  • разделение данных между несколькими процессами, выполняемыми на одной машине.

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

Закончив работу с проецируемым в память файлом, следует выполнить следующие операции: отменить проецирование на адресное пространство процесса объекта ядра «проекция файла»; закрыть объект «проекция файла»; закрыть объект «файл».

Функции механизма отображения файла в память:

  • CreateFile – открыть или создать файл;

  • CreateFileMapping – выделить адресное пространство виртуальной памяти для отображения открытого файла, то есть создать проекцию файла;

  • MapViewOfFile – спроецировать файл или его часть на адресное пространство процесса;

  • MapViewOfFileEx – то же;

  • OpenFileMapping – получить доступ к проекции файла, созданном в другом процессе;

  • FlushViewOfFile – записать на диск все измененные страницы;

  • UnmapViewOfFile – отключить файл от адресного пространства процесса;

  • CloseHandle – закрыть проекцию файла либо файл.

Куча (динамически распределяемая область памяти) – это регион зарезервированного адресного пространства. Первоначально большей его части физическая память не передается. По мере того как программа занимает эту область под данные, специальный диспетчер, управляющий кучами (heap manager), постранично передает ей физическую память из страничного файла. При освобождении блоков в куче диспетчер возвращает системе соответствующие страницы физической памяти. Преимущество динамически распределяемой памяти заключается в том, что она позволяет игнорировать гранулярность выделения памяти и размер страниц и сосредоточиться непосредственно на задаче. Кучи часто используются для обработки списков и деревьев. Недостатком куч является более медленное выделение и освобождение памяти.

Основные функции по управлению динамически распределяемой области памяти:

  • HeapCreate – создать кучу;

  • HeapAllocate – выделить блок памяти в куче;

  • HeapReAllocate – изменить размер блока памяти в куче;

  • HeapFree – освободить блок памяти в куче;

  • GetProcessHeap – получить дескриптор кучи процесса;

  • GlobalAlloc – выделить блок памяти (из кучи процесса);

  • GlobalReAlloc – изменить размер блока памяти;

  • GlobalSize – возвратить размер блока памяти;

  • GlobalLock – зафиксировать блок памяти;

  • GlobalUnlock – снять фиксацию блока памяти;

  • GlobalFree – освободить блок памяти.

Информацию о памяти можно получить вызовом функций GetSystemInfo и GlobalMemoryStatus.