Аппаратно независимый уровень управления виртуальной памятью
Виртуальная память. Архитектурные средства поддержки виртуальной памяти
Уже давно существует проблема размещения в памяти программ, размер которых превышает размер доступной памяти. Один из вариантов ее решения организация структур с перекрытием рассмотрен в предыдущей главе. При этом предполагалось активное участие программиста в процессе сегментации и загрузки программы.
Было предложено переложить проблему на компьютер. Развитие архитектуры компьютеров привело к значительному усложнению организации памяти, соответственно, усложнились и расширились задачи операционной системы по управлению памятью. Одним из главных усовершенствований архитектуры стало появление виртуальной памяти (virtual memory). Она впервые была реализована в 1959 г. на компьютере Атлас, разработанном в Манчестерском университете, и стала популярной только спустя десятилетие.
При помощи виртуальной памяти обычно решают две задачи=
Во-первых, виртуальная память позволяет адресовать пространство, гораздо большее, чем емкость физической памяти конкретной вычислительной машины. В соответствии с принципом локальности для реальных программ обычно нет необходимости в помещении их в физическую память целиком.
Возможность выполнения программы, находящейся в памяти лишь частично имеет ряд вполне очевидных преимуществ:
Программа не ограничена величиной физической памяти. Упрощается разработка программ, поскольку можно задействовать большие виртуальные пространства, не заботясь о размере используемой памяти.
Поскольку появляется возможность частичного помещения программы (процесса) в память и гибкого перераспределения памяти между программами, можно разместить в памяти больше программ, что увеличивает загрузку процессора и пропускную способность системы.
Объем ввода-вывода для выгрузки части программы на диск может быть меньше, чем в варианте классического свопинга, в итоге, каждая программа будет работать быстрее.
Таким образом, возможность обеспечения (при поддержке операционной системы) для программы видимости практически неограниченной (32- или 64-разрядной) адресуемой пользовательской памяти при наличии основной памяти существенно меньших размеров очень важный аспект. Но введение виртуальной памяти позволяет решать другую не менее важную задачу обеспечение контроля доступа к отдельным сегментам памяти и в частности =
- защиту пользовательских программ друг от друга
- и защиту ОС от пользовательских программ.
С целью защиты виртуальная память поддерживалась и на компьютерах с 16-разрядной адресацией, в которых объем основной памяти зачастую существенно превышал 64 Кбайта (размер виртуальной памяти). Например, 16-разрядный компьютер PDP-11/70 мог иметь до 2 Мбайт оперативной памяти. Операционная система этого компьютера, тем не менее, поддерживала виртуальную память, основным смыслом которой являлось обеспечение защиты и перераспределения основной памяти между пользовательскими процессами.
Напомним, что в системах с виртуальной памятью те адреса, которые генерирует программа, - (логические адреса) - называются виртуальными, и они формируют виртуальное адресное пространство. В отсутствие механизма виртуальной памяти виртуальное адресное пространство непосредственно отображается в физическое пространство.
Хотя известны и чисто программные реализации виртуальной памяти, это направление получило наиболее широкое развитие после получения соответствующей аппаратной поддержки. Идея аппаратной части механизма виртуальной памяти состоит в том, что адрес памяти, вырабатываемый командой, интерпретируется аппаратурой не как реальный адрес некоторого элемента основной памяти, а как некоторая структура, где адрес является лишь одним из компонентов наряду с атрибутами, характеризующими способ обращения по данному адресу.
Традиционно считается, что существует три модели виртуальной памяти:
- страничная,
- сегментная
- и их комбинация - сегментно-страничная модель.
По-видимому, более правильно считать, что существует (и поддерживается аппаратно большинством платформ) страничная модель виртуальной памяти. Сегментно-страничная модель является синтезом страничной модели и идеи сегментации, изложенной в предыдущей главе. Причем для тех архитектур, в которых сегменты не поддерживаются аппаратно их реализация - задача архитектурно-независимой компоненты менеджера памяти. Сегментная организация в чистом виде практически не встречается.
9.2 Архитектурные средства поддержки виртуальной памяти.
Очевидно, что невозможно создать полностью машинно-независимый компонент управления виртуальной памятью. С другой стороны, имеются существенные части программного обеспечения, связанного с управлением виртуальной памятью, для которых детали аппаратной реализации совершенно не важны.
Одним из достижений современных ОС является грамотное и эффективное разделение средств управления виртуальной памятью на =
- аппаратно-независимую
- и аппаратно-зависимую части.
Коротко рассмотрим, что и каким образом входит в аппаратно-зависимую часть подсистемы управления виртуальной памятью. Компоненты аппаратно-независимой подсистемы рассмотрены в следующей главе.
Итак, мы имеем большое (для 32-разрядных архитектур это обычно 2^32 = 4 Гб) виртуальное адресное пространство и физическое пространство существенно меньшего размера. Пользовательский процесс или ОС должны иметь возможность осуществить запись по виртуальному адресу, а задача ОС сделать так, чтобы записанная информация оказалась в физической памяти (впоследствии при нехватке оперативной памяти она может быть вытеснена во внешнюю память).
Таким образом, важный компонент менеджера виртуальной памяти система или функция отображения (трансляции) адресов.
Механизм преобразования виртуальных адресов в физические должен предусматривать ведение таблиц, показывающих, какие области виртуальной памяти в текущий момент находятся в физической памяти и где именно размещаются.
Если бы такое отображение осуществлять побайтно, то информация об отображении была бы велика, и для ее хранения потребовалось бы больше реальной памяти, чем для процессов. Необходим способ, позволяющий существенно сократить объем информации отображения. Поэтому обычно отображаемая информация группируется в блоки (программа занимает целое количество блоков памяти).
9.2.1 Страничная память
В наиболее простом и наиболее часто используемом случае страничной виртуальной памяти виртуальная память и физическая представляются состоящими из наборов блоков или страниц одинакового размера. Виртуальные адреса делятся на страницы (page), соответствующие единицы в физической (оперативной) памяти образуют страничные кадры (page frames), а в целом система поддержки страничной виртуальной памяти называется пейджингом (paging).
Виртуальный адрес в страничной системе упорядоченная пара (p,d), где=
- p - номер страницы в виртуальной памяти,
- d - смещение в рамках страницыpгде размещается адресуемый элемент.
Процесс может выполняться, если его текущая страница находится в оперативной памяти. Если текущей страницы в главной памяти нет, она должна быть переписана (подкачана) из внешней памяти. Поступившая страница может быть размещена в любой свободный страничный кадр. Система отображения виртуальных адресов в физические сводится к системе отображения виртуальных страниц в физические и представляет собой таблицу страниц.
Для преобразования адресного пространства каждого процесса используется одна или несколько таблиц страниц, которые обычно хранятся в оперативной памяти.
Для ссылки на таблицу страниц используется . Особенности хранения таблицы страниц описаны ниже. Интерпретация виртуального (логического) адреса показана на рис. 9.1
Рис. 9.1 Связь логического и физического адресов при страничной организации памяти.
9.2.3 Таблица страниц
Организация таблицы страниц - один из ключевых элементов механизмов страничного и сегментно-страничного преобразований. Рассмотрим структуру таблицы страниц более детально.
Итак, виртуальный адрес состоит из =
- виртуального номера страницы (high-order bits)
- и смещения (low-order bits) - внутри страницы с заданным номером.
Номер виртуальной страницы используется как индекс в таблице страниц для нахождения записи (entry) о виртуальной странице.
Из этой записи в таблице страниц находится номер кадра (page frame number), затем прибавляется смещение и формируется физический адрес. Помимо этого запись в таблице страниц содержит информацию об атрибутах страницы, в частности биты защиты.
Основную проблему для эффективной реализации таблицы страниц создают большие размеры виртуальных адресных пространств современных компьютеров, которые обычно определяются разрядностью архитектуры процессора. Самыми распространенными на сегодняшний день являются 32-разрядные процессоры, позволяющие создавать виртуальные адресные пространства такого размером 4 Гб (для 64-разрядных компьютеров эта величина равна 2^64б).
Подсчитаем примерный размер таблицы страниц.
В 32-битном адресном пространстве при размере страницы 4К (Intel) получаем 1М страниц, а в 64-битном и того более. Т.e. таблица должна иметь 1М строк (entry), причем запись в строке состоит из нескольких байт. Заметим, что каждый процесс, нуждается в своей таблице страниц (а в случае сегментно-страничной схемы по одной на каждый сегмент). Итак, в этом случае таблица страниц может быть слишком большой.
Кроме того, отображение должно быть быстрым. Отображение должно быть быстрым т.к. оно делается при каждом обращении к памяти, которое происходит практически в каждой машинной инструкции. Эта проблема решается главным образом за счет реализации ассоциативной памяти .
Для того чтобы избежать необходимости иметь огромную таблицу в памяти все время, а хранить лишь несколько ее фрагментов (это возможно опять же на основании свойства локальности!), многие компьютеры используют многоуровневую таблицу страниц.
Рассмотрим модельный пример (см. рис. 9.4). Предположим, что 32-разрядный адрес делится на =
- 10-разрядное поле Рtr1
- 10-разрядное поле Рtr2
- и 12-разрядное смещение Offset.
12 разрядов смещения позволяют локализовать байт внутри страницы размером 4К (2**12), а всего имеем 2**20 страниц. Как видно из рис. 9.4 1024 строки в таблице верхнего уровня при помощи поля Ptr1 ссылаются на 1024 таблицы второго уровня, каждая из которых содержит также 1024 строки. При помощи поля Ptr2 каждая строка таблицы второго уровня указывает на конкретную страницу. Смысл такой организации в том, чтобы избежать поддержки всех таблиц второго уровня (а их 1024) в памяти постоянно. Рассмотрим пример с круглыми цифрами. Допустим, что процессу нужны 12М памяти: 4М в нижней части памяти для кода, 4М в нижней части для данных и 4М в верхней части памяти для стека. Между дном стека и верхом данных гигантское пространство размером 4Gb-12Mb, которое не используется. Для этого случая необходимы лишь 1 таблица верхнего уровня и 3 таблицы второго уровня.
Рис. 9.4 Пример двухуровневой таблицы страниц.
Такой подход естественным образом обобщается на три и более уровней таблицы.
Рассмотрим одну из записей таблицы страниц. Ее размер колеблется от системы к системе, но 32 бита - наиболее общий случай. Самое важное поле - номер кадра. Цель страничного отображения - локализовать эту величину. Далее бит присутствия. Далее биты защиты (например, 0 - read/write, 1 - read only . ) Есть еще биты модификации (если на нее писали) и биты ссылки, которые помогают выделить мало используемые страницы, биты разрешающие кэширование. Заметим, что адреса страниц на диске не являются частью таблицы страниц.
Как наличие нескольких уровней сказывается на производительности менеджера памяти? Если предположить, что каждый уровень - отдельная таблица в памяти, преобразование адреса может потребовать нескольких обращений к памяти.
Количество уровней в таблице страниц зависит от конкретных особенностей архитектуры. Можно привести примеры реализации одноуровневого (DEC PDP-11), двухуровневого (Intel, DEC VAX), трехуровневого (Sun SPARC, DEC Alpha) paging'а, а также paging'а с задаваемым количеством уровней (Motorola). Функционирование RISC процессора MIPS R2000 осуществляется вообще без таблицы страниц. Здесь поиск нужной страницы, если эта страница отсутствует в ассоциативной памяти, должна взять на себя ОС (так называемый zero level paging).
В стратегиях замещения, рассмотренных в предыдущем разделе, прослеживается предположение о том, что количество кадров, принадлежащих процессу, нельзя увеличить. Это приводит к необходимости выталкивания страницы. Рассмотрим более общий подход, базирующийся на концепции рабочего множества, сформулированной Деннингом [Denning, 1996].
Итак, что делать, если в распоряжении процесса имеется недостаточное число кадров? Нужно ли его приостановить с освобождением всех кадров? Что следует понимать под достаточным количеством кадров?
Хотя теоретически возможно уменьшить число кадров процесса до минимума, существует какое-то число активно используемых страниц, без которого процесс часто генерирует page faults. Высокая частота страничных нарушений называется трешинг (thrashing, иногда употребляется русский термин "пробуксовка", см. рис. 10.3). Процесс находится в состоянии трешинга, если при его работе больше времени уходит на подкачку страниц, нежели на выполнение команд. Такого рода критическая ситуация возникает вне зависимости от конкретных алгоритмов замещения.
Рис. 10.3. Частота page faults в зависимости от количества кадров, выделенных процессу
Часто результатом трешинга является снижение производительности вычислительной системы. Один из нежелательных сценариев развития событий может выглядеть следующим образом. При глобальном алгоритме замещения процесс, которому не хватает кадров, начинает отбирать кадры у других процессов, которые в свою очередь начинают заниматься тем же. В результате все процессы попадают в очередь запросов к устройству вторичной памяти (находятся в состоянии ожидания), а очередь процессов в состоянии готовности пустеет. Загрузка процессора снижается. Операционная система реагирует на это увеличением степени мультипрограммирования, что приводит к еще большему трешингу и дальнейшему снижению загрузки процессора. Таким образом, пропускная способность системы падает из-за трешинга.
Эффект трешинга, возникающий при использовании глобальных алгоритмов, может быть ограничен за счет применения локальных алгоритмов замещения. При локальных алгоритмах замещения если даже один из процессов попал в трешинг, это не сказывается на других процессах. Однако он много времени проводит в очереди к устройству выгрузки, затрудняя подкачку страниц остальных процессов.
Критическая ситуация типа трешинга возникает вне зависимости от конкретных алгоритмов замещения. Единственным алгоритмом, теоретически гарантирующим отсутствие трешинга, является рассмотренный выше не реализуемый на практике оптимальный алгоритм.
Итак, трешинг - это высокая частота страничных нарушений. Hеобходимо ее контролировать. Когда она высока, процесс нуждается в кадрах. Можно, устанавливая желаемую частоту page faults, регулировать размер процесса, добавляя или отнимая у него кадры. Может оказаться целесообразным выгрузить процесс целиком. Освободившиеся кадры выделяются другим процессам с высокой частотой page faults.
Для предотвращения трешинга требуется выделять процессу столько кадров, сколько ему нужно. Hо как узнать, сколько ему нужно? Необходимо попытаться выяснить, как много кадров процесс реально использует. Для решения этой задачи Деннинг использовал модель рабочего множества, которая основана на применении принципа локальности.
Модель рабочего множества
Рассмотрим поведение реальных процессов.
Процессы начинают работать, не имея в памяти необходимых страниц. В результате при выполнении первой же машинной инструкции возникает page fault, требующий подкачки порции кода. Следующий page fault происходит при локализации глобальных переменных и еще один - при выделении памяти для стека. После того как процесс собрал большую часть необходимых ему страниц, page faults возникают редко.
Таким образом, существует набор страниц (P1, P2, . Pn), активно использующихся вместе, который позволяет процессу в момент времени t в течение некоторого периода T производительно работать, избегая большого количества page faults. Этот набор страниц называется рабочим множеством W(t,T) ( working set ) процесса. Число страниц в рабочем множестве определяется параметром Т, является неубывающей функцией T и относительно невелико. Иногда T называют размером окна рабочего множества, через которое ведется наблюдение за процессом (см. рис. 10.4).
Рис. 10.4. Пример рабочего множества процесса
Легко написать тестовую программу, которая систематически работает с большим диапазоном адресов, но, к счастью, большинство реальных процессов не ведут себя подобным образом, а проявляют свойство локальности. В течение любой фазы вычислений процесс работает с небольшим количеством страниц.
Когда процесс выполняется, он двигается от одного рабочего множества к другому. Программа обычно состоит из нескольких рабочих множеств, которые могут перекрываться. Hапример, когда вызвана процедура, она определяет новое рабочее множество, состоящее из страниц, содержащих инструкции процедуры, ее локальные и глобальные переменные. После ее завершения процесс покидает это рабочее множество, но может вернуться к нему при новом вызове процедуры. Таким образом, рабочее множество определяется кодом и данными программы. Если процессу выделять меньше кадров, чем ему требуется для поддержки рабочего множества, он будет находиться в состоянии трешинга.
Принцип локальности ссылок препятствует частым изменениям рабочих наборов процессов. Формально это можно выразить следующим образом. Если в период времени (t-T, t) программа обращалась к страницам W(t,T), то при надлежащем выборе T с большой вероятностью эта программа будет обращаться к тем же страницам в период времени (t, t+T). Другими словами, принцип локальности утверждает, что если не слишком далеко заглядывать в будущее, то можно достаточно точно его прогнозировать исходя из прошлого. Понятно, что с течением времени рабочий набор процесса может изменяться (как по составу страниц, так и по их числу).
Наиболее важное свойство рабочего множества - его размер. ОС должна выделить каждому процессу достаточное число кадров, чтобы поместилось его рабочее множество. Если кадры еще остались, то может быть инициирован другой процесс. Если рабочие множества процессов не помещаются в память и начинается трешинг, то один из процессов можно выгрузить на диск.
Решение о размещении процессов в памяти должно, следовательно, базироваться на размере его рабочего множества. Для впервые инициируемых процессов это решение может быть принято эвристически. Во время работы процесса система должна уметь определять: расширяет процесс свое рабочее множество или перемещается на новое рабочее множество. Если в состав атрибутов страницы включить время последнего использования ti (для страницы с номером i ), то принадлежность i-й страницы к рабочему набору, определяемому параметром T в момент времени t будет выражаться неравенством: t-T < ti < t. Алгоритм выталкивания страниц WSClock, использующий информацию о рабочем наборе процесса, описан в [Таненбаум, 2002].
Другой способ реализации данного подхода может быть основан на отслеживании количества страничных нарушений, вызываемых процессом. Если процесс часто генерирует page faults и память не слишком заполнена, то система может увеличить число выделенных ему кадров. Если же процесс не вызывает исключительных ситуаций в течение некоторого времени и уровень генерации ниже какого-то порога, то число кадров процесса может быть урезано. Этот способ регулирует лишь размер множества страниц, принадлежащих процессу, и должен быть дополнен какой-либо стратегией замещения страниц. Несмотря на то что система при этом может пробуксовывать в моменты перехода от одного рабочего множества к другому, предлагаемое решение в состоянии обеспечить наилучшую производительность для каждого процесса, не требуя никакой дополнительной настройки системы.
Дизайнеры ОС для существующих машин редко имеют возможность влиять на размер страницы. Однако для вновь создаваемых компьютеров решение относительно оптимального размера страницы является актуальным. Как и можно было ожидать нет одного наилучшего размера. Скорее есть набор факторов, влияющих на размер. Обычно размер страницы это степень двойки от 2**9 до 2**14 байт.
Чем больше размер страницы, тем меньше будет размер структур данных, обслуживающих преобразование адресов, но тем больше будут потери, связанные с тем, что память можно выделять только постранично.
Как следует выбирать размер страницы? Во-первых, нужно учитывать размер таблицы страниц, здесь желателен большой размер страницы (страниц меньше, соответственно и таблица страниц меньше). С другой стороны память лучше утилизируется с маленьким размером страницы. В среднем половина последней страницы процесса пропадает. Необходимо также учитывать объем ввода-вывода для взаимодействия с внешней памятью и другие факторы. Проблема не имеет хорошего ответа. Историческая тенденция состоит в увеличении размера страницы. Как правило, размер страниц задается аппаратно, например, на Intel - это 4096 байт (или 4 Кбайт), на DEC PDP-11 - 8 Кбайт, на DEC VAX - 512 байт, на других архитектурах, таких как Motorola 68030, размер страниц может быть задан программно.
Итак, в данной теме рассмотрены аппаратные особенности поддержки виртуальной памяти. Перейдем к ее программной поддержке.
1) Опишите две задачи, решаемые с помощью виртуальной памяти
2) Назовите модели виртуальной памяти
3) Охарактеризуйте страничную память
4) Охарактеризуйте сегментную память
5) Охарактеризуйте сегментно-страничную память
6) Опишите структуру таблицы страниц
7) Опишите ассоциативную память
8) Опишите иерархию памяти
9) Опишите, как следует выбирать размер страницы памяти
На лекции рассматриваются следующие вопросы:
1) Введение в аппаратно-независимый уровень управления виртуальной памятью
2) Исключительные ситуации при работе с памятью.
3) Стратегии управления страничной памятью
4) Алгоритмы замещения страниц (алгоритмы FIFO, оптимальный, LRU, NFU)
5) Thrashing. Свойство локальности. Модель рабочего множества
6) Демоны пейджинга
7) Аппаратно-независимая модель памяти процесса
8) Отдельные аспекты функционирования менеджера памяти
Обычно ОС опирается на некоторое собственное представление организации виртуальной памяти, которое используется в аппаратно-независимой части подсистемы управления виртуальной памятью и связывается с конкретной аппаратной реализацией с помощью аппаратно-зависимой части.
Как же достигается возможность наличия виртуальной памяти с размером, существенно превышающим размер оперативной памяти? В элементе таблицы страниц может быть установлен специальный флаг (означающий отсутствие страницы), наличие которого заставляет аппаратуру вместо нормального отображения виртуального адреса в физический прервать выполнение команды и передать управление соответствующему компоненту операционной системы. Когда программа обращается к виртуальной странице, отсутствующей в основной памяти, т.е. "требует" доступа к данным или программному коду, операционная система удовлетворяет это требование путем выделения страницы основной памяти, перемещения в нее копии страницы, находящейся во внешней памяти, и соответствующей модификации элемента таблицы страниц. Здесь имеем дело с частным случаем исключительной ситуации (exception) при работе с памятью, так называемым страничным нарушением (page fault).
Система управления памятью является совокупностью программно-технических средств, обеспечивающих производительное функционирование современных компьютеров. Успех реализации той части ОС, которая относится к управлению виртуальной памятью, определяется близостью архитектуры аппаратуры, поддерживающей виртуальную память, к абстрактной модели виртуальной памяти ОС. В подавляющем большинстве современных компьютеров аппаратура выполняет функции, существенно превышающие потребности модели ОС, так что создание аппаратно-зависимой части подсистемы управления виртуальной памятью ОС в большинстве случаев не является чрезмерно сложной задачей.
Любая программная система имеет логическую модель памяти. Самая простая из них — совпадающая с физической, когда все программы имеют прямой доступ ко всему адресному пространству. При таком подходе программы имеют доступ ко всему адресному пространству, не только могут “мешать” друг другу, но и способны привести к сбою работы всей системы — для этого достаточно, например, затереть кусок памяти, в котором располагается код ОС. Кроме того, иногда физической памяти может просто не хватить для того, чтобы все нужные процессы могли работать одновременно. Виртуальная память — один из механизмов, позволяющих решить эти проблемы. В данной статье рассматривается работа с этим механизмом со стороны операционной системы на примере ОС 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 бит - индексом внутри выбранной страницы.
Применение такой технологии позволяет процессу использовать 4ГБ адресного логического (виртуального) адресного пространства. Логические адресные пространства процессов не пересекаются, и логический адрес одного процесса не может указывать на физический адрес другого. Это называется виртуальным адресным пространством, поскольку хоть у процесса и есть 4ГБ виртуального адресного пространства, использовать он может лишь столько памяти, сколько ему выделено. Общий объём памяти, одновременно занимаемый всеми процессами, не может превысить сумму основной памяти и файла подкачки (Pagefile). Это называется пределом для выделения памяти (Commit Limit). Если процесс запрашивает больше памяти (Commit), то ОС проверяет, имеется в свободная память, и если есть, выделяет её процессу. Таким образом ОС гарантирует, что процессу реально выделена память, будь то в области физическая или массовой памяти. Объём всей виртуальной памяти, выделенной всем процессам, называется текущей выделенной памятью (Current Commit Charge). Для определения оптимального размера файла подкачки необходимо знать, сколько виртуальной памяти процессы реально занимают. Для этого нужно найти пик выделенной памяти (Peak Commit Charge), что чего можно, например, проследить за пиком выделенной памяти при одновременном запуске всех процессов, и из полученной величины вычесть объём физической памяти компьютера. Полученная разница и составит размер файла подкачки.
Менеджер виртуальной памяти
Менеджер виртуальной памяти (далее просто «менеджер памяти») — часть операционной системы, благодаря которой можно адресовать память большую, чем объем физической памяти (ОЗУ). Благодаря виртуальной памяти можно запускать множество ресурсоёмких приложений, требующих большого объёма ОЗУ. Максимальный объём виртуальной памяти, который можно получить, используя 24-битную адресацию — 16 мегабайт. С помощью 32-битной адресации можно адресовать до 4 ГБ виртуальной памяти. А 64-битная адресация позволяет работать уже с 18 эксабайтами памяти.
Применение механизма виртуальной памяти позволяет: • упростить адресацию памяти клиентским программным обеспечением; • рационально управлять оперативной памятью компьютера (хранить в ней только активно используемые области памяти); • изолировать процессы друг от друга (процесс полагает, что монопольно владеет всей памятью).
Теоретическая часть состоит из 10 лекций. Она имеет традиционное построение и содержит следующие разделы: введение, понятие и реализация процессов, взаимодействие процессов, организация памяти, структура файловой системы, описание системы ввода-вывода, и безопасность операционных систем. Большинство разделов состоит из нескольких тематически связанных глав. В курсе много иллюстраций. В конце каждой теоретической главы перечисляются наиболее важные концепции и идеи.
Материалы практических занятий дополняют лекционный курс и используются для иллюстрации реализации теоретических положений на примере операционной системы Unix. На практике рассматриваются организация процессов, различные способы их взаимодействия, устройство файловой системы, начала системного программирования.
Цель
Курс предназначен для преподавателей и студентов вузов, специализирующихся в области информатики, а также специалистов, интересующихся проблемами операционных систем и системного программирования.
Предварительные знания
Рекомендуемый уровень предварительной подготовки:
· знакомство с компьютером и его внутренним устройством на уровне пользователя;
· знакомство с алгоритмическим языком Си.
Лекции
Введение
В данной лекции вводится понятие операционной системы; рассматривается эволюция развития операционных систем; описываются функции операционных систем и подходы к построению операционных систем.
Процессы
В лекции описывается основополагающее понятие процесса, рассматриваются его состояния, модель представления процесса в операционной системе и операции, которые могут выполняться над процессами операционной системой.
Планирование процессов
В этой лекции рассматриваются вопросы, связанные с различными уровнями планирования процессов в операционных системах. Описываются основные цели и критерии планирования, а также параметры, на которых оно основывается. Приведены различные алгоритмы планирования.
Кооперация процессов. Алгоритмы синхронизации
Одной из функций операционной системы является обеспечение санкционированного взаимодействия процессов. Лекция посвящена основам логической организации такого взаимодействия. Для корректного взаимодействия процессов недостаточно одних организационных усилий операционной системы. Необходимы определенные внутренние изменения в поведении процессов. В настоящей лекции рассматриваются вопросы, связанные с такими изменениями, приводятся алгоритмы корректной организации взаимодействия процессов.
Тупики
В лекции рассматриваются вопросы взаимоблокировок, тупиковых ситуаций и «зависаний» системы.
Организация памяти компьютера. Схемы управления памятью.
В настоящей лекции рассматриваются способы управления памятью в ОС. Физическая память компьютера имеет иерархическую структуру. Программа представляет собой набор сегментов в логическом адресном пространстве. ОС осуществляет связывание логических и физических адресных пространств. Рассмотрены аппаратные особенности поддержки виртуальной памяти. Разбиение адресного пространства процесса на части и динамическая трансляция адреса позволили выполнять процесс даже в отсутствие некоторых его компонентов в оперативной памяти.
Аппаратно-независимый уровень управления виртуальной памятью
Большинство ОС используют сегментно-страничную виртуальную память. Для обеспечения нужной производительности менеджер памяти ОС старается поддерживать в оперативной памяти актуальную информацию, пытаясь угадать, к каким логическим адресам последует обращение в недалеком будущем.
1. Лекция: Введение
В данной лекции вводится понятие операционной системы; рассматривается эволюция развития операционных систем; описываются функции операционных систем и подходы к построению операционных систем.
Операционная система (ОС) – это программа, которая обеспечивает возможность рационального использования оборудования компьютера удобным для пользователя образом. Вводная лекция рассказывает о предмете, изучаемом в рамках настоящего курса. Вначале мы попытаемся ответить на вопрос, что такое ОС. Затем последует анализ эволюции ОС и рассказ о возникновении основных концепций и компонентов современных ОС. В заключение будет представлена классификация ОС с точки зрения особенностей архитектуры и использования ресурсов компьютера.
Читайте также: