Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие 6004.doc
Скачиваний:
21
Добавлен:
30.04.2022
Размер:
1.29 Mб
Скачать

2.5.Управление памятью

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

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

2.5.1.Модели памяти

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

Секция кода состоит из одного или более сегментов кода с именами _TEXT (один сегмент кода) или name_TEXT (для случая нескольких сегментов; name - имя модуля).

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

_DATA или name_DATA - сегмент инициализированных и внешних статических данных;

_BSS - сегмент неинициализированных внешних и статических данных.

Данные, хранящиеся в сегментах _DATA и _BSS, реализуют статический принцип распределения памяти.

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

Для динамического распределения памяти выделяется пул (Нeap). Различают ближний пул - near Нeap и дальний пул - far Нeap. Ближний пул расположен в одном сегменте с секцией данных и для адресации в пределах этого пула достаточно только смещения. Дальний пул располагается в отдельном сегменте и для его указания требуется задание полного адреса: seg:off.

Существует семь моделей памяти, шесть из которых сегментированы и используются при разработке 16-ти разрядных приложений (TINY, SMALL,MEDIUM,COMPACT, LARGE и НUGE) и одна модель (FLAT) - несегментированная, на ее основе разрабатываются 32-х разрядные приложения.

TINY состоит из одного сегмента размером до 64К без отдельных разделов для стека и пула.

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

MEDIUM состоит из одного или более сегментов кода и одного сегмента данных. Возможно выделение памяти в дальнем и ближнем пулах.

COMPACT состоит из одного сегмента кода и одного сегмента данных, сегмента стека и дальнего пула.

LARGE включает один или более сегментов кода, один сегмент данных, сегмент стека и дальний пул.

HUGE может иметь один или более сегментов данных и кода, стек и дальний пул. Адреса в секции кода нормализованы так, что величина смещения не превышает 0x000F.

FLAT - 32-х разрядная модель, в состав которой может входить произвольное число сегментов данных, адресуемых в едином пространстве. Модель позволяет адресовать до 2 Гбайт адресного пространства.