Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции_Паскал.doc
Скачиваний:
2
Добавлен:
21.09.2019
Размер:
1.21 Mб
Скачать

Оверлеї

Використання мови Turbo Pascal для програмуванні реальних задач у ряді випадків ускладнюється обмеженнями зв'язаними з розміщенням великих програм в оперативній пам'яті. У загальному випадку без використання спеціальних засобів максимальний розмір програми не може перевищувати обсяг вільної оперативної пам'яті.

З метою подолання цього природного обмеження в системі Turbo Pascal мається спеціальний механізм, що називається оверлейним. Застосування оверлейного механізму дозволяє розробляти великі і складні програми, розмір яких значно перевищує об’єм оперативної пам'яті.

Базовим принципом оверлейного механізму є представлення програми у виді сукупності фрагментів, що поперемінно займають ту саму область оперативної пам'яті. При необхідності виконання того чи іншого фрагмента він завантажується в оперативну пам'ять, витісняючи з неї фрагмент, що виконувався раніше.

Оверлейний механізм є відомим і найбільш поширеним методом подолання обмежень по оперативній пам'яті при відсутності в операційної системи засобів віртуалізації пам'яті. Крім системи Turbo Pascal, розвитий оверлейний механізм використовується, наприклад, при формуванні об'єктного коду в системі Сlіррег. Як правило, алгоритм розміщення і видалення оверлейних фрагментів реалізується спеціальним системним монітором, який розташовують в коді розроблювальної програми.

Природно, оверлейна програма буде виконуватися повільніше, ніж виконується (чи могла б виконуватися) еквівалентна їй звичайна програма, за рахунок часу підкачування оверлейних фрагментів. Однак це уповільнення є необхідною платою за виграш у загальному розмірі програми.

Засоби побудови оверлейних структур у мові Turbo Pascal досить прості для використання (зберігаючи в цьому відношенні загальний дух ясності і компактності мови Pascal), і базуються на наступних основних принципах.

          1. Оверлейна програма повинна бути реалізована як керуюча (резидентна) частина, що постійно буде знаходитися в пам'яті, і декілька оверлейних фрагментів, коди яких будуть поперемінно завантажуватися в спеціальний оверлейний буфер в оперативній пам'яті, що автоматично виділяється між сегментом стека і динамічною областю пам'яті. За замовчуванням для оверлейного буфера вибирається мінімальний можливий розмір, але під час виконання програми його розмір може бути легко збільшений шляхом виділення додаткової області.

          2. Оверлейні фрагменти повинні бути оформлені у виді МОДУЛІВ, з спеціальною директивою {$О+}.

          3. Ніяких додаткових мовних конструкцій для оверлейного механізму не передбачено; усі засоби керування оверлеями зосереджені в системному модулі Overlay.

          4. При трансляції оверлейної програми Turbo Pascal-компілятор працює в так: керуюча (не-оверлейна) частина програми оформляється у виді EXE-файлу; всі оверлейні частини (тобто коди модулів) об’єднуються у файл із тим же самим ім'ям, але з розширенням . OVR:

У сі звертання до оверлейних процедур і фуикцій повинні здійснюватися за допомогою далекого типу викликів. Для цього такі підпрограми (чи оверлейні модулі в цілому), а також основну програму необхідно компілювати з включеною директивою $F чи додавши після заголовка підпрограм службове слово far.

          1. Основна частина оверлейнї програми повинна, зрозуміло, містити оператор uses, у якому перелічуються використовувані оверлейні модулі (у цьому ж описі можуть бути зазначені і не оверлейні модулі, використовувані програмою). Першим модулем в описі повинний бути зазначений системний модуль Overlay. Крім того, слідом за цим описом повинні розміщатися директиви компілятора, що вказують, які модулі з перерахованих в описі uses є оверлейними. Кожна така директива має вид:

{$О Ім'я_модуля}

Ім'я модуля в цій директиві повинне ідентифікувати дисковий файл із кодом оверлейного модуля. Допускається вказівка дисковода і/або адреси модуля. Розширення імені (. TPU) може бути опущено.

Помітимо, що з усіх системних модулів TurboPascal у якості оверлейного може бути використаний ТІЛЬКИ модуль Dos.

          1. У тілі головної програми перед першим звертанням до якої-небудь оверлейної підпрограмі повинний бути виклик стандартної процедури OvrInit з модуля Overlay. Ця процедура ініціалізує підсистему керування оверлеями; єдиним її параметром є рядок з ім'ям файлу, у якому зібрані коди оверлейних модулів (ovr-файл).

Нижче приведений простий приклад оверлейної програми, що складається з головної програми і двох оверлейних модулів. Цей приклад входить у групу демонстраційних файлів стандартного постачання системи Turbo Pascal.

{$F+,O+} { директиви $F, $0 включені }

program OvrDemo;{ головна частина оверлейної

програми }

{ У uses-списку повинний бути зазначений модуль Overlay, a також оверлейні модулі; указівка модуля Crt показує, що в списку повинні бути усі використовувані в програмі модулі }

uses

Overlay, Crt, OvrDemol, OvrDemo2;

{$0 OvrDemol} { Вказівка оверлейних модулів з }

{$0 OvrDemo2} { числа зазначених у uses-списку }

begin

{ Використовуємо засоби модуля Crt }

TextAttr := White; ClrScr;

{ Ініціалізація системи керування оверлеями }

OvrInit('OVRDEMO.OVR')

if OvrResult <> 0 then

begin

Writeln('Помилка: ', OvrResult); Halt(l)

end;

{Коди процедур Writel і Write2, розташовані в оверлейних модулях, будуть при виконанні

програми поперемінно завантажуватися в оверлейний буфер }

repeat

Writel; Write2 until

KeyPressed

end.

Файл OVRDEM01.PAS

{$0+,F+}

unit OvrDemol;

interface

procedure Writel;

implementation

procedureWritel;

begin

Writeln('Один. . . ');

end;

end.

Файл OVRDEMO2.PAS

{$0+,F+}

unit OvrDemo2;

interface

procedure Write2;

implementation

procedure Write2;

begin

Writeln('Два. . .');

end;

end.