Разрывные методы распределения памяти

Распределение статическими и динамическими разделами

Простое непрерывное распределение и распределение с перекрытием

Простое непрерывное распределение – это самое простая схема, при которой вся память условно разделена на три части:

· область, занимаемая операционной системой:

· область, в которой размещается исполняемая задача;

· свободная область памяти.

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

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

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

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

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

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

Рис.2. Распределение памяти разделами с фиксированными границами

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

Основным недостатком такого способа распределения памяти является наличие достаточно большого объема неиспользуемой памяти (рис. 2). Такие потери называют фрагментацией памяти. Избежать этого можно двумя способами:

· выделять раздел ровно такого объема, который нужен под текущую задачу – разделы с подвижными границами. Диспетчер памяти ведет список адресов свободной памяти и выделяет под задачу раздел, равный или чуть больше объема задачи. При освобождении раздела диспетчер пытается объединить этот раздел со смежным свободным участком, если таковой имеется;

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

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

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

О первых двух уже мы говорили при рассмотрении особенностей архитектуры микропроцессоров i80x86.

Вспомним:

Сегментная организация виртуальной памяти состоит в том, что программа разбивается на логические элементы (например, блоки, процедуры) ─ так называемые сегменты разной длины, которые размещаются в памяти как до определенной степени самостоятельная единица. Логически обращение к элементам программы будет представляться как указание имени сегмента и смещения относительно начала этого сегмента. Физическое имя сегмента (его порядковый номер) будет соответствовать некоторому адресу, с которого этот сегмент начинается при его размещении в памяти, и смещение должно прибавляться к этому базовому адресу. Таким образом, адрес для этого способа состоит из двух полей: номер сегмента и смещение относительно сегмента. Каждый сегмент, размещаемый в памяти, имеет соответствующую информационную структуру, называемую дескриптором сегмента.

Страничная организация виртуальной памяти состоит в том, что все фрагменты программы, на которые она разбивается произвольным образом, имеют одинаковую длину. Эти одинаковы части называют страницами и говорят, что память разбивается на физические страницы, а программа ─ на виртуальные страницы. Часть виртуальных страниц задачи размещается в оперативной памяти, а часть ─ во внешней. Величина страницы выбирается кратной степени двойки. Таким образом, вместо одномерного адресного пространства можно говорить о двумерном. Первая координата адресного пространства ─ это номер страницы, а вторая ─ номер ячейки внутри выбранной страницы (его называют индексом). Таким образом, физический адрес определяется парой (Pp,i), а виртуальный адрес ─ парой (Pν,i), где Pν ─ номер виртуальной страницы, Pp ─ номер физической страницы, i ─ индекс ячейки внутри страницы. Количество битов, отводимое под индекс, определяет размер страницы, а количество битов, отводимое под номер виртуальной страницы ─ объем возможной виртуальной памяти, которой может воспользоваться программа. При это нет необходимости ограничивать число виртуальных страниц числом физических, то есть не поместившиеся страницы можно размещать во внешней памяти, которая в этом случае служит расширением оперативной. Для отображения виртуального адресного пространства задачи на физическую память для каждой задачи, как и в случае сегментного способа, необходимо иметь таблицу страниц для трансляции адресных пространств. Для описания каждой страницы диспетчер памяти ОС заводит соответствующий дескриптор.

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


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: