Обычно программа состоит из нескольких частей – подпрограмм; данные также могут объединяться в отдельные массивы в соответствии с их смыслом. Так как заранее длины этих частей неизвестны, удобно, чтобы каждая такая часть имела свою собственную адресацию, начинающуюся с нуля и идущую в возрастающем порядке. Часть виртуальной памяти программы с независимой адресацией внутри нее называют сегментом. Размер каждого сегмента определяется пользователем, исходя из смысла той или иной части программы или данных и степени связности информации.
Сегментирование виртуальной памяти программы позволяет
– дифференцировать права доступа пользователей к отдельным частям программы или массива данных, что бывает особенно важно в системах с коллективным доступом;
– сократить фрагментацию памяти. Это явление иллюстрирует рис. 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.
При ДТА такое определение адресов ведется в процессе выполнения каждой команды.
Если операционной системе понадобится переместить исполняемую программу в другую часть памяти (например, чтобы исключить фрагментацию), сначала нужно будет переслать команды и данные сегмента. Затем строку таблицы сегментов для данного сегмента нужно изменить так, чтобы она содержала новый адрес, и выполнение программы будет продолжено. Это дает возможность динамического управления физической памятью в процессе выполнения программы.
Сегментирование программ позволяет уменьшить фрагментацию ОП, но полностью ее не исключает: остаются фрагменты, длина которых меньше длины наименьшего сегмента.