Для операционных систем реального режима (MS-DOS) оперативная память может размещаться в стандартной области (640 Кбайт), дополнительной памяти и в некоторых областях UMA.
Стандартная память является самой дефицитной в PC, на ее небольшой объем (типовое значение — 640 Кбайт) претендуют и BIOS, и ОС реального режима, а остатки отдаются прикладному ПО. Стандартная память распределяется следующим образом:
♦ 00400h-004FFh - область переменных BIOS (BIOS data area);
♦ 00500h-00xxxh - область DOS (DOS area);
♦ 00xxxh-9FFFFh — память, предоставляемая пользователю (user RAM), все го до 638 Кбайт (для PS/2 Mouse область 9FC00h-9FFFFh используется как расширение области переменных BIOS, поэтому размер пользовательской памяти меньше).
Дополнительная память и UMA могут использоваться в качестве оперативной только со специальными программными интерфейсами, для которых были разработаны спецификации EMS и XMS.
Спецификация на отображаемую память (Expanded Memory Specification, EMS) — это программная спецификация на использование дополнительной памяти DOS-программами реального режима. Спецификация ЫМ EMS — соглашение фирм Lotus, Intel, Microsoft на применение EMS. С помощью специальных аппаратных или программных средств любая область дополнительной памяти может быть отображена на небольшие страницы, расположенные в области UMA. В первоначальном варианте можно было задействовать 4 страницы по 16 Кбайт, примыкающие друг к другу, обычно начиная с адреса DOOOOh (положение страниц можно менять в пределах свободных областей UMA). Обращение прикладных программ к памяти EMS осуществляется через диспетчер памяти, вызываемый по прерыванию Int 67h. Программа, нуждающаяся в дополнительной памяти, должна сначала запросить выделение области, указав ее размер в 16-килобайтных страницах. В ответ на этот запрос (если имеется свободная память) диспетчер сообщает программе номер дескриптора EMS (EMS handler), по которому программа в дальнейшем будет ссылаться на выделенную ей область при управлении отображением. Далее программа через диспетчер назначает отображение требуемой логической страницы из выделенной ей области дополнительной памяти на выбранную физическую страницу, расположенную в области UMА. После этого любые программные обращения процессора к физической странице, расположенной в пределах первого мегабайта, будут в действительности работать с логической страницей дополнительной памяти, расположенной выше первого мегабайта, причем без переключения в защищенный режим. Для работы с иной логической страницей требуется вызов диспетчера для переназначения отображения. В режиме EMS 4.0, эмулируемом на процессорах 386+, появилась возможность увеличения числа доступных физических страниц и отображения дополнительной памяти не только на фиксированные области UMА, но и на любые области памяти.
Для поддержки EMS поначалу требовались специальные аппаратные средства. В компьютерах на процессорах 386 и выше появилась возможность программной эмуляции EMS, которую в MS-DOS 5+ выполняет драйвер EMM386.EXE.
Система EMS в основном предназначена для хранения данных — для исполняемого в данный момент программного кода она неудобна, поскольку требует программного переключения страниц через каждые 16 Кбайт. Ее используют для создания виртуальных дисков, хранения очередей заданий для печати, а также для хранения данных и даже программного кода некоторых резидентных программ (в целях экономии стандартной памяти).
Спецификация на расширенную память (extended Memory Specification, XMS) — это иная программная спецификация на использование дополнительной памяти DOS-программами, разработанная компаниями Lotus, Intel, Microsoft и AST для компьютеров на процессорах класса 286 и выше. Эта спецификация позволяет программе получить в распоряжение одну или несколько областей дополнительной памяти, а также задействовать область НМА. Распределением областей ведает диспетчер расширенной памяти — драйвер HIMEM.SYS. Диспетчер позволяет захватить или освободить область НМА (65 520 байт, начиная с lOOOOOh), а также управлять вентилем линии адреса А20. Функции собственно XMS позволяют программе:
♦ определить размер максимально доступного блока памяти;
♦ захватить или освободить блок памяти;
♦ копировать данные из одного блока в другой, причем участники копирова ния могут быть блоками как стандартной, так и дополнительной памяти в любых сочетаниях;
♦ заблокировать блок памяти (запретить копирование) и разблокировать его;
♦ изменить размер выделенного блока.
В ответ на запрос выделения области диспетчер выдает 16-битный номер дескриптора блока (XMS handler), по которому выполняются дальнейшие манипуляции с этим блоком. Размер блока может достигать 64 Мбайт. Спецификация XMS позволяет программам реального режима устраивать «склады» данных в дополнительной памяти, которая им непосредственно недоступна, копируя в нее и из нее данные доступных областей первого мегабайта памяти. Доступ к диспетчеру XMS осуществляется через прерывание 2Fh. Заботу о переключении в защищенный режим и обратно для получения доступа к дополнительной памяти берет на себя диспетчер. По умолчанию HIMEM.SYS позволяет использовать до 32 дескрипторов блоков, но это число можно увеличить, задав параметр /NUMHANDLES=xx в строке загрузки драйвера HIMEM.SYS.
Помимо дополнительной памяти спецификация XMS определяет пару функций и для работы с блоками UMB — захватить блок требуемого размера (или определить максимально доступный блок) и освободить его.
Как видно, спецификации EMS и XMS различаются по принципу действия: в режиме EMS для доступа к дополнительной памяти выполняется отображение (страничная переадресация) памяти, а в режиме XMS — копирование блоков данных. На компьютерах с процессорами 386+ эти спецификации мирно сосуществуют при запуске драйвера HIMEM.SYS, поверх которого может быть загружен драйвер EMM386.EXE, пользующийся памятью XMS для эмуляции памяти EMS. Память, доступная EMS и XMS, может выделяться динамически из числа дополнительной. Ключ NOEMS в строке запуска EMM386 запрещает выделение памяти для режима EMS.
Виртуальная память
Для ОС защищенного режима (в том числе Windows) доступна вся оперативная память, причем без каких-либо ухищрений вроде описанных режимов EMS и XMS. Более того, объем памяти, доступной приложениям, благодаря механизму виртуальной памяти может быть больше размера физической оперативной памяти.
Виртуальная память (virtual memory) представляет собой программно-аппаратное средство расширения пространства памяти, предоставляемой программе в качестве оперативной. Как уже было сказано в главе 1, эта память физически реализуется в оперативной и дисковой памяти под управлением соответствующей операционной системы. Виртуальное пространство памяти разбито на страницы фиксированного размера, а в физической оперативной памяти в каждый момент времени присутствует только часть из них. Остальные страницы хранятся на диске, откуда операционная система может «подкачать» их в физическую память, предварительно выгрузив на диск часть не используемых в данный момент модифицированных страниц. Обращение процессора к ячейке виртуальной памяти, присутствующей в физической памяти, происходит обычным способом. Если же затребованная область в данный момент не отображена в физической памяти, процессор вырабатывает исключение (внутреннее прерывание), по которому операционная система программно организует замещение страниц, называемое свопингом (swapping). Виртуальную память поддерживают процессоры, работающие в защищенном режиме, начиная с 80286, но реально ее широко стали применять только в операционных системах и оболочках для 32-разрядных процессоров (80386+)- Виртуальная память используется лишь при наличии дополнительной памяти.
Суммарный объем виртуальной памяти, доступной всем приложениям, определяется объемом ОЗУ и файлов подкачки (их может быть и несколько). Объем файла подкачки может быть постоянным или же изменяться динамически по мере изменения потребностей системы. Для того чтобы приложениям хватало памяти, на диске, несущем динамический файл подкачки, должно быть достаточно свободного пространства (десятки и сотни мегабайт). В принципе, файл подкачки может располагаться и на сетевом диске, но при этом трафик сети оказывается напряженным. Конечно же, важен и объем установленной физической памяти — ее нехватка может быть принципиальным ограничением на запуск ряда приложений или установку операционных систем. При малом объеме ОЗУ свопинг (подкачка страниц) оказывается слишком интенсивным, в результате чего скорость работы приложений существенно снижается (обращения к диску выполняются на несколько порядков медленнее, чем к ОЗУ). Приложения реального времени (например, аудио- и видеопроигрыватели и тем более кодеры) могут стать неработоспособными именно из-за малого объема ОЗУ. Поскольку файл подкачки изменяет свой размер в процессе работы, важно следить за фрагментацией диска, несущего этот файл, — обращение к фраг-ментированному файлу выполняется медленнее, чем к нефрагментированному.
При выборе диска для размещения файла подкачки следует учитывать его быстродействие — время доступа и скорость передачи данных. При использовании приложений реального времени, интенсивно обменивающихся с дисками (те же проигрыватели и кодеры, а также программы, записывающие компакт-диски), файл подкачки и данные, с которыми работают эти приложения, по возможности следует размещать на разных дисках.
ВНИМАНИЕ ------------------------------------------------------------------------------------------------------
Если на компьютере под управлением ОС защищенного режима (Windows, Unix, OS/2...) перестают запускаться приложения с сообщениями о недостаточном объеме оперативной памяти — проверьте, есть ли свободное место на жестких дисках, используемых для подкачки.
Увеличение физического объема оперативной памяти в ряде случаев может привести к неожиданному снижению производительности компьютера. Это возможно, когда системная плата (или процессор с вторичным кэшем) не способна кэшировать весь объем ОЗУ. У многих системных плат для процессоров Pentium кэшировались только первые 64 Мбайт ОЗУ; у первых процессоров Pentium II кэшировались только 512 Мбайт. Память, выходящая за размеры кэ-шируемой области, конечно же, доступна, но ее производительность гораздо ниже производительности кэшируемой. ОС Windows 9x распределяет доступную память, начиная с ее верхней границы, причем наверх попадает ее ядро, скорость работы которого существенна для многих приложений. Если после увеличения ОЗУ ядро попадает в некэшируемую область, можно наблюдать снижение производительности. Для «лечения этого недуга» можно воспользоваться условно бесплатной программой W2CACHE.COM, которая запускается в начале загрузки Windows и, оставаясь резидентной, «съедает» верхнюю часть памяти, заставляя ядро Windows загружаться в нижнюю, кэшируемую область. После окончания загрузки Windows программа освобождает занимаемую память, и ОС отдает ее в распоряжение приложений.
Вопросы организации виртуальной памяти в основном относятся к области системного программного обеспечения (ядра операционной системы). Аппаратные механизмы, обеспечивающие поддержку виртуальной памяти процессором, рассмотрены в главе 7. Здесь отметим, что использование виртуальной памяти с подкачкой страниц порождает проблему согласованного видения памяти разнообразными активными компонентами ПК: процессором, графическим акселератором и контроллерами ввода-вывода (адаптерами локальных сетей, контроллерами устройств хранения, шин USB и FireWire). Суть проблемы в том, что программа (и программист) оперируют виртуальными адресами, а устройства на системной шине оперируют физическими адресами. Что из этого следует, подробнее рассматривается в 5.1.