Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Операционные Системы

.pdf
Скачиваний:
37
Добавлен:
02.03.2016
Размер:
1.94 Mб
Скачать

Лабораторная работа №4. Исследование виртуальной памяти.

Цель занятия

Ознакомиться с устройством виртуальной памяти (ВП) в Windows NT. Научиться:

-получать общесистемную информацию о ВП;

-получать информацию о распределении ВП в процессе;

-использовать механизмы распределения ВП в процессе;

-исследование поведения системы при разных режимах работы.

Теория

В 32-х разрядных Windows виртуальное адресное пространство каждого процесса (ВАП) составляет 4Гб. Соответственно 32-битный указатель может быть числом от 0х00000000 до 0хFFFFFFFF. Всего, таким образом, указатель может принимать 4 294 967 296 значений, что как раз перекрывает диапазон в четыре гигабайта. В разных системах разбиение 4- гигабайтового пространства процесса на разделы осуществляется поразному. Ниже (см. Рисунок 5) показаны структуры виртуальных адресных пространств (ВАП) для Windows 2000 (Professional) и для Windows 2000 Advanced Server или Datacenter с PAE (Phisycal Address Extension) ядром.

64-х разрядные системы Windows оперируют 64-х разрядными указателями адреса, принимающие значения в диапазоне от

0x0000000000000000 до 0xFFFFFFFFFFFFFFFF, что теоретически позволяет адресовать до 264 байтов виртуального пространства. Текущие операционные системы (Windows XP Professional 64x Edition, Windows Server 2003 64x/IA64 Edition, Windows Vista x64/IA64 Edition) в силу ряда обстоятельств ограничивают ВАП размером в 248 байтов, что составляет 16 Тб. Структуризация ВАП в 64-х разрядных системах во многом похожа на структуризацию в рассмотренных 32-х системах: всѐ виртуальное адресное пространство делится на две части, где первые примерно 8192 Гб являются закрытыми виртуальными адресами процесса, остальные примерно 8 Тб

41

являются памятью ядра операционной системы. Windows Vista ввела ещѐ одно новшество в структуризацию ВАП: теперь память ядра не разбивается на статические регионы под различные нужды (кэш, пул подкачиваемой памяти, пул не подкачиваемой памяти, пространство сеанса и т.д.). Напротив, память ядра стала распределяться динамически в соответствие с текущими потребностями системы.

Потребительские версии Windows используют другую структуризацию и здесь не рассматриваются.

00000000

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Код приложения

 

 

 

 

 

 

 

Глобальные

 

 

 

 

 

 

 

переменные

 

 

 

 

 

 

 

Стеки потоков

 

 

 

7FFFFFFF

 

 

 

Код DLL

 

 

 

 

 

 

 

 

80000000

 

 

 

 

 

 

 

 

 

Ядро и исполнительная

 

 

 

 

система

 

 

 

 

HAL

 

 

 

Загрузочные драйверы

С0000000

 

 

 

 

 

 

 

 

 

 

Таблицы страниц

 

 

 

 

процесса

 

 

 

 

Гиперпространство

С0800000

 

 

 

 

 

 

 

 

 

 

Системный кэш

 

 

 

 

Пул подкачиваемой

 

 

 

 

памяти

 

 

 

Пул неподкачиваемой

 

 

 

 

памяти

 

 

 

 

 

 

 

 

 

Рисунок 5. Структура ВАП

 

 

 

 

в Windows 2000

3 – гигабайтное пользовательское пространство

8FFFFFFF

C0000000

1- гигабайтное системное

FFFFFFFF пространство

Рисунок 6. Структура ВАП в Windows 2000 Advanced Server или Datacenter.

Windows NT использует страничную организацию ВП с подкачкой по требованию. Всѐ ВАП и оперативная память (ОП) системы разделены на страницы – минимальный объѐм распределения памяти. Для того, что бы процесс мог что-нибудь записать на страницу ВП она должна быть спроецирована (сопоставлена) на физическую страницу оперативной памяти. При этом смежные страницы в ВАП не обязательно занимают смежные страницы в оперативной памяти (см. Рисунок 5) Размеры ВАП, как правило, значительно превышает доступный объѐм ОП, кроме того в системе может существовать несколько процессов, которым выделено по 4Гб (8192Гб в 64-х

42

разрядных Windows) ВП. При острой нехватке ОП система может вытеснить неиспользуемые страницы ОП на внешний носитель (область подкачки) и спроецировать на них другие страницы ВП. Как только поток процесса попытается получить доступ к вытесненным страницам, происходит прерывание ошибка страницы, которое заставляет ОС загрузить страницу из области подкачки на страницу физической памяти (подкачать). Когда приложение выделяет для себя некоторый объѐм виртуальной памяти, ОС резервирует необходимое место в области подкачки, не проецируя выделенные страницы на оперативную память до первого обращения к ним, так реализуется подкачка по требованию (другое название отложенная подкачка, Lazy Swapping).

Размер страницы зависит от типа микропроцессора (МП). Например, для МП с архитектурой Intel x86 размер страницы равен 4096 байт, для МП Alpha AXP – 8192 байт. Система всегда выделяет память объѐмом, кратным размеру страницы и начиная с адресов кратных гранулярности выделения ресурсов, принятых в ОС. Сейчас для платформы это значение равно 65535.

Для получения информации о параметрах системы (размер страницы, гранулярность выделения ресурсов, начальный доступный виртуальный

 

ВАП

 

 

 

ОП

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

область подкачки

Рисунок 7. Проецирование ВАП на оперативную память.

адрес, конечный доступный виртуальный адрес) можно воспользоваться функцией Windows API GetSystemInfo:

VOID GetSystemInfo(LPSYSTEM_INFO lpSystemInfo);

43

Для получения общесистемной информации о памяти используется функция

GlobalMemoryStatus

VOID GlobalMemoryStatus(LPMEMORYSTATUS lpmstMemStat)

Структура MEMORYSTATUS представлена в приложении.

Управление виртуальной памятью

Система распределяет ВП в два этапа:

Резервирование региона в ВАП. Система резервирует регион, но не выделяет памяти из области подкачки. При попытке обращения к зарезервированной странице происходит нарушение доступа.

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

Распределение ВП осуществляется функцией Windows API VirtualAlloc. Функция позволяет одновременно зарезервировать и передать виртуальную память приложению, защитив регион атрибутами доступа (только чтение, чтение и запись, нет доступа и т.д.). Возвращение памяти системе осуществляется функцией VirtualFree. Функция позволяет либо освободить (RELEASE) весь регион зарезервированной памяти, либо вернуть системе (DECOMMIT) распределѐнную память региона или его части.

В Пример 11 программа резервирует регион памяти в 10 Мб и передаѐт память только первым 12 Кб, обнуляя еѐ. Далее происходит возвращение выделенного региона системе и опять попытка его обнуления. Эта попытка приводит к аварийному завершению работы программы с ошибкой «нарушение доступа».

Примечание: блок __try / __finally гарантирует возвращение памяти системе даже при ошибках в программе11.

11 Подробнее о SEH (Structured Exception Handling) можно прочитать в книге Дж. Рихтера «Windows для профессионалов». 3е, 4е издание.

44

Пример 11. Использование функций распределения ВП.

#define REGION 1024*1024*10 // 10 Mb #define BLOCK 1024*12 // 12 Kb

int main(int argc, char* argv[])

{

//Резервируем регион ВП размером 10 Мб для чтения

изаписи

PBYTE pRegion = (PBYTE) VirtualAlloc(NULL, REGION, MEM_RESERVE, PAGE_READWRITE);

if (pRegion){

__try

{

// Передаѐм части региона 12 Кб памяти

PBYTE pCommited = (PBYTE) VirtualAlloc(pRegion, BLOCK, MEM_COMMIT, PAGE_READWRITE);

// Обнуляем переданную память

if (pCommited) ZeroMemory(pCommited, BLOCK);

//Возвращаем переданную память системе

VirtualFree(pCommited, BLOCK, MEM_DECOMMIT);

//Пытаемся обнулить зарезервированную память

ZeroMemory(pCommited, BLOCK);

}

__finally

{

// Освобождаем зарезервированный регион

VirtualFree(pRegion, 0, MEM_RELEASE);

}

}

return 0;

}

Для у чѐта выделенных и зарезервированных областей ВП в процессе система ведѐт их учѐт с помощью информационных структур VAD (Virtual Address Descriptors)12 для эффективности VAD организованы в виде двоичного дерева с автоматической балансировкой (см. Рисунок 8).

12 См. практическое занятие №2

45

Диапазон: 1000000010000FFF

Атрибут защиты: «для чтения»

Диапазон: 0010000000A00000

Атрибут защиты: «для чтения и записи»

Диапазон: 4E0000004F0000000

Атрибут защиты: «для чтения»

Диапазон: 30000000-

 

Диапазон: 5FFF0000-

3FFFFFFF

 

60000000

Атрибут защиты:

 

Атрибут защиты:

«копирование при записи»

 

«нет доступа»

 

 

 

Рисунок 8. Дескрипторы виртуальных адресов.

Для получения информации о блоке памяти используется функция Windows API VirtualQuery

DWORD VirtualQuery(LPVOID lpAddress, PMEMORY_BASIC_INFORMATIoN lpBuffer, DWORD dwLength)

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

Поле AllocationProtect структуры содержит информацию о защите региона памяти и имеет одно из значений, объединѐнное с атрибутами

PAGE_NOCACHE и/или PAGE_GUARD:

Значение

Пояснение

 

 

PAGE_READONLY

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

 

 

PAGE_READWRITE

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

 

 

PAGE_WRITECOPY

Копирование при записи

 

 

PAGE_EXECUTE

Память только для исполнения кода

 

 

PAGE_EXECUTE_READ

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

 

 

PAGE_EXECUTE_READWRITE

Общедоступный регион

 

 

 

46

PAGE_EXECUTE_WRITECOPY

Общедоступный с копированием при

 

записи

 

 

PAGE_GUARD

Сторожевая страница

 

 

PAGE_NOACCESS

Нет доступа. При попытке обращения

 

происходит нарушение доступа.

 

 

PAGE_NOCACHE

Не кэшировать переданные страницы.

 

 

Поле Type содержит информацию о типе распределѐнной ВП:

Тип

Пояснение

 

 

MEM_IMAGE

Память выделена под выполняемый код

 

 

MEM_MAPPED

Память выделена под проецируемый файл.

 

 

MEM_PRIVATE

Память выделена процессом посредством

 

VirtualAlloc

 

 

Возвращаемое значение: Если функция отработала успешно, то возвращается значение равное значению dwLength (третий параметр).

В Пример 12 программа, по заданному пользователем адресу, определяет, доступен ли он для чтения и записи (атрибут защиты PAGE_READWRITE). Т.к. атрибуты защиты могут комбинироваться с флагами PAGE_NOCACHE и PAGE_GUARD, прямым сравнением PAGE_READWRITE и mbi.Protect

воспользоваться нельзя – это даст неверный результат.

Пример 12. Получение информации о ВП процесса.

int main(int argc, char* argv[])

{

SIZE_T dwAddress=0; MEMORY_BASIC_INFORMATION mbi; DWORD dwSize = sizeof(mbi);

cout << "Введите адрес: "; cin >> dwAddress; if (dwSize==VirtualQueryEx(GetCurrentProcess(),

(LPVOID)dwAddress, &mbi, dwSize)) {

if (mbi.Protect & PAGE_READWRITE) сout << "Регион доступен для чтения и записи" << endl;

else cout << "Регион не доступен для чтения и записи" <<endl; }

return 0;

}

47

Задания и упражнения

1.Напишите программу, получающую общесистемную информацию:

размер страницы;

гранулярность;

начальный и конечный доступный адрес в процессе;

загрузку памяти;

полный и доступный объѐм физической памяти (в МБ);

полный и доступный объѐм области подкачки (в МБ);

полный и доступный объѐм ВАП (в МБ).

Реализуйте в программе периодическое обновление изменяющихся счѐтчиков.

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

Задача: напишите диспетчер кучи, который функционирует на основе стратегии близнецов (twins policy) для распредления памяти в куче. Пусть пользователь имеет две возможности:

Выделить память в куче размером size байтов: void* Allocate(SIZE_T size);

Функция возвращает адрес распределѐнного блока, при невозможности выделить блок заданного размера функция возвращает NULL.

Вернуть память диспетчеру кучи: bool Free(void * pAddress);

Функция возвращает true в случае успешного освобождения блока, false в противном случае.

3.Напишите программу, которая распечатывает карту виртуальной памяти заданного (посредством PID) процесса. Карта включает в себя адрес блока, его размер, атрибуты защиты и тип (см. Пример 13).

Подсказка. Реализуйте цикл, в котором вызывается функция VirtualQuery. Функция начинает с младшего адреса, доступного для процесса. На

48

каждой итерации в функцию передаѐтся адрес больше предыдущего на значение RegionSize (см. структуру MEMORY_BASIC_INFORMATION).

Пример 13. Распечатка карты ВП процесса.

 

 

 

 

Формат атрибутов защиты:

Protect

:-R-- --

Base Address

:0x00400000

_ _ _ _ _ _

Allocation Base:

:0x00401000

ERWC GN

Protect

:-R-- --

 

E–execute

State

:MEM_COMMIT

 

R—read

Type

:MEM_IMAGE

 

W—write

 

 

Protect

:ER-- --

 

C—copy

 

 

Base Address

:0x00400000

G—guard

 

 

Allocation Base: :0x00406000

N—no cache

 

 

Region Size

:0x2000

 

 

State

:MEM_COMMIT

 

 

Type

:MEM_IMAGE

 

 

 

 

 

 

Контрольные вопросы

1.Чем ограничивается максимальный размер виртуального адресного пространства, доступного приложению.

2.Что такое «виртуальный адрес», «виртуальное адресное пространство»?

3.Что значит термин «плоская модель памяти»? В чѐм заключаются достоинства и недостатки этой модели?

4.Сравните сегментный и страничный способы организации ВП. Перечислите достоинства и недостатки каждого.

5.Какие задачи решает механизм VAD в ОС Windows 2000?

6.Может ли прикладной процесс использовать системную часть виртуальной памяти?

7.Какое из этих двух утверждений верно?

a)все виртуальные адреса заменяются на физические во время загрузки программы в оперативную память;

b)виртуальные адреса заменяются на физические во время выполнения программы в момент обращения по данному виртуальному адресу.

4.Что такое виртуальная память? Какой из следующих методов распределения памяти может рассматриваться как частный случай виртуальной памяти?

49

a)распределение фиксированными разделами;

b)распределение динамическими разделами;

c)страничное распределение;

d)сегментное распределение;

e)сегментно-страничное распределение.

5.Распределение памяти перемещаемыми разделами основано на применении процедуры сжатия. Имеет ли смысл использовать данную процедуру при страничном распределении? А при сегментном?

6.Расскажите о структуризации ВАП в операционных системах Windows 2000, Windows 9.x, UNIX и OS/2. На что влияет тот или иной способ структуризации?

7.Поясните разные значения термина «свопинг».

8.Как величина файла подкачки влияет на производительность системы?

9.Почему размер страницы выбирается равным степени двойки? Можно ли принять такое же ограничение для сегмента?

10.На что влияет размер страницы? Каковы преимущества и недостатки большого размера страницы?

11.Расскажите о поддержке сегментной организации виртуальной памяти в МП 80386.

12.Расскажите о страничном механизме МП 80386.

13.Где хранятся таблицы страниц и таблицы сегментов?

14.Чем определяется количество таблиц сегментов, имеющихся в операционной системе в произвольный момент времени?

15.Какие характеристики содержит таблица сегментов и таблица страниц при сегментно-страничной организации памяти?

16.Изложите четыре задачи управления виртуальной памятью.

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

18.В кэше хранятся данные, которые наиболее активно используются в последнее время. Каким образом система определяет, какие данные должны быть загружены в кэш?

19.Что такое «рабочее множество»? Что позволяет разрешить реализация этого понятия?

20.Какие дисциплины применяются для решения задачи замещения страниц?

Какие из них наиболее эффективны?

50