Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
sp.docx
Скачиваний:
1
Добавлен:
01.03.2025
Размер:
213.38 Кб
Скачать

37. Виртуальное адресное пространство, управление памятью.

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

Без использования виртуальной памяти все выделенные фрагменты, в т.ч. образы процессов, постоянно находятся в физическом оперативном ЗУ. Принципиально эта ситуация более простая, но налагает ограничения на доступное адресное пространство либо приводит к неэффективному использованию аппаратуры. Характерна для однозадачных систем с небольшими ресурсами. В рамках группы выделяются следующие основные способы.

1. Распределение фиксированными разделами. Простейший способ, адресное пространство делится заранее, и в дальнейшем разбивка сохраняется. Применяется ранняя настройка адресов.

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

3. Перемещаемые разделы. Выделенные разделы могут перемещаться в физическом адресном пространстве, что позволяет решить проблему фрагментации и “уборки мусора”. Еще более усложняются алгоритмы и повышается гибкость. Необходима поздняя настройка адресов.

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

1. Страничное распределение. Страница представляет собой блок фиксированного небольшого (1-8 Кбайт) размера, причем память выделяется только целыми страницами. Адресное пространство, таким образом, представляется как каталог страниц, возможно, не единственный, а виртуальные (логические) адреса состоят из идентификатора (индекса) страницы и смещения в странице. Преобразование может быть и многоступенчатым. Страницы могут свободно перемещаться в памяти, при этом виртуальные адреса не изменяются, но корректируется заполнение системных таблиц.

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

3. Странично-сегментное. Комбинация предыдущих. На верхнем уровне выделения памяти используются сегменты, однако каждый из них представляется как набор страниц.

Виртуальное адресное пространство процесса.

В Win32 API используется плоская 32-разрядная модель памяти. Каждому процессу выделяется собственное “личное” (private) изолированное адресное пространство, размер которого составляет 4 Гбайт. Это пространство разбивается на регионы, немного отличные для Windows 95 и Windows NT. Общим для обеих систем является то, что нижние 2 Гбайт этого пространства отведены процессу для свободного использования, а верхние 2 Гбайт зарезервированы для использования операционной системой.

Регионы в адресном пространстве процесса Windows 95

Регионы в адресном пространстве процесса Windows NT

Windows NT лучше защищена от процессов пользователя, чем Windows 95. Это обуславливает большую устойчивость ОС к ошибкам в прикладной программе.

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

voidmain()

{

DWORDSysAreaAddress = 0xC0000000; // начало старшего гигабайта

while (1) {

ZeroMemory ( (LPVOID)SystemAreaAddress, 0x1000); //запись

SysAreaAddress += 0x1000; // переход к следующей странице (4K)

}

}

Под Win 9x, где защита системной области памяти не предусмотрена, выполнение программы приводит к краху системы, так как жизненно важное содержимое будет уничтожено. Windows NT такую защиту имеет, поэтому генерирует исключение и снимает программу как неправильную или вредоносную. (В качестве самостоятельного упражнения предлагается модифицировать программу таким образом, чтобы вместо аварийного завершения выводилось сообщение о возникшем исключении.)

Примечание. Помимо прочего, этот пример наглядно демонстрирует особенность "плоского" виртуального адресного пространства: произвольное 32-разрядное число может использоваться в качестве áдреса.

Управление виртуальной памятью осуществляет Virtual Memory Manager (VMM), являющийся неотъемлемой частью ядра операционной системы.

Организация памяти в Win32 страничная, размер страниц для платформ Intel и MIPS составляет 4 Kбайт, для DEC Alpha – 8 Kбайт. Win32 использует двухступенчатую схему страничного преобразования, поддерживаемую процессорами i386, 486 и Pentium, дополнительные схемы, поддерживаемые Pentium Pro, не используются.

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

– страница существует и находится в памяти;

– страница существует и выгружена на диск;

– страница не существует.

Выделение памяти процессу означает выделение ее в файле подкачки.

Запуск на исполнение EXE-модуля происходит следующим образом. EXE-файл проецируется на память. При этом он не переписывается в файл подкачки. Просто элементы каталога и таблиц страниц настраиваются так, чтобы они указывали на EXE-файл, лежащий на диске. Затем передается управление на точку входа программы. При этом возникает исключение, обрабатывая которое стандартным образом, VMM загружает в память требуемую страницу и программа начинает исполняться. Такой механизм существенно ускоряет процедуру запуска программ, так как загрузка страниц EXE-модуля происходит по мере необходимости. Образно говоря, программа сначала начинает исполняться, а потом загружается в память. (Однако если исполняемый файл находится на съемном носителе, то перед началом исполнения он все равно переписывается в файл подкачки целиком.)

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

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

2) Memory Mapped File API – набор функций, позволяющий работать с файлами, отображаемыми в память. Новый механизм, предоставляемый Win32 API для работы с файлами и взаимодействия процессов. Подробно рассматривается в подразд. 4.5.

3) Heap Memory API – набор функций, позволяющих работать с динамически распределяемыми областями памяти (кучами). Подробно рассматривается в подразд. 4.6.

4) Local, Global Memory API – набор функций работы с памятью, совместимых с 16-битной Windows. Следует избегать их использования.

5) CRT Memory API – функции стандартной библиотеки периода исполнения (runtime).

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]