Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
TURBO_PASCAL.doc
Скачиваний:
4
Добавлен:
01.07.2025
Размер:
8.23 Mб
Скачать

18.5. Оптимизация работы оверлеев

В Турбо Паскале версии 5.5 реализован специальный алгоритм оптимизации подгрузки наиболее часто используемых оверлейных процедур и функций. В оверлейном буфере в общем случае может разместиться несколько не самых крупных оверлейных модулей. Если их объявлено несколько, то, как правило, так и происходит. Администратор следит за заполнением буфера, передвигая в нем при необходимости подгрузки нового модуля уже загруженные модули. Передвижение происходит от начала к концу буфера. Если же таким способом места в начале буфера не освободить, то наиболее «долго» сидящий в буфере (он же ближний к концу буфера) оверлей выгружается (если он, конечно, не активен в данный момент), высвобождая часть буфера. Можно активизировать механизм оптимизации, нахо-{400}дящийся по умолчанию в отключенном состоянии. Он заключается в следующем: когда оверлей подходит близко к концу буфера, он ставится на «проверку». Если в течение некоторого «испытательного срока» происходит вызов подпрограммы, которая находится в данном оверлее, то ему будет дана «отсрочка» и он не будет выгружен из памяти. Вместо этого он будет переброшен в начало буфера и сможет сделать еще один «круг» по нему. Если же за это время вызов не поступит, то оверлей при первой же необходимости будет выгружен из памяти. Таким образом, наиболее часто используемые оверлеи хранятся как бы в кольцевом буфере, в то время как малоактивные выходят из буфера без задержек. Этими процессами управляют две подпрограммы модуля Overlay.

18.5.1. Установка размера области испытаний

Функция OvrGetRetry : LongInt возвращает текущий размер области испытаний. До вызова процедуры OvrSetRetry будет всегда возвращать нуль.

Процедура OvrSetRetry ( Size : LongInt) устанавливает размер области испытаний в оверлейном буфере. Теперь при попадании оверлея в последние Size байт буфера он автоматически ставится на «испытание». Стартовый размер области испытаний равен нулю, что, по сути, блокирует работу механизма испытаний. Определить размер области испытаний можно только методом проб и ошибок. В техническом описании Турбо Паскаля рекомендуется отводить под эту область немногим более трети буфера. Включение механизма оптимизации ускоряет работу администратора оверлеев, но немного замедляет обращения к хранящимся в оверлеях подпрограммам. Вызов процедуры OvrSetRetry должен стоять после вызовов OvrInit и OvrInitEMS:

OvrInit( ovr_name ); { инициализация администратора }

OvrInitEMS; { попытка использовать EMS }

{Назначение области испытаний (и включение оптимизации):}

OvrSetRetry( OvrGetBuf div 3 );

18.5.2. Подсчет вызовов оверлеев

Предопределенные переменные OvrTrapCount и OvrLoadCount типа Word, привносимые модулем Overlay, хранят статистику обращений к OVR-файлу. Их стартовые значения — нули. Переменная OvrTrapCount хранит количество обращений к файлу в том случае, если нужный оверлейный модуль находится на диске или в буфере на «испытании». Другая переменная, OvrLoadCount, ведет подсчет {401} количества загрузок оверлея. Сопоставление этих двух значений может помочь выбрать оптимальный размер «области испытаний» (отношение OvrLoadCount к OvrTrapCount должно быть минимальным).

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]