- •Алгоритмические языки программирования.
- •ОВЕРЛЕЙ
- •КАК СОЗДАТЬ ПРОГРАММУ БОЛЬШОГО РАЗМЕРА?
- •Оверлей - это такой способ использования оперативной памяти, при котором в один и
- •ГДЕ ХРАНЯТСЯ ОВЕРЛЕЙНЫЕ МОДУЛИ?
- •При выполнении программы, построенной по оверлейному принципу, в памяти находятся только те из
- •Программа
- •Оверлейный
- •Последовательность выполнения оверлейной программы
- •Загрузка нужных модулей в оверлейный буфер осуществляется автоматически и программисту не нужно об
- •Главное преимущество оверлейной структуры:
- •Главный недостаток оверлейной структуры:
- •ОБРАТИТЕ ВНИМАНИЕ!
- •Новые термины и понятия:
- •По умолчанию для оверлейн
- •Турбо Паскаль управляет оверлеями на уровне модулей
- •Файл с оверлейной частью программы должен размещаться в том же каталоге, что и
- •Оптимизация методов управления оверлейным буфером
- •АДМИНИСТРАТОР ОВЕРЛЕЕВ.
- •Подсистема управления оверлеями сохраняет в оверлейном буфере с
- •ОБРАТИТЕ ВНИМАНИЕ!
- •Оформление
- ••Поскольку оверлеи оформляются в виде модулей, то все правила построения модулей применимы и
- •ОФОРМЛЕНИЕ ОВЕРЛЕЕВ.
- •Директива компилятора
- •Пример:
- •ОБРАТИТЕ ВНИМАНИЕ!
- ••Если в оверлейном модуле есть раздел инициализации, то в нем, с одной стороны,
- •Последовательность создания оверлейных программ.
- •Процедуры и функции модуля Overlay
- •Инициализация
- •Процедура OvrInit(OvrFileName : STRING);
- •Условие:
- •Хотя использование кода инициализации и
- •Рациональный подход:
- •В модуле Overlay объявлена переменная
- •Возможные значения переменной OvrResult, а также список соответствующих им констант:
- •Для размещения оверлеев в расширенной памяти
- •Рекомендуется всегда использовать процедуру OvrInitEMS.
- •Управление
- •УПРАВЛЕНИЕ ОВЕРЛЕЙНЫМ БУФЕРОМ
- •Для управления оверлейным буфером применяется функция OvrGetBuf,
- ••Доступный объем памяти определяется разницей значений переменных MaxAvail, содержащей размер максимального непрерывного
- •УПРАВЛЕНИЕ ОВЕРЛЕЙНЫМ БУФЕРОМ
- •Оверлейный буфер Турбо Паскаля лучше всего представить в виде кольцевого буфера.
- •ПРОБЛЕМА В УПРАВЛЕНИИ ОВЕРЛЕЯМИ.
- •В Турбо Паскале найдено компромиссное решение этой
- •Оптимизация алгоритма управления оверлеями 57
- •Использование механизма испытаний (проб/отказов) приводит к тому, что часто используемые оверлеи будут сохраняться
- •УПРАВЛЕНИЕ МЕХАНИЗМОМ ИСПЫТАНИЙ.
- •По умолчанию механизм испытаний не используется.
•Доступный объем памяти определяется разницей значений переменных MaxAvail, содержащей размер максимального непрерывного
блока кучи, и OvrHeapSize,
содержащей начальный размер
буфера.
•Если значение параметра Size превышает текущий размер буфера, то недостающий объем памяти выделяется из кучи, а если меньше, то излишек помечается как свободный и возвращается в кучу.
51
УПРАВЛЕНИЕ ОВЕРЛЕЙНЫМ БУФЕРОМ
После вызова процедуры OvrSetBuf необходимо проверить значение переменной OvrResult.
Если ее значение равно OvrError, то это может быть обусловлено следующими причинами:
в куче с помощью процедур New и GetMem уже были размещены динамические переменные;
значение Size слишком мало для создания буфера;
не была проведена процедура инициализации.
52
53
Оверлейный буфер Турбо Паскаля лучше всего представить в виде кольцевого буфера.
Оверлеи всегда загружаются в начало буфера. При этом более "старые" оверлеи смещаются к его концу.
Когда буфер заполняется, то выгружается оверлей в конце буфера, если он в данный момент не используется, и выделяется место для новых оверлеев.
указатель |
указател |
конца |
ь начала |
Этот режим используется администратором оверлеев по умолчанию.
Однако Турбо Паскаль предоставляет возможность оптимизировать алгоритм управления оверлеями.
Механизм управления буфером
ПРОБЛЕМА В УПРАВЛЕНИИ ОВЕРЛЕЯМИ.
Предположим, что оверлей А содержит некоторые часто используемые подпрограммы.
Хотя некоторые из этих подпрограмм используются все время, существует вероятность, что оверлей А будет выгружен из буфера и вскоре загружен в него снова.
Проблема заключается в том, что подсистема управления оверлеями ничего не знает о частоте вызовов подпрограмм в оверлее А.
Она знает только, что если при обращении к подпрограмме оверлея А его нет в памяти, то нужно загрузить этот оверлей.
Одно из возможных решений — перехватывать каждое обращение к оверлею А и при каждом вызове перемещать его в начало буфера, чтобы было отражено его новое состояние — как последнего использованного оверлея.
Такой перехват вызовов будет слишком непроизводительным и в некоторых случаях может даже более замедлить работу программы,
чем дополнительная операция загрузки оверлея. |
55 |
В Турбо Паскале найдено компромиссное решение этой
проблемы, которое не приводит
к непроизводительным расходам ресурсов и обеспечивает высокую степень успеха в идентификации последних использованных оверлеев, которые не следуют выгружать.
56
Оптимизация алгоритма управления оверлеями 57
Использование механизма испытаний (проб/отказов) приводит к тому, что часто используемые оверлеи будут сохраняться в оверлейном буфере за счет того, что будет перехватываться почти каждый вызов, когда оверлей
приближается к концу
оверлейного буфера.
58
УПРАВЛЕНИЕ МЕХАНИЗМОМ ИСПЫТАНИЙ.
Для управления механизмом испытаний предназначены
функция OvrGetRetry и процедура OvrSetRetry.
Функция OvrGetRetry: Longlnt;
возвращает текущий установленный размер области испытаний.
В начале работы программы размер области испытаний всегда равен нулю.
Процедура OvrSetRetry(Size: Longlnt);
устанавливает размер Size области испытаний.
Параметр Size определяет размер этой области в конце буфера.
Данная процедура должна вызываться после процедур
OvrInit и OvrInitEMS.
59
По умолчанию механизм испытаний не используется.
Если по каким-то причинам он необходим, то обычно
рекомендуется назначать размер
области испытаний, равный примерно одной трети буфера.
Обычно это выполняется командой
OvrSetRetry(OvrGetBuf DIV 3);
60