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

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

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

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

2.2. Память в различных режимах работы Windows

В зависимости от режима работы (стандартный или расширенный) операционная система Windows использует то или иное распределение памяти. В любом случае процессор работает в защищенном режиме.

Операционная система Windows версии 3.0 могла работать и в реальном режиме (для чего ее надо было запускать с параметром /r), однако версия 3.1 этот режим больше не поддерживает.

Сетевой вариант операционной системы Windows - Windows for Workgroups версии 3.11 работает только в расширенном режиме.

Стандартный режим работы

Для работы Windows версии 3.1 в стандартном режиме в компьютере должен быть установлен процессор 80286 или 80386, а также не менее 1-2 Мбайт оперативной памяти.

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

В пределах первых 640 Кбайт стандартной памяти находится операционная система MS-DOS, драйверы и резидентные программы, запущенные до загрузки Windows.

В стандартном режиме Windows версии 3.1 не может адресовать более 16 Мбайт памяти. Такое ограничение накладывается схемой адресации процессора 80286. Даже если вы запустили Windows в стандартном режиме на процессоре 80386, указанное ограничение продолжает действовать, так как в этом случае процессор 80386 будет работать с памятью как его предшественник, процессор 80286.

Расширенный режим работы

Расширенный режим работы Windows доступен в том случае, если в компьютере установлен процессор 80386, 80486, Pentium, и имеется по крайней мере 2 Мбайт расширенной оперативной памяти.

В расширенном режиме включается механизм виртуальной памяти, позволяющий теоретически адресовать до 512 Мбайт памяти. При этом в Windows версии 3.1 можно использовать до 256 Мбайт физической оперативной памяти и создать файл виртуальной памяти размером до 256 Мбайт.

Схема адресации памяти процессора 80386 накладывает ограничение на количество дескрипторов в глобальной и локальной таблице дескрипторов - можно создать не более 8192 дескрипторов в каждой из таблиц. Так как все приложения Windows версии 3.1 используют одну общую локальную таблицу дескрипторов, всего для приложений Windows можно создать не более 8192 дескриптора, описывающих сегменты размером до 64 Кбайт. Однако реально создаются сегменты меньшего размера, поэтому Windows не позволяет приложениям использовать все 512 Мбайт памяти.

Сегодня такие требования к объему оперативной памяти могут показаться излишними. Однако не так давно память объемом 1024 Кбайт (т. е. целый мегабайт!) удовлетворяла всех (или почти всех) пользователей персонального компьютера IMB PC. С широким внедрением персональных компьютеров в область обработки видеоинформации (в том числе в реальном времени) требования к объему оперативной памяти и быстродействию всех системы существенно возрастают. В любом случае уже сейчас многие приложения Windows соглашаются работать только в расширенном режиме.

Глобальная и локальная область памяти

Свободное пространство в области стандартной памяти и расширенная память используются операционной системой Windows. Она как бы объединяет всю свободную память в одну глобальную область памяти (global heap ) и использует эту область для себя и для запуска приложений Windows.

Помимо глобальной области памяти, для каждого приложения Windows выделяется собственная локальная область памяти (local heap ). Размер этой области ограничен величиной 64 Кбайт. Если для приложения требуются блоки памяти большего размера, оно может их получить из глобальной области памяти

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

Типы сегментов

В операционной системе MS-DOS с точки зрения процессора все сегменты памяти были одинаковыми. Деление их на сегменты кода и сегменты данных достаточно условное, так как в MS-DOS нет никаких препятствий для того чтобы загрузить в CS:IP адрес любого сегмента, например, сегмента данных программы. Точно также программа могла выполнять любые операции в своем (или чужом) сегменте кода, или в сегменте, который принадлежит операционной системе. Так как в MS-DOS одновременно может работать только одна программа, вся оперативная память отдается ей в полное распоряжение.

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

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

К счастью, операционная система Windows умеет объединять свободные блоки памяти, используя механизм перемещаемых (moveable ) и удаляемых (discardable ) сегментов.

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

Согласно этой схеме на первом шаге получения доступа приложение заказывает для себя блок памяти, расположенный в фиксированном или перемещаемом сегменте. Фиксированный (fixed ) сегмент имеет постоянный логический адрес <селектор:смещение> и не никогда не перемещается в адресном пространстве. Если ваше приложение заказывает для себя память при помощи функции malloc , она получает память в фиксированном сегменте.

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

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

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

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

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

Таким образом, даже если ваше приложение, работающее в защищенном режиме, заказало фиксированный блок памяти, он все равно остается перемещаемым! Поэтому, создавая приложения для Windows версии 3.1 вы можете использовать фиксированные блоки памяти почти без ущерба для эффективности работы системы дефрагментации (так как логический адрес фиксированного блока не изменяется, это может привести к невозможности освобождения непрерывного пространства в таблице дескрипторов, нужного для адресации блоков памяти размером, большим 64 Кбайт).

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

Фиксирование линейного адреса и отмена страничного обмена - крайняя мера. Обычные приложения Windows не должны вызывать функции GlobalFix и GlobalPageLock, так как это может привести к снижению производительности работы операционной системы и приложений.

Логический адрес перемещаемого блока памяти, состоящий из селектора и смещения, может произвольно изменяться операционной системой Windows. Для фиксирования блоков памяти в логическом адресном пространстве необходимо использовать функции GlobalLock или LocalLock.

Операционная система Windows версии 3.1 перемещает зафиксированные блоки памяти, изменяя базовый адрес в локальной таблице дескрипторов, поэтому такое перемещение не приводит к изменению логического адреса <селектор:смещение> и незаметно для приложений. Даже если приложение заказывает фиксированный блок памяти, но не вызывает функцию GlobalFix, этот блок памяти будет перемещаемым.

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

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

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

CODE preload moveable discardable
DATA preload moveable multiple

В этом случае операционная система может перемещать память приложения и при необходимости удалять сегмент кода неактивного приложения из памяти. Если этот сегмент потребуется вновь, Windows самостоятельно загрузит его из exe-файла приложения.

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