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

В соответствии с /1, 5/, сегментирование – это разделение памяти на логические блоки произвольной длины. Логическое пространство задачи обычно представляется в виде нескольких сегментов. Каждый сегмент имеет имя, в соответствии с которым ОС при распределении памяти назначает базовый адрес. Количество сегментов определяет пользователь при подготовке программы. Для раздельного хранения команд, данных, стековых данных выделяются специальные сегменты: сегмент кода, сегмент данных, сегмент стека. Максимальное количество сегментов (s) определяется разрядностью поля команды, которое используется для задания номера сегмента. Например, в процессорах Pentium разрядность индекса селектора сегмента равна 13, что соответствует 8192 сегментам. Предельный размер (длина) каждого сегмента определяется разрядностью внутрисегментного смещения. Например, для процессоров Pentium длина сегмента ограничивается величиной Гбайта. Длина сегмента может меняться во время выполнения программы. Сегмент может переполниться, но это случается редко, поскольку длина сегментов достаточно большая.

Сегменты всех активных задач, определённые в виртуальном адресном пространстве, размещаются в ВЗУ. Поскольку объём ОП относительно невелик, то не все сегменты могут в неё поместиться. Соответствие между виртуальной памятью и физической ОП устанавливается ОС с помощью специальной таблицы соответствия (дескрипторной таблицы), которую ОС формирует всякий раз, когда в распределении памяти происходят изменения (например, при загрузке новой задачи). Размер таблицы определяется максимальным числом сегментов виртуального адресного пространства. Каждая строка таблицы (дескриптор) содержит информацию о номере сегмента, базовом адресе сегмента в ОП. Базовые адреса назначаются при загрузке сегмента и при любом изменении в распределении памяти. Пример сегментного распределения памяти представлен на рисунке 8.1 /1/.

Рисунок 8.1 – Сегментное распределение памяти

Стрелками на рисунке 8.1 показано размещение сегментов в ОП в соответствии с адресами, определяемыми ОС, а пунктирными линиями – обмены между сегментами ОП и ВЗУ при свопингах.

Помимо базового адреса сегмента в ОП каждый дескриптор таблицы соответствия содержит биты управления виртуальной памятью и дополнительные атрибуты, используемые механизмом защиты процессора (см. лекцию 6). Например, бит присутствия P (Present) показывает, где находится искомый сегмент: в ОП (P=1) или на диске (P=0). Бит доступа A (Access) помогает ОС выбрать сегмент, который возвращается в ВЗУ, когда в ОП нет достаточного места для нового сегмента.

Доступ к элементам дескрипторной таблицы осуществляется с помощью указателей (селекторов), для размещения которых используются сегментные регистры, например, в процессорах Pentium, регистры CS, DS, ES, FS, CS, SS.

Способ формирования физического адреса операнда сегментированной памяти показан на рисунке 8.2 /1/:

Рисунок 8.2 – Вычисление физического адреса в сегментной памяти

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

Если требуемый сегмент отсутствует в ОП, по возникает прерывание, по которому процедура обработки этого прерывания переписывает в ОП нужный сегмент. При наличии свободного места для загрузки сегмента никаких проблем не возникает, и после загрузки нового сегмента в ОП осуществляется повторный запуск команды обращения к памяти. Если в ОП недостаточно места для записи отсутствующего сегмента, то соответствующая процедура ОС сначала освобождает требуемое место, переписывая на диск один или несколько неиспользуемых в данный момент сегментов. Для этого наиболее часто используется алгоритм LRU (Last Recently Used), обеспечивающий замену сегмента, к которому не было обращения самое продолжительное время. ОС использует бит доступа A для определения приблизительного времени последнего использования сегмента. Используя механизм свопинга ОС создаёт иллюзию, что все сегменты программы постоянно находятся в ОП.

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

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

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