Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Климов. Лекции / Алг_яз_Лекция_1.pptx
Скачиваний:
37
Добавлен:
14.05.2015
Размер:
1.49 Mб
Скачать

Доступный объем памяти определяется разницей значений переменных 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

Соседние файлы в папке Климов. Лекции