Изучение организации памяти и функций управления памятью: Методические рекомендации по выполнению лабораторной работы, страница 2

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

Для управления работой MMU служит функция API Windows VirtualAlloc. Это основной способ управления памятью в Win32. Функция резервирует или выделяет область страничной памяти в виртуальном адресном пространстве вызывающего функцию процесса. Память, выделяемая функцией, автоматически инициализируется нулем.  Синтаксис функции:

LPVOIDVirtualAlloc(

                 LPVOID  lpAddress,                 // адрес области памяти

     DWORD  dwSize,                     //  размер области

     DWORD   flAllocationType,    // тип  выделения

     DWORD   flProtect                  //  тип уровня защиты

).

Параметры  функции

            lpAddress  - специфирует начальный адрес выделяемой памяти, если этот параметр имеет значение NULL, то сама ОС определяет адрес выделяемой памяти;

dwSizeопределяет размер областив байтах, размер округляется до числа, кратного размеру страницы;

flAllocationType– определяет тип распределения памяти, параметр может принимать значения : MEM_COMMIT – выделение памяти, MEM_RESERVE – резервирует область памяти без выделения памяти,  MEM_TOP_DOWN – выделяет память с самого старшего возможного адреса;

flProtect – определяет тип уровня защиты выделяемой памяти, в таблице 1 приведены допустимые значения констант уровня защиты.

Таблица 1. Константы уровня защиты

Константа

Значение

PAGE_READONLY

PAGE_READWRITE

PAGE_WRITECOPY

PAGE_EXECUTE

PAGE_EXECUTE_READ

PAGE_EXECUTE_READWRITE

PAGE_NOACCESS

PAGE_NOCACHE

PAGE_GUARD

Память выделяется только для чтения

Память выделяется для чтения и для записи

После окончания записи страница заменяется её новой копией

Разрешается исполнение программного кода, расположенного в выделяемой памяти

Разрешается исполнение программного кода и чтение данных

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

Запрещается любой доступ к выделенной памяти

Запрещается кэширование страниц

Страницы в выделяемой памяти становятся «сторожевыми» - режим «тревога_при_первом_обращении». При попытке чтения или записи данных в такой странице ОС инициирует исключение STATUS_GUARD_PAGE  и сбрасывает статус сторожевой страницы

Чаще всего при выделении памяти используется значение PAGE_READWRITE. Функция  VirtualAlloc позволяет не только выделить участок памяти, но и просто резервировать его. Если в третьем аргументе использовать флаг MEM_RESERVE, то функция только зарезервирует  память, повторное обращение к VirtualAlloc с флагом MEM_COMMIT позволит выделить ту или иную часть из зарезервированного пространства. Однако нельзя повторно зарезервировать ранее зарезервированный участок памяти.

По сравнению с функцией malloc или оператором new функция VirtualAllocвозвращаетосвобождаемую память под контроль операционной системы и благодаря параметру flProtect обеспечиваетвыделенный блок памяти или его участки специальным атрибутом, например, только для чтения.

Для изменения уровня защиты страниц выделенного участка памяти можно использовать системный вызов VirtualProtect.

 Функция VirtualQuery() служит для получения информации об уровне защиты некоторой страницы или набора страниц.

Функция  VirtualFree() освобождает или отменяет выделение памяти , специфицированной вызовом VirtualAlloc().  Синтаксис этой функции:

BOOL   VirtualFree(

   LPVOID  lpAddress,       //  адрес области памяти

   DWORD  dwSize,          //  размер области

   DWORD  dwFreeType  //  тип операции освобождения

).

Первые два параметра этой функции – те же, что и для функции VirtualAlloc(). Третий параметр dwFreeType определяет тип операции освобождения. Возможные значения этого параметра – MEM_DECOMMIT отменяет выделение региона памяти, но не отменяет резервирование, MEM_RELEASE освобождает специфицированный регион зарезервированной памяти, при этом  параметр dwSize должен иметь значение 0.

Пример программы, демонстрирующей использование функции VirtualAlloc(), приведен в Приложении 4. Данная программа выводит простое меню. При выборе пункта 1 функция VirtualAlloc() выделит блок памяти запрашиваемого размера, а функция VirtualFree() освободит его. По умолчанию размер блока памяти, установленный константой MEMORYSIZE,  равен 15 Мбайт. Размер выделяемой памяти можно также задать параметром командной строки при запуске программы. Если выбрать в меню пункт 2, то программа просто зарезервирует память требуемого размера, но не выделит её. При выборе пункта 3 программа резервирует память установленного размера и выделяет один мегабайт из зарезервированного объема.

Windows предоставляет ещё ряд системных вызовов для работы с несколькими кучами свободной памяти. Эти вызовы перечислены в таблице 2.

Таблица 2. Системные функции для работы с несколькими кучами свободной памяти

Функция

Назначение

HeapCreate

HeapAlloc

HeapDestroy

HeapFree

GetProcessHeap

HeapReAlloc

HeapSize

HeapValidate

Создание новой кучи

Выделение блока памяти в куче

Уничтожение кучи

Освобождение блока памяти в куче

Получение дескриптора стандартной кучи процесса

Изменение размера блока памяти, выделенного в куче

Возвращает размер блока памяти, выделенного в куче

Тестирует целостность кучи

Более детальные сведения о функциях, перечисленных в таблице 2 можно найти в справочной системе Help Windows API.

3.  ЗАДАНИЕ  И  ПОРЯДОК  ВЫПОЛНЕНИЯ  РАБОТЫ

1.  Ознакомьтесь с программами, приведенными в Приложениях 1 и 2. Если те или иные операторы (функции) для работы с динамической памятью в программах на языках С и С++ вызывают затруднения, то научитесь их практическому применению с помощью соответствующих программ.

2.  Изучите функции ОС MS-DOS для управления памятью:  48h,  49h  и  4Ah  INT 21h. Составьте и выполните программу, в которой используются эти функции.

3.  Изучите назначение и синтаксис основных  функций Windows API для управления памятью: VirtualAlloc() и VirtualFree(). Ознакомьтесь с демонстрационным примером использованием этих функций в программе Приложения 4.  Выполните программу с изменением  её параметров.

4.  Составьте и выполните программу по индивидуальному заданию.

5.  Оформите отчет, проверьте подготовку  по контрольным вопросам и защитите работу.

4.   КОНТРОЛЬНЫЕ    ВОПРОСЫ

1.  Сформулируйте основные функции управления памятью операционной системы.

2.  Каковы основные различия организации и управления памятью в многозадачных и однозадачных ОС?

3.  Каким образом ОС MS-DOS поддерживает распределение памяти?

4.  Поясните обращение к функциям 48h и  49h  INT 21h  в программах для MS-DOS.