Менеджер виртуальной памяти (Операционные Системы)

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 16:12, 14 мая 2016.

Любая программная система имеет логическую модель памяти. Самая простая из них — совпадающая с физической, когда все программы имеют прямой доступ ко всему адресному пространству. При таком подходе программы имеют доступ ко всему адресному пространству, не только могут “мешать” друг другу, но и способны привести к сбою работы всей системы — для этого достаточно, например, затереть кусок памяти, в котором располагается код ОС. Кроме того, иногда физической памяти может просто не хватить для того, чтобы все нужные процессы могли работать одновременно. Виртуальная память — один из механизмов, позволяющих решить эти проблемы. В данной статье рассматривается работа с этим механизмом со стороны операционной системы на примере ОС Embox. Все функции и типы данных, упомянутые в статье, вы можете найти в исходном коде нашего проекта. Будет приведён ряд листингов, и некоторые из них слишком громоздки для размещения в статье в оригинальном виде, поэтому по возможности они будут сокращены и адаптированы. Также в тексте будут возникать отсылки к функциям и структурам, не имеющим прямого отношения к тематике статьи. Для них будет дано краткое описание, а более полную информацию о реализации можно найти на вики проекта.

Виртуальная память

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

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

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

Создание изолированных адресных пространств для различных процессов, что повышает безопасность системы, а также решает проблему привязанности программы к определённым адресам памяти.

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

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

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

Архитектурные средства поддержки виртуальной памяти

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

Было предложено переложить проблему на компьютер. Развитие архитектуры компьютеров привело к значительному усложнению организации памяти, соответственно, усложнились и расширились задачи операционной системы по управлению памятью. Одним из главных усовершенствований архитектуры стало появление виртуальной памяти (virtual memory). Она впервые была реализована в 1959 г. на компьютере Атлас, разработанном в Манчестерском университете, и стала популярной только спустя десятилетие.

При помощи виртуальной памяти обычно решают две задачи:

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

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

Программа не ограничена величиной физической памяти. Упрощается разработка программ, поскольку можно задействовать большие виртуальные пространства, не заботясь о размере используемой памяти.

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

Объем ввода-вывода для выгрузки части программы на диск может быть меньше, чем в варианте классического свопинга, в итоге, каждая программа будет работать быстрее.

Таким образом, возможность обеспечения (при поддержке операционной системы) для программы видимости практически неограниченной (32- или 64-разрядной) адресуемой пользовательской памяти при наличии основной памяти существенно меньших размеров очень важный аспект. Но введение виртуальной памяти позволяет решать другую не менее важную задачу обеспечение контроля доступа к отдельным сегментам памяти и в частности защиту пользовательских программ друг от друга и защиту ОС от пользовательских программ.

С целью защиты виртуальная память поддерживалась и на компьютерах с 16-разрядной адресацией, в которых объем основной памяти зачастую существенно превышал 64 Кбайта (размер виртуальной памяти). Например, 16-разрядный компьютер PDP-11/70 мог иметь до 2 Мбайт оперативной памяти. Операционная система этого компьютера, тем не менее, поддерживала виртуальную память, основным смыслом которой являлось обеспечение защиты и перераспределения основной памяти между пользовательскими процессами.

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

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

Традиционно считается, что существует три модели виртуальной памяти:

  • страничная,
  • сегментная
  • и их комбинация - сегментно-страничная модел

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

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

Одним из достижений современных ОС является грамотное и эффективное разделение средств управления виртуальной памятью на:

  • аппаратно-независимую
  • и аппаратно-зависимую части.

Коротко рассмотрим, что и каким образом входит в аппаратно-зависимую часть подсистемы управления виртуальной памятью. Компоненты аппаратно-независимой подсистемы рассмотрены в следующей главе (link is external).

Итак, мы имеем большое (для 32-разрядных архитектур это обычно 2^32 = 4 Гб) виртуальное адресное пространство и физическое пространство существенно меньшего размера.

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

Таким образом, важный компонент менеджера виртуальной памяти система или функция отображения (трансляции) адресов.

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

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

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

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

Процессам выделяется линейное логическое адресное пространство. Устройство управления памятью процессора переводит логические адреса в физические. Если поделить 4ГБ памяти на страницы размером 4кБ, то получится 1 миллион страниц. Процессор применяет двумерную структуру для обращения к этому миллиону страниц. Это можно представить себе как матрицу 1024х1024. Первая размерность называется каталогом страниц (Page Directory), а вторая таблицей страниц (Page Table). Располагая подобной структурой, можно создать каталог страниц, в котором 1024 записи, и каждая запись указывает на таблицу страниц. Каждая таблица страниц содержит в свою очередь 1024 записи, каждая из которых указывает на физический адрес 4кБ-ной страницы. Каждая запись в каталоге и таблице странице имеет 4 байта в длину, таким образом, чтобы разбить 4ГБ адресное пространство на 4кБ страницы, требуется структура размером 4х1024х1024 = 4МБ. Адреса памяти имеют 32 бита в длину, из которых 20 бит (10 бит на каталог страниц + 10 бит на таблицу страниц) являются физическим адресом страницы, а 12 бит - индексом внутри выбранной страницы.

В среде Windows у каждого процесса есть свой каталог страниц и таблица страниц, для которых ОС выделяет 4МБ места. Когда процесс создаётся, каждая запись в каталоге страниц содержит физический адрес таблицы страниц. Записи в таблице страниц могут быть как действительными, так и недействительными. Действительные записи содержат физический адрес 4кБ-овых страниц. Процесс ничего не знает о физических адресах и при обращении использует лишь виртуальные адреса. Преобразованием виртуального адреса в физический занимаются менеджер памяти Windows и процессор. Адрес, по которому в физической памяти находится каталог страниц, называется базовым адресом каталога страниц (Page Directory Base Address). Этот адрес записывается в специальный регистр процессора CR3 (в процессорах х86). При переключении контекста Windows загружает в регистр CR3 новое значение, чтобы направить запуск на адрес каталога старниц нового процесса.

Применение такой технологии позволяет процессу использовать 4ГБ адресного логического (виртуального) адресного пространства. Логические адресные пространства процессов не пересекаются, и логический адрес одного процесса не может указывать на физический адрес другого. Это называется виртуальным адресным пространством, поскольку хоть у процесса и есть 4ГБ виртуального адресного пространства, использовать он может лишь столько памяти, сколько ему выделено. Общий объём памяти, одновременно занимаемый всеми процессами, не может превысить сумму основной памяти и файла подкачки (Pagefile). Это называется пределом для выделения памяти (Commit Limit). Если процесс запрашивает больше памяти (Commit), то ОС проверяет, имеется в свободная память, и если есть, выделяет её процессу. Таким образом ОС гарантирует, что процессу реально выделена память, будь то в области физическая или массовой памяти. Объём всей виртуальной памяти, выделенной всем процессам, называется текущей выделенной памятью (Current Commit Charge). Для определения оптимального размера файла подкачки необходимо знать, сколько виртуальной памяти процессы реально занимают. Для этого нужно найти пик выделенной памяти (Peak Commit Charge), что чего можно, например, проследить за пиком выделенной памяти при одновременном запуске всех процессов, и из полученной величины вычесть объём физической памяти компьютера. Полученная разница и составит размер файла подкачки.

Менеджер виртуальной памяти

Менеджер виртуальной памяти (далее просто «менеджер памяти») — часть операционной системы, благодаря которой можно адресовать память большую, чем объем физической памяти (ОЗУ). Благодаря виртуальной памяти можно запускать множество ресурсоёмких приложений, требующих большого объёма ОЗУ. Максимальный объём виртуальной памяти, который можно получить, используя 24-битную адресацию — 16 мегабайт. С помощью 32-битной адресации можно адресовать до 4 ГБ виртуальной памяти. А 64-битная адресация позволяет работать уже с 18 эксабайтами памяти.

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

Источники

  1. Вахалия Ю. UNIX изнутри. — СПб.: Питер, 2003. С.844. ISBN 5-94723-013-5
  2. Иртегов Д. Введение в операционные системы. СПб.: Питер, 2002.
  3. Bruce Jacob, Trevor Mudge. Virtual Memory: Issues of Implementation. — Los Alamitos, CA, USA: IEEE Computer Society Press, 1998. ISSN:0018-9162
  4. Лекция 9: Виртуальная память. Архитектурные средства поддержки виртуальной памяти / Основы операционных систем ISBN 978-5-9556-0044-4