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

Использование памяти в программах Windows

В данном разделе поясняется использование памяти в програм-

мах Borland Pascal для Windows.

Атрибуты сегментов

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

поведение при загрузке в память.

Атрибуты moveable или fixed

Когда сегмент является перемещаемым (MOVEABLE), Windows,

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

перемещать сегмент в физической памяти. Когда сегмент кода фикси-

рованный (FIXED), он не перемещается в физической памяти. Более

предпочтителен атрибут MOVEABLE, и если нет абсолютной необходи-

мости хранить сегмент кода по одному и тому же адресу в физичес-

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

прерываний), следует использовать атрибут MOVEABLE.

Атрибуты preload или demandload

Сегмент кода, имеющий атрибут PRELOAD, при активизации прик-

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

бут DEMANDLOAD откладывает загрузку сегмента до тех пор, пока

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

Атрибуты discardable или permanent

Когда сегмент имеет атрибут DISCARDABLE, Windows при необхо-

димости выделения дополнительной памяти может освобождать память,

занимаемую данным сегментом. Когда прикладная программа обращает-

ся к выгружаемому сегменту (DISCARDABLE), которого нет в памяти,

Windows загружает его сначала из файла .EXE. Это занимает большее

время, чем если бы сегмент был постоянным (PERMANENT), но позво-

ляет прикладной программе при выполнении занимать меньше места.

Грубо говоря, сегмент DISCARDABLE в прикладной программе

Windows очень напоминает оверлейный сегмент в программе DOS.

Изменение атрибутов

По умолчанию сегменту кода назначаются атрибуты MOVEABLE,

PRELOAD и PERMANEMT, но с помощью директивы компилятора $C вы мо-

жете их изменить. Например:

{$C MOVEABLE DEMANDLOAD DISCARDABLE}

Примечание: Более подробно о директиве $C рассказыва-

ется в Главе 2 ("Директивы компилятора") "Справочного руко-

водства программиста".

В прикладной программе Windows нет необходимости выделять

подсистему управления оверлеями. Администратор памяти Windows

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

атрибутами сегмента кода. Эти средства доступны любой прикладной

программе Windows.

Сегмент локальных динамических данных

Каждая прикладная программа или библиотека имеет один сег-

мент данных, который называется сегментом локальных динамических

данных и может занимать до 64К. На сегмент локальных динамических

данных всегда указывает регистр сегмента данных DS. Он разделен

на четыре части:

Сегмент локальных динамических данных

------------------------------------

¦ ¦

¦ Локальная динамически распределя- ¦

¦ емая область памяти ¦

¦ ¦

+-----------------------------------+

¦ ¦

¦ Стек ¦

¦ ¦

+-----------------------------------+

¦ ¦

¦ Статические данные ¦

¦ ¦

+-----------------------------------+

¦ ¦

¦ Заголовок задачи ¦

¦ ¦

L------------------------------------

Рис. 21.7 Сегмент локальных динамических данных.

Первый 16 байт сегмента локальных динамических данных всегда

содержат заголовок задачи, в котором Windows сохраняет различную

системную информацию.

Область статических данных содержит все глобальные перемен-

ные и типизированные константы, описанные в прикладной программе

или библиотеке.

Сегмент стека используется для хранения локальных перемен-

ных, распределяемых процедурами и функциями. На входе в приклад-

ную программу регистр сегмента стека SS и указатель стека SP заг-

ружаются таким образом, что SS:SP указывает на первый байт после

области стека в сегменте локальных динамических данных. При вызо-

ве процедур и функций SP перемещается вниз, выделяя память для

параметров, адреса возврата и локальных переменных. Когда подп-

рограмма возвращает управление, процесс изменяется на обратный:

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

зовом. Используемый по умолчанию размер области стека в автомати-

ческом сегменте данных равен 8К, но с помощью директивы компиля-

тора $M это значение можно изменить.

В отличие от прикладной программы библиотека в сегменте ло-

кальных динамических данных не имеет области стека. При вызове в

динамически компонуемой библиотеке DLL процедуры или функции ре-

гистр DS указывает на сегмент локальных динамических данных биб-

лиотеки, но пара регистров SS:SP не изменяется. Таким образом,

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

мы.

Последняя часть в сегменте локальных динамических данных -

локальная динамически распределяемая область. Она содержит все

локальные динамические данные, которые распределялись с помощью

функции LocalAlloc в Windows. По умолчанию локальная динамически

распределяемая область имеет размер 8К, но это значение можно из-

менить с помощью директивы компилятора $M.

Windows допускает, чтобы сегмент локальных динамических дан-

ных был перемещаемым, но Borland Pascal этого не поддерживает.

Сегмент локальных динамических данных прикладной программы или

библиотеки Borland Pascal всегда блокируется, этим обеспечивает-

ся, что селектор (адрес сегмента) сегмента локальных динамических

данных никогда не изменяется. При работе в стандартном или расши-

ренном режиме это не приводит ни к какому ухудшению, поскольку

сегмент сохраняет тот же селектор даже при перемещении в физичес-

кой памяти. Однако в реальном режиме, если требуется расширение

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

не сможет этого сделать, поскольку сегмент локальных динамических

данных перемещаться не может. Если ваша прикладная программа ис-

пользует локальную динамически распределяемую область памяти и

должна выполняться в реальном режиме, то следует обеспечить, что-

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

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

нии локальной динамической области (для этого используется дирек-

тива компилятора $M).

Соседние файлы в предмете Программирование на Pascal