46019 (665326), страница 31

Файл №665326 46019 (Turbo C++ Programer`s guide) 31 страница46019 (665326) страница 312016-07-31СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 31)

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

- "Программа слишком велика для имеющейся памяти"), либо сообщение кода загрузки С ("Not enough memmory to run program").

Важной опцией программы управления оверлеями являетсяего способность при удалении моделей из оверлейного буфера выполнять их свопинг с дополнительной расширенной памятью. Следующий раз, как только данный модуль понадобится, он в этом случае будет не считан с диска, а просто скопирован из этой памяти.Это существенно ускоряет свопинг.

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

Модель MEDIUM Модель LARGE

\! класс CODE \! Резидентный \! класс CODE \!

\! \! код \! \!

--\!----------------\! \!----------------\!

Эти сегменты \!\!класс OVRINFO\!Данные для\!класс OVRINFO\! генерируются \! \! \! управления \! \! компоновщиком \! \! \! оверлеями \! \! автоматически-\! \!----------------\! \!----------------\!

\! \! класс STUBSEG \! Один сегмент \! класс STUBSEG \! \! \! \! stub для \! \!

\! \! \! каждого \! \!

\! \! \! оверлейного \! \!

\! \! \! сегмента \! \!

--\!----------------\! ------------ \!----------------\!

\! _DATA \! \! _DATA \!

Ближняя куча \! класс DATA \! \! класс DATA \! и стек разделяют \! \! \! \!

сегмент данных \!ближняя куча\!Отдельный\!--------------\! \! ^ \!сегмент \! ^ \!

\! | стек \!стека \! | стек \!

\!----------------\! ------------ \!----------------\!

\!оверлейный буфер\! \!оверлейный буфер\!

\!(распределяется \! \!(распределяется \!

\! при загрузке) \! \! при загрузке) \!

\!----------------\! ------------ \!----------------\!

\! | дальняя \! \! | дальняя \!

\! v куча \! \! v куча \!

\! \! \! \!

Модель HUGE

Резидентный \! класс CODE \! код \! \!

-- \!----------------\!

Эти сегменты \! Данные для \! класс OVRINFO \!

генерируются \! управления \! \!

компоновщиком \! оверлеями \! \!

автоматически-\! \!----------------\!

\! Один сегмент \! класс STUBSEG \!

\! stub для \! \!

\! каждого \! \!

\! оверлейного \! \!

\! сегмента \! \!

-- ------------ \!----------------\!

. . . Несколько \!----------------\!

сегментов \!----------------\!

данных \!----------------\!

\!----------------\!

Отдельный \!----------------\! сегмент \! ^ \!

стека \! | стек \!

------------ \!----------------\! \!оверлейный буфер\! \!(распределяется \!

\! при загрузке) \!

------------ \!----------------\! \! | дальняя \!

\! v куча \!

\! \!

Рис.4.9 Распределение памяти для оверлейных структур

Использование преимуществ использования оверлеев Turbo C++

Для полного использования преимуществ оверлейных структур, создаваемых Turbo C,

- Минимизируйте резидентный код (резидентные библиотеки исполняющей системы, обработчики прерываний и драйверы устройств).

- Установите размер оверлейного пула таким образом, чтобы добиться наиболее комфортных условий для создаваемой программы (начните со 128К и регулируйте этот размер вверх и вниз, пока не установите желаемое соотношение между бустродействием и размером программы.

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

Требования

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

- Минимальная часть программы, которая может быть выделена в качестве лверлея, это сегмент.

- Прикладные программы с оверлейной структурой должны иметь одну из трех следующих моделей памяти: medium, large или huge; модели tiny, small и compact оверлеи не поддерживают.

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

Генерирование оверлеев во время компоновки полностью независимо от управления сегментами во время исполнения программы; компоновщик не включает автоматически каких-либокодовдля управления оверлеями. Действительно, с точки зрения компоновшика программа управления оверлеями является просто одним из подлежащих компоновке участков кода. Единственное предположение, которое делает компоновщик, состоитв том, что программа управления оверлеями принимает вектор прерываний (обычно INT 3FH), через который происходитуправление динамической загрузкой. Такой уровень прозрачности упрощает создание пользовательских программ управления оверлеями, наилучшим образом управляющих требованиям конкретной прикладной программы.

Использование оверлеев

Для создания программы с оверлейной структурой все ее модули должны компилироваться с включенной опцией компилятора -Y. Для того, чтобы сделать оверлейным конкретный модуль, его следует компилировать с опцией -Yo. (-Yo автоматически включает опцию -Y).

Опция -Yo распространяется навсе модули ибиблиотеки, следующие за ней в командной строке TCC. Отменить ее можно, задав -Yo-.Эти две опции являются единственными опциями командной строки, которые могут следовать после имен файлов. Например,для того,чтобы сделатьоверлейным модуль OVL.C, но не библиотеку GRAPHICS.LIB, можно использовать любую из следующих командных строк:

TCC -ml - Yo ovl.c -Yo- graphics.lib

или

TCC -ml graphics.lib -Yo ovl.c

Если при запуске TLINK явно задана компоновка файла .EXE, то в командной строке компоновщика должна быть задана опция/o. Использование опции /o описано в разделе TLINK главы 5, "Утилиты",

Руководства пользователя.

Пример оверлейной структуры

Предположим, вы хотите иметь оверлейную структуру в программе, состоящейиз трех модулей: MAIN.C, O1.C и O2.C. Оверлеями должны являться модули O1.C и O2.C. (MAIN.C содержит зависящие оттекущего времени подпрограммы иобработчики прерываний ипотому должна оставаться резидентной). Предположим, что данная программа использует модель памяти large.

Следующая команда позволяет выполнить данную задачу:

TCC -ml -Y main.c -Yo o1.c o2.c

В результате получится выполняющийся файл MAIN.EXE с двумя оверлеями.

Организация оверлеев в интегрированной среде разработки (IDE)

___________________________________________________________

Для организации оверлейных модулей в условиях интегрированной среды разработки следует выполнить шаги:

1. Войти в диалоговое поле Options \! Compiler \! Code Generation и установить опцию Overlays On.

2. Войти в Options \! Linker и установит опцию Overlay On.

3. В менеджере проекта используйте элемент Options для задания каждого модуля, который должен войти в оверлей.

Первый шаг представляет собойэквивалент интегрированной среды разработки опции -Y компилятора командной строки. Если не установить данную опцию в состояние on, то нельзя использовать и две указанных далее опции. Вторая опция управляет тем, должна ли данная информация озадании оверлеев использоваться во время компоновки в IDE. Переведя эту опцию в состояние off, вы можете тем самым глобальноотменить создание ооверлеев,не выполняя перекомпиляцию и не изменяязначений индивидуальных установок модулей в менеджере проекта. Опция на третьем шаге управляет тем, какие модули войдут в оверлеи, а какие останутся фиксированными. Эта опция похожа на опцию командной строки -Yo.

Для построения .EXE-файла с оверлеями скомпилируйтевсе модули с опцией Code Generation \! Overlays On(сперва убедитесь, что выбрана опция Options \! Full Menus On).

Ни одиниз входящих в оверлей модулей никогда не должен изменять умолчание имени класса кода (Code Class). Интегрированная среда позволяет изменить набор входящих в оверлеи модулей, не заботясь о рекомпиляции. Это возможно (с текущей информацией об .OBJ-файлах) только при условии, что оверлеи сохраняют имена класса кода по умолчанию.

Разработка программ с перекрытиями

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

Требование дальних (far) вызовов

При компиляции оверлейного модуля выдолжны использовать большую модель памяти (medium, large или huge). При всяком вызове функции из оверлейного модуля вы обязаны гарантировать, что все активные в текущий момент функции являются дальними.

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

Важное замечание !

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

Размер буфера

Размер оверлейного буфера по умолчанию в два раза превышает размер самого большого оверлея. Для большинства прикладных программ такое умолчание вполне адекватно. Одако же, представим себе ситуацию, когдакакая-либо функция программыреализована несколькими модулями, каждый из которых является оверлейным. Если общий размер этих модулей превышает размер оверлейного буфера, то если модули часто вызывют друг друга, это приведет к большому числу свопингов.

Очевидно, что решение здесь заключается в увеличении размера оверлейного буфера до таких размеров, чтобы в любой момент времени в нем помещались все часто вызывающие друг друга оверлеи. Это можно сделать, установив через глобальную переменную _ovrbuffer требуемый размер в параграфах. Например, для установки размера оверлейного буфера равным 128К, включите вваш код следующий оператор:

unsigned _ovrbuffer = 0x2000;

Общей формулы для определения идеального размера оверлейного буфера не существует. Turbo Prifiler фирмы Borland поможет определить необходимое значение. Если вы не располагаете данным продуктом, то найти размер буфера вам поможет понимание прикладной задачи и немного зкспериментирования.

В каких случаях не следует создавать оверлейные структуры

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

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

Отладка оверлеев

Большинство отладчиков либо имеет весьма ограниченные средства отладки программ с оверлейной структурой, либо вообще не имеет таких средств. Иначе дело обстоит синтегрированным со средой разработки отладчиком TurboC++ и отладчиком автономным отладчиком Turbo Debugger. Обаэти отладчика полностью поддерживают пошаговую отладку и установку точек прерывания в оверлеях совершенно прозрачным длявас способом. Благодаря использованию оверлеев вы имеете возможность легко разрабатывать и отлаживать громоздкие прикладные программы - как в интегрированной среде, так и при помощи Turbo Debugger.

Внешние (external) подпрограммы в оверлеях

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

Если подпрограмма на языке ассемблера выполняет вызов любой оверлейной функции, то такая подпрограмма должна иметь объявление FAR и должна устанавливать стековый фрейм при помощи регистра BP. Например, если OtherFunc это оверлейная функция в другом модуле, и ее вызывает подпрограмма на языке ассемблера ExternFunc, то тогда ExternFunc должна быть FARи устанавливать стековый фрейм, как показано ниже:

ExternFunc PROC FAR push bp ;сохранить bp

mov bp,sp ;установить стековый фрейм

sub sp,LocalSize ;распределить локальные переменные

...

call OtherFunc ;вызов другого оверлейного модуля

...

mov sp,bp ;освобождение локальных переменных

pop bp ;восстановление BP

RET ;возврат

ExternFunc ENDP

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

Эти требования остаются теми же в случае, когда TxternFunc делает косвенные ссылки наоверлейные функции. Например, если OtherFunc вызывает оверлейные функции, носама не является оверлейной, то ExternFuncдолжнабыть FAR и также должна устанавливать стековый фрейм.

В случае, когда яссемблерная подпрограмма не делает ни прямых, ни косвенных ссылок на оверлейные функции, то специальные требования отсутствуют; подпрограмма на языке ассемблера может быть объявлена как NEAR. Она не обязана устанавливать стековый фрейм.

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

Свопинг

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

В обоихслучаях есть две возможности: программа управления оверлеями может либо обнаруживать наличиедополнительнойили расширенной памяти самостоятельно и затем брать на себя управление этой памятью, либо использовать уже обнаруженную и распределенную часть такой памяти. В случае расширенной памяти обнаружение памяти не во всех случаях выполняется удачно, поскольку многие программы кэширования памяти и программы организации виртуального диска могут использовать эту память, не делая об этом никаких отметок. Чтобы избежать этих проблем, выдолжнысообщить программе управления оверлеями начальный адрес расширенной памяти и какой участок ее можно безопасно использовать.

Дополнительная память (EMS)

Характеристики

Тип файла
Документ
Размер
2,71 Mb
Тип материала
Учебное заведение
Неизвестно

Список файлов реферата

Свежие статьи
Популярно сейчас
А знаете ли Вы, что из года в год задания практически не меняются? Математика, преподаваемая в учебных заведениях, никак не менялась минимум 30 лет. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6518
Авторов
на СтудИзбе
302
Средний доход
с одного платного файла
Обучение Подробнее