Четвертый Borland C++ и его окружение

Работа программ с оверлеями


Программа управления оверлеями (VROOMM, или Virtual Run-time

Object-Oriented Memory Manager) выполняет за вас большую часть

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

этого же модуля и из базового модуля, но не из других модулей.

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

при активизации занимают один и тот же участок физической памяти.

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

Эта обычная схема не обеспечивает достаточной гибкости. Она

требует полного учета всех возможных обращений между модулями

программы и, соответственно, планируемой вами, группировки оверлеев. Если вы не можете разбить вашу программу в соответствии со

взаимозависимостью обращений между ее модулями, то вы не сможете

и разбить ее на оверлеи.

Схема VROOMM совершенно иная. Она обеспечивает динамический



свопинг сегментов. Основной единицей свопинга является сегмент.

Сегмент может состоять из одного или нескольких модулей. И что

еще более важно, любой сегмент может вызывать любой другой сегмент.

Вся память делится на базовую область и область свопинга.

Как только встречается вызов функции, которая не находится ни в

базовой, ни в области свопинга, сегмент, содержащий вызываемую

функцию, помещается в область свопинга, возможно, выгружая оттуда

при этом другие сегменты. Это мощное средство - подобное виртуальной программной памяти. От вас больше не требуется разбивать

код на статические, отдельные оверлейные блоки. Вы просто запускаете программу!

Что происходит, когда возникает необходимость поместить сегмент в область свопинга? Если эта область имеет достаточно свободного места, то данная задача выполняется просто. Если же нет,

то из области свопинга, чтобы искомая свободная область освободилась, должен быть выгружен один или более сегментов. Как выбрать




сегменты для выгрузки? Действующий здесь алгоритм очень сложен.

Упрощенная версия его такова: если в области свопинга имеется неактивный сегмент, то для выгрузки выбирается он. Неактивными считаются сегменты, в которых в текущий момент нет выполняемых функций. В противном случае берется активный сегмент. Удаление

сегментов из памяти продолжается до тех пор, пока в области свопинга не образуется достаточно свободной памяти для размещения

там требуемого сегмента. Такой метод называется динамическим свопингом.

Чем больше памяти выделено для области свопинга, тем лучше

работает программа. Область свопинга работает как кэш-память: чем

больше кэш, тем быстрее работает программа. Наилучшие значения

размера области свопинга определяются размерами рабочего множества данной программы.

После загрузки оверлея в память он помещается в оверлейный

буфер, который расположен в памяти между сегментом стека и дальней динамически распределяемой областью. По умолчанию размер

оверлейного буфера вычисляется и устанавливается при загрузке

программы, но его можно изменить при помощи глобальной переменной

_ovrbuffer. Если достаточный размер памяти недоступен, то появляется либо сообщение об ошибке DOS ("Program too big to fit in memory" - "Программа слишком велика для имеющейся памяти").

Важной возможностью программы управления оверлеями является

ее способность при удалении моделей из оверлейного буфера выполнять их свопинг с дополнительной расширенной памятью. Следующий

раз, как только данный модуль понадобится, он в этом случае будет

не считываться с диска, а просто копироваться из этой памяти. Это

существенно ускоряет свопинг.

При использовании оверлеев память распределяется, как показано на следующем рисунке:


Содержание раздела