Электронная библиотека книг Александра Фролова и Григория Фролова.
Shop2You.ru Создайте свой интернет-магазин
Библиотека
Братьев
Фроловых

Операционная система Microsoft Windows 3.1 для программиста

© Александр Фролов, Григорий Фролов
Том 13, М.: Диалог-МИФИ, 1993, 284 стр.

[Назад] [Содеожание] [Дальше]

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

Для приложений Windows вы можете выбрать одну из четырех моделей памяти: small, medium, compact или large.

Все приложения, рассмотренные нами ранее, были подготовлены в модели памяти small. Для этой модели при загрузке приложения в память создается два сегмента - сегмент кода и автоматический сегмент данных. Перед тем как передать управление приложению, Windows записывает адрес сегмента кода в регистр CS, адрес автоматического сегмента данных - в регистры DS и SS. Таким образом, в этой модели памяти для стека и автоматического сегмента данных используется один и тот же сегмент.

Сегмент кода, так же как и сегмент данных, может быть перемещаемым и удаляемым. Соответствующие атрибуты указываются в файле определения модуля при помощи операторов CODE и DATA:

CODE preload moveable discardable
DATA preload moveable multiple

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

Для сложных приложений Windows удобно использовать модель памяти medium, в которой создается один сегмент данных и несколько сегментов кода. Однако вызов дальней функции (а в модели памяти medium все функции вызываются как дальние) выполняется дольше, чем в MS-DOS. Это связано с наличием в Windows механизма перемещения сегментов.

Чаще, однако, работают со смешанными моделями памяти, используя при описании функций и данных ключевые слова FAR и NEAR. Заметим, что даже если ваше приложение было подготовлено в модели памяти small, оно на самом деле пользуется смешанной моделью памяти, так как все функции программного интерфейса Windows определены как дальние.

Вы можете также использовать модели памяти compact (один сегмент кода и несколько сегментов данных) и large (несколько сегментов кода и несколько сегментов данных). Но для этих моделей есть одно существенное ограничение - можно запускать только одну копию приложения, созданного с использованием таких моделей памяти. Если запустить несколько приложений, созданных, например, в модели памяти large, для каждой копии приложения будет создан свой автоматический сегмент, но все остальные сегменты кода и данных будут существовать в единственном экземпляре и адресоваться всеми копиями приложения. Иными словами, все копии приложения будут иметь общие сегменты кода и данных (исключая автоматический сегмент).

Если ваше приложение создано в модели памяти medium, имеет смысл сгруппировать различные функции в несколько сегментов и для каждого сегмента определить свои атрибуты. Например, функции инициализации приложения следует расположить в сегменте с атрибутами PRELOAD и DISCARDABLE. В этом случае эти функции будут загружены в памяти в процессе запуска приложения и впоследствии будут удалены. Функции, обрабатывающие сообщения, должны быть загружены в память при инициализации приложения и находиться там постоянно, поэтому для них подойдет атрибут PRELOAD. Те функции, которые требуются эпизодически, можно загружать при необходимости и удалять после использования, поэтому для них следует указать атрибуты LOADONCALL и DISCARDABLE.

Для назначения атрибутов сегментам приложения файл определения модуля должен содержать оператор SEGMENTS:

CODE preload moveable discardable
DATA preload moveable multiple
SEGMENTS
  CODESEG1 moveable discardable
  CODESEG2 preload
  CODESEG3 loadoncall discardable

Для изменения имени сегмента кода в системах разработки Borland C++ версии 3.1 и Borland C++ for Windows версии 4.01 можно использовать параметр командной строки -zCname, где name - новое имя сегмента кода. По умолчанию сегмент кода имеет имя _TEXT. Для того чтобы восстановить имя сегмента кода, можно использовать параметр -zC*.

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

#pragma options -zCCODESEG1
// Тело функции
...............
#pragma options -zC*

Если вы создаете приложения с помощью Microsoft C++ версии 7.0 или Microsoft Visual C++, исходные тексты всех функций, которые должны находиться в одном сегменте, следует расположить в одном файле. Для изменения имени сегмента следует воспользоваться параметром /NT:

cl /u /c /As /Gsw /Oas /Zpe /NT CODESEG2 wndproc.c
[Назад] [Содеожание] [Дальше]