Организация оверлейных структур



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

При создании программы с простой структурой все ее модули (код и данные) “склеиваются” в единый загрузочный модуль на этапе компоновки программы. Программа для выполнения размещается в памяти целиком. Если требуемый объем памяти недоступен, программа не может начать выполнение.

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

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

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

Процедуры A (и вызываемые из нее) и E могут быть размещены в перекрывающихся сегментах. Так же могут перекрывать друг друга в памяти процедуры C и D. Другие перекрытия в данном случае недопустимы.

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

 

Program P; procedure A; begin ... B; ... end; procedure B; begin ... C; ... D; end; procedure C; begin ... end; procedure D; begin ... end; procedure E; begin... end; begin A;B;E; end.   P     A B E     B C D C D         Сегмент 1   Сегмент 2 (включает в себя сегмент 3)     Сегмент 3   (содержится в сегменте 2)  
а б в

Рис.3.3. Пример программы с возможными перекрытиями:

а) текст программы с вызовами процедур;

б) структура программы;

в) распределение памяти под сегменты

 

Сегмент 1 является корневым - в нем размещается программа P. Сегмент 2 содержит во время выполнения программы процедуру A и вызываемые из нее процедуры (B, C и D) или процедуру E. Внутри этого сегмента могут перекрывать друг друга во время выполнения процедуры C и D, одновременное присутствие которых в памяти необязательно. Поэтому внутри сегмента резервируется место для размещения процедур A и B и третьего сегмента, в который может быть загружена процедура C или процедура D. Поэтому размер второго сегмента определяется по следующему правилу:

max(size(A)+size(B)+max(size(C)+size(D)),size(E)),

где max(size(C)+size(D) определяет размер третьего сегмента, вложенного во второй.

На рисунке заштрихованы блоки памяти, в которых происходит перекрытие: процедура E перекрывает процедуры A и B во втором сегменте (размер области перекрытия равен min(size(A)+size(B), size(E), здесь size(A)+size(B) > size(E)), а в третьем сегменте, начинающемся сразу за областью, распределяемой A и B, перекрывают друг друга процедуры C и D (заштрихованная область перекрытия имеет размер, равный min(size(C), size(D)).

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

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

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


Дата добавления: 2016-01-05; просмотров: 17; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!