Скачиваний:
77
Добавлен:
13.03.2016
Размер:
55.3 Кб
Скачать

Лекция 4

2.3.5.Модель управления памятью

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

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

2.3.5.1. Страничная организация памяти

Пусть адресное пространство МП равно 65536 байт, а физическое адресное пространство МПС содержит ячейки с 0 по 4095. Можно было бы настроить МП МПС так, чтобы при обращении к адресу 4096 должно использоваться слово из памяти 0, а при обращении к адресу 4097 – слово из памяти с адресом 1, при обращении к адресу 8191 – слово из памяти с адресом 4095. Другими словами, определено отображение из адресного пространства в действительные адреса памяти – механизм трансляции адресов. Что произойдет, если МП обратится к адресу 8192. В МП без виртуальной памяти произойдет исключение по несуществующему адресу физической памяти. В МП с виртуальной памятью будет иметь место следующая последовательность шагов:

1)байты из ОП будут отправлены во вторичную память;

2)байты с 8192 по 12287 будут загружены из вторичной памяти в ОП;

3)отображение адресов изменится: теперь адреса с 8192 по 12287 соответствуют ячейкам физической памяти с 0 по 4095;

4)выполнение программы продолжится как ни в чем не бывало.

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

Виртуальное адресное пространство разбивается на ряд страниц равного размера, обычно от 512 до 64 Кбайт, хотя иногда встречается 4 Мбайта. Размер страницы всегда должен быть степенью двойки. Физическое адресное пространство тоже разбивается на части равного размера таким образом, чтобы каждая такая часть ОП вмещала ровно одну страницу. Эти части ОП называют страничными кадрами.

Рассмотрим для примера, как можно 32-битный виртуальный адрес отобразить на адрес ОП, которая воспринимает только реальные адреса (размер страницы 4 Кбайт). В МП это отображение выполняет УУП (MMU). На рис.2.2 показано преобразование 32-битного виртуального адреса в 15-битный адрес ОП (8 страничных кадров). УУП разделяет виртуальный адрес на 20-битный номер виртуальной страницы и 12-битовое смещение внутри страницы. Номер виртуальной страницы используется в качестве индекса в таблице страниц для нахождения нужной страницы. На рис.2.2 номер виртуальной страницы равен 3, поэтому из таблицы выбирается элемент 3.

Сначала УУП проверяет, находится ли нужная страница в текущий момент в памяти, читая бит присутствия в данном элементе таблицы страниц. В примере этот бит равен 1, т.е. страница в памяти.

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

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

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

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

При обращении программы к странице, которая отсутствует в памяти ее нужно вызвать из вторичной памяти. Однако, чтобы освободить для не место, нужно во вторичную память отправить какую-нибудь страницу. По одному из алгоритмов удаляется та страница, которая использовалась наиболее давно, поскольку вероятность того, что она будет в текущем рабочем множестве, очень мала. Этот алгоритм называется LRU (Last Recently Used – наиболее давно использовавшиеся элементы). Иногда LRU приводит к патологическим ситуациям (например программа, цикл которой простирается на несколько страниц).

Другой алгоритм – FIFO (First-in First-out – первым поступил, первым выводится) удаляет ту страницу, которая раньше всех загружалась, независимо от того, когда в последний раз производилось обращение к этой странице. С каждым страничным кадром связан отдельный счетчик. Изначально все счетчики установлены на 0.

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

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

Если страница, которую нужно удалить, не менялась с тех пор как ее считали, то необязательно ее записывать обратно во вторичную память, поскольку точная копия уже существует. В УУП содержится бит для каждой страницы, который равен 0 при загрузке страницы и принимает значение 1, когда изменяются данные в этой странице. По этому биту ОС определяет необходимость перезаписи страницы.

2.3.5.2. Сегментация памяти

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

  1. Таблица символов, которая содержит имена и атрибуты переменных.

  2. Исходный текст, сохраняемый для листинга.

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

  4. Дерево, содержащее синтаксический анализ программы.

  5. Стек, используемый для вызова процедур в компиляторе.

Каждая из первых четырех таблиц постоянно растет в процессе компиляции. Последняя таблица растет и уменьшается непредсказуемо. В одномерной памяти эти таблицы пришлось бы разместить в виртуальном адресном пространстве в виде смежных областей.

Что произойдет, если программа содержит очень большое число переменных? Адресное пространство, предназначенное для таблицы символов, может переполниться, даже если в других таблицах много свободного места.

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

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

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

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

Разные сегменты могут иметь разные виды защиты. Например, сегмент с процедурой можно определить “только для выполнения”, запретив тем самым считывание и запись в него. Для массива с плавающей запятой разрешается только чтение и запись, но не выполнение и т.д. Такая защита часто помогает обнаружить ошибки в программе.

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

Сегментация реализуется разделением сегмента на страницы и вызова их по требованию. В этом случае одни страницы сегмента могут находиться в ОП, а другие – во вторичной памяти. Чтобы разбить сегмент на страницы, для каждого сегмента создается своя таблица страниц.

Соседние файлы в папке ВстроенныеСистемы