Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
СПО.doc
Скачиваний:
46
Добавлен:
12.03.2015
Размер:
605.18 Кб
Скачать

6. Оверлей

Оверлейной структурой под управлением ОС MS-DOS называется специальный комплекс программ позволяющий экономить оперативную память при выполнении программы. Под управление ОС Windows оверлей называется динамическими библиотеками.

Для того чтобы сделать оверлейную программу в Turbo Pascal пользователь должен осуществить 2 этапа:

  1. Построить структурную схему программы.

  2. Определить в главной программе использование библиотеки overlay и задать опции управления в программах.

6.1 Структура программного комплекса

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

Теперь после структурирования модулиB и E, C, D и I могут заменятся друг на друга. При этом длина загруженного модуля будет определятся по длине максимальной ветки оверлея.

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

6.2. Распределение памяти в оверлейной структуре

При использовании оверлея особое внимание следует уделить публичным переменным, т.е. общим областям памяти, в которых хранятся данные в процессе выполнения подпрограмм. В нашем случае допускаются общие переменные для модуля A и всех других. Для модулей B и E, для модулей D и I. Для всех других модулей общих переменных быть не должно. Передача данных должна осуществляется через параметры переменные или возвраты функций.

Вообще, в других ОС (Unix) допускается несколько уровней оверлея. В нашем примере B, С и D могут быть расположены на одном уровне оверлея, а E и I – на втором уровне.

При программировании под ОС Windows в языках Visual C и Delphi пользователь не обязан строить структурную схему Достаточно задать соответствующую опцию транслятора, но проблема общих областей данных не снимается.

Если программа участвует в оверлее то первым утверждением должно быть {$O+}

Утверждение {O+} и короткая ссылка, т.е. модуль занимает меньше чем одну страницу, взаимно исключаются, т.е. общий объем оверлейной программы будет больше чем одна страница и после трансляции программы формируются 2 файла.

<N>.EXE

<N>.OVR

Не рекомендуется в головной программе отдавать процессам управление ввода-вывода ОС, т.е. {I+} не должно быть.

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

6.3. Пример программы с использованием оверлея.

{$O+,F+} ставится в оверлейных модулях, обязательно включение длинной адресации между подпрограммами.

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

Пример оверлейной программы

Первый модуль:

{$O+,F+}

unit ovrD1;

interface

procedure OvrDemo1;

implementation

procedure OvrDemo1;

begin

writeln(‘One…’);

end;

begin

end.

Второй модуль:

{$O+,F+}

unit ovrD2;

interface

procedure OvrDemo2;

implementation

procedure OvrDemo2;

begin

writeln(‘Two…’);

end;

begin

end.

Головная программа:

Program OvrDemo;

Uses Overlay,OvrD1,OvrD2,crt;

{далее описываем последовательность заменяемых модулей}

{$O OvrD1}

{$O OvrD2}

begin

OvrInit(‘OvrDemo.ovr’);

{строим оверлейную структуру на основе главного модуля, поетому в отличие от других главных модулей, утверждение programm для построения оверлейной структуры обязательно}

if ovrResult<>0 then

begin

writeln(‘Ошибка N’,ovrResulr);

halt(1);

end;

{если результат инициализации оверлея не равен 0, то выходим из программы с указанием кода ошибки}

{ Ошибки и их номера, могущие возникнуть при использовании оверлея:

-1 ошибка управления оверлея (как правило перекрестная ссылка)

-2 файл оверлея не найден

-3 нет памяти для буфера оверлея

-4 ошибка ввода-вывода оверлейного файла

-5 не загружен драйвер расширенной памяти, если оверлей использует расширенную память.

-6 нет свободной расширенной памяти.}

repeat

ovrDemo1;

ovrDemo2;

until KeyPressed;

end.