Гордеев А.В. Операционные системы (2-е изд., 2004) (1186250), страница 99
Текст из файла (страница 99)
д. В системах Windows 3.x все сообщения находились в однойсистемной очереди, вследствие чего одна некорректно работающая программа моглазаблокировать поток сообщений, предназначенных всем остальным приложениям. Windows 95/98 дает системе возможность помещать сообщения, предназначенные приложениям Win32, в отдельные очереди, что снижает вероятность зависания системы в тех случаях, когда одно из приложений не обслуживает очередьсообщений должным образом.Операционные системы Windows 9x373Распределение оперативной памятиДля загрузки операционные системы Windows 95/98 используют операционнуюсистему MS DOS 7.0 (MS DOS 98), и в случае если в секции [Options] файла MSDOS.SYSимеется строка BootGUI = 0, процессор работает в обычном реальном режиме (см.главу 4). Распределение памяти в MS DOS 7.0 такое же, как и в предыдущих версияхDOS. Однако при загрузке интерфейса GUI перед загрузкой ядра Windows 95/98процессор переключается в защищенный режим работы и начинает распределятьпамять уже с помощью страничного механизма.Приложения и подсистемы Windows 9x (за исключением ядра) никогда не работают с физической памятью.
Разделение на виртуальную и физическую памятьявляется ключевым аспектом работы системы. Приложения и подсистемы Windows 9х имеют дело с определенными интерфейсами прикладного программирования и виртуальными адресными пространствами. Базовая система работает какс физической памятью, так и с виртуальными адресными пространствами.В основе поддержки виртуальных машин и виртуального адресного пространства,которую обеспечивают операционные системы Windows 9x, лежит работа с реальной (физической) памятью компьютера, ограниченной в своих размерах. Операционная система выгружает неактивные страницы памяти виртуальных адресныхпространств выполняющихся процессов из оперативной памяти на диск и загружает страницу, запрошенную при выполнении текущей команды.
Другими словами, загрузка страницы в оперативную память осуществляется по требованию, какэто принято в большинстве операционных систем, использующих страничныймеханизм организации виртуальной памяти. В то же время, освобождается оперативная память от неактивных страниц группами по нескольку страниц за однуоперацию. Реализованный в операционных системах Windows 9x алгоритм замещения представляет собой стандартную дисциплину LRU (Least Recently Used —дольше других неиспользуемый), заключающуюся, как мы уже знаем, в освобождении тех страниц физической памяти, которые дольше других не использовались.Многие страницы физической памяти компьютера не участвуют в замещении, онираспределены постоянно. Их занимают, в частности, резидентные компоненты ядра.На эти цели отводится примерно один мегабайт памяти. За оставшуюся физическую память конкурируют различные программы: динамически загружаемые компоненты системы и загружаемые виртуальные драйверы устройств, код и данныеприложений, а также динамически размещаемые данные, такие как области кэширования, необходимые для работы файловой системы, и буферы прямого доступак памяти (DMA).В отличие от тех мультитерминальных систем, в которых операционная системадолжна заботиться о равноправном совместном использовании ресурсов, в системах Windows 9x сделано иначе.
Поскольку это однопользовательские операционные системы, они позволяют заполнять память так, как это нужно пользователю иего программам. Динамически загружаемые компоненты системы конкурируютза память с прикладными программами. Если пользователь хочет, чтобы его приложение работало быстрее, ему будет позволено занять столько памяти, скольковообще возможно. Система накладывает ограничение на максимальный объем па-374Глава 11. Операционные системы Windowsмяти, который может быть отдан в распоряжение отдельных приложений, — еслине следить за этим, становится возможным возникновение тупиковых ситуаций.После того как вся физическая память заполнена, первый же новый запрос на выделение памяти инициирует замещение страниц. Интересным побочным эффектом такого подхода является то, что у приложений нет надежного способа определения объема памяти, доступного в системе. Функция API GlobalMemorySatusQвозвращает целый ряд параметров, характеризующих состояние системной памяти, однако это не более чем «мгновенный снимок» текущей обстановки — еще одинвызов этой функции вполне может дать другие значения.Страницы поступают в память и уходят из нее по-разному: в большинстве случаевони либо непосредственно размещаются в выделенной для этого памяти (как результат соответствующих запросов), либо загружаются при старте программы изЕХЕ-файла приложения.
Впоследствии эти страницы начинают перемещатьсямежду физической памятью и файлом подкачки. Страницы, в которых содержится только код 32-разрядных приложений и динамически связываемых библиотек(DLL), система всегда загружает только из исходных исполняемых файлов.Для того чтобы облегчить управление всем разнообразием типов страниц памяти,каждая активная страница, то есть каждая страница, которая является частью выполняющегося в данный момент системного модуля или приложения, снабжена хранящимся совместно с ней страничным дескриптором (Page Descriptor, PD). В этомдескрипторе содержатся адреса процедур, которые занимаются перемещением страницы из памяти на диск и обратно. Независимо от того, что именно находится вданной странице, диспетчер физической памяти, чтобы переместить страницу в оперативную память или из нее, просто вызывает соответствующую функцию, адрескоторой определен в поле дескриптора страницы.
В случае, если некоторая страница еще никогда не заполнялась, она называется абсолютно чистой (virgin"). Например, именно так обозначаются страницы, содержащие код, использующий вызовыWin32. После того как с момента размещения страницы в памяти в нее будет в первыйраз произведена запись данных, она считается испорченной (tainted) и может бытьлибо грязной (dirty), либо чистой (clean), в зависимости от того, осуществлялась ли внее запись с момента последней ее подкачки в физическую память. Если запись в этустраницу производилась, и в этой физической странице требуется разместить инуювиртуальную страницу, ее содержимое должно быть сохранено в файле подкачки.Для наблюдения за распределением памяти и использованием иных ресурсов компьютера можно воспользоваться, например, программой SYSMON.EXE (системныймонитор).
Эта программа входит в состав утилит операционных систем Windows9х, поэтому после ее установки команда для ее запуска располагается в подменюСлужебные меню Стандартные. Она позволяет выбрать интересующие нас параметры и наблюдать за их текущими значениями.Использование так называемой плоской модели памяти, когда программист можетиспользовать только один сегмент кода и один сегмент данных, которые имеютмаксимально возможные размеры, определяемые системными соглашениями операционной системы, приводит к тому, что с точки зрения программиста памятьполучается неструктурированной. Программы используют классическую малуюОперационные с и стемы Windows 9x375(small) модель памяти [40].
Каждая прикладная программа определяется 32-разрядными адресами, в которых сегмент кода имеет то же значение, что и сегментыданных. Единственный сегмент программы отображается непосредственно в область виртуального линейного адресного пространства, которая, в свою очередь,состоит из 4-килобайтных страниц.
Каждая страница может располагаться где угодно в оперативной памяти (естественно, в том месте, где ее разместит диспетчерпамяти, который сам находится в невыгружаемой области) или быть «сброшена»на диск, если не запрещено использовать страничный файл.В операционных системах Windows 9x младшие адреса виртуального адресногопространства совместно используются всеми процессами.
Это сделано для совместимости с драйверами устройств реального режима, резидентными программамии некоторыми 16-разрядными программами Windows. Безусловно, это плохое решение с точки зрения надежности, поскольку оно приводит к тому, что любой процесс может непреднамеренно (или же, наоборот, специально) испортить компоненты, находящиеся в этих адресах.В Windows 9x каждая 32-разрядная прикладная программа выполняется в собственном адресном пространстве, но все они используют совместно один и тот же32-разрядный системный код. Доступ к чужим адресным пространствам в принципе возможен.