Сегментная организация памяти

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

Рисунок 2.3.14 – Механизм определения адреса при сегментном распределении памяти

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

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

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

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

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

Выгружаемый (в случае невозможности размещения в памяти нужного сегмента) сегмент выбирается на основе следующих алгоритмов замещения:

– FIFO (first in – first out) первым пришёл – первым выбывает;

– LRU (least recently used) последний, из недавно использованных или, другими словами, дольше всех не используемый;

– LFU (least frequently used) используемый реже всех;

– Random случайный выбор.

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

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

Для реализации алгоритмов замещения LRU и LFU требуются дополнительные аппаратные средства, позволяющие учитывать интенсивность использования сегмента (например, бит активного состояния или бит обращения; периодически ОС анализирует эти данные и определяет активность сегментов).

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

Недостатками сегментного подхода организации памяти являются:

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

– фрагментация оперативной памяти.

Этот подход был использован в OS/2 первого поколения.


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



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