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




 

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

Сегментирование виртуальной памяти программы позволяет

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

– сократить фрагментацию памяти. Это явление иллюстрирует рис. 4.4: общий объем незанятой памяти, составляющий 50 Кбайт, достаточен, чтобы загрузить и программу D, находящуюся в ожидании. Но ее не удается загрузить, так как свободные участки памяти не являются смежными. Такое состояние называется фрагментацией реальной памяти.

Для борьбы с фрагментацией ОП адресное пространство программы разбивается на от­дельные сегменты, слабо связанные между собой. Тогда программа D общей длиной 50 Кбайт может быть представлена в виде ряда сегментов, загружаемых в различные области ОП (рис. 4.6). Это позво­ляет использовать реальную память, теряемую из-за фрагментации.

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

Каждый сегмент программы должен иметь свое имя. Форма имени сегмента может быть любой, например номер (рис. 4.7, а,б).

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

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

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

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

В дополнение к таблице сегментов для динамической трансляции адреса используется специальный управляющий регистр, называемый регистром начала таблицы сегментов (РНТС или STOR — segment table origin register). В этот регистр занесен адрес таблицы сегментов выполняемой в данный момент программы. На рис. 4.9 изображено выполнение программы D. В РНТС находится адрес таблицы сегментов этой программы. Допустим, для выполняемой программы D начальный адрес таблицы сегментов — 68000. В реальной вычислительной машине все действия выполняются в шестнадцатеричной системе счисления, мы же проведем вычисления для простоты в десятичной системе счисления.

Для обращения к адресу 15000 сегмента 1 производятся следующие действия:

• РНТС указывает на начало таблицы сегментов программы D — 68000;

• номер сегмента в относительном адресе используется как индекс при обращении к таблице сегментов. В данном примере обращение производится к 1-й строке;

• адрес, хранимый в выбранной строке таблицы сегментов, есть адрес начала сегмента в реальной памяти. Смещение в относительном адресе добавляется к начальному адресу, и результат является адресом в реальной памяти: 15000+75000=90000. Для относительного адреса (сегмент 3, смещение 13000) будет по­лучен абсолютный адрес 218000.

При ДТА такое определение адресов ведется в процессе выполнения каждой команды.

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

Сегментирование программ позволяет уменьшить фрагментацию ОП, но полностью ее не исключает: остаются фрагменты, длина которых меньше длины наименьшего сегмента.

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2019-07-14 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: