ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 16.06.2021

Просмотров: 181

Скачиваний: 1

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

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

Предположим, что обращение к слову в центральной памяти занимает 1 мкс, а считывание страницы из внешней памяти – в среднем 10 мс (10.000мкс). Предположим также, что в среднем для всех заданий в системе только 1 из 100 обращений к виртуальной памяти вызывает страничное прерывание. Даже при такой очевидно малой величине страничных прерываний система хорошо работать не будет. На каждое 100 обращений (требующих 100 мкс) система потратит 10.000 мкс на считывание страниц из внешней памяти. Т.е., вычислительная система тратит приблизительно 99% своего времени на свопинг страниц и только 1% на полезную работу. Этот полный разлад в работе называется пробуксовкой. Очевидно, что пробуксовка – это очень плохое явление. Чтобы его не допускать необходимо увеличить объем оперативной памяти (сейчас это стало самым простым решением), уменьшить количество параллельно выполняемых задач либо попробовать использовать более эффективные дисциплины замещения.

В абсолютном большинстве современных ОС используется дисциплина замещения LRU (Last Recently Used – дольше других неиспользуемый) как самая эффективная (OS/2, Linux). В операционной системе Windows NT, разработчики, желая сделать систему максимально независимой от аппаратных возможностей процессора, пошли на отказ от этой дисциплины и применили правило FIFO. А для того, чтобы сгладить неэффективность этой стратегии управления виртуальной памятью, была введена буферизация тех страниц, которые должны быть записаны в файл подкачки на диск или просто расформированы. Принцип буферизации прост. Прежде чем замещаемая страница будет перемещена во внешнюю память или просто расформирована, она помечается как кандидат на выгрузку. Если в следующий раз произойдет обращение к странице, находящейся в таком буфере, то страница никуда не выгружается и уходит в конец списка FIFO. В противном случае страница действительно выгружается, а на ее места в буфер попадает следующий кандидат.

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

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


Существуют и два существенных обстоятельства, оцениваемые как недостатки такого способа распределения памяти:

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

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

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

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

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

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


Если бит присутствия в дескрипторе указывает, что сейчас этот сегмент находится не в оперативной памяти, а во внешней, то поля адреса и длины используются для указания адреса сегмента в координатах внешней памяти. При этом возникает прерывание, и управление передается через диспетчер памяти программе загрузки сегмента. Пока происходит поиск сегмента во внешней памяти и загрузка его в оперативную, диспетчер памяти определяет подходящее для сегмента место. Возможно, что свободного места нет, и тогда принимается решение о выгрузке какого-нибудь сегмента и о его перемещении во внешнюю память. При поиске свободного места используется одна из вышеперечисленных дисциплин (FIFO, LRU, LFU, random).

К достоинствам сегментного способа организации виртуальной памяти относится возможность загружать не всю программу в память, а производить это по мере необходимости.

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

Сегментно-страничный способ организации виртуальной памяти.

Как и в сегментном способе распределения памяти, программа разбивается на логические законченные части – сегмента – и виртуальный адрес содержит указание на номер соответствующего сегмента. Вторая составляющая виртуального адреса сегмента – смещение относительно начала сегмента – может состоять из двух полей: виртуальной страницы и индекса. Таким образом, получается, что виртуальный адрес состоит из трех компонентов: сегмент, страница, индекс. Этот способ вносит еще большую задержку доступа к памяти. В следствие чего, несмотря на поддержку в процессорах семейства i80x86, в современных ПК и ОС практически не используется.


3. Распределение оперативной памяти в MS-DOS


MS-DOS – это однопрограммная операционная система. В ней можно организовать запуск резидентных задач, но в целом она предназначена только для выполнения одного вычислительного процесса. Поэтому распределение памяти в ней построено по простой схеме (рис. 6).

В состав операционной систем MS-DOS входят следующие основные компоненты:

модуль расширения BIOS – файл io.sys;

основной базовый модуль обработки прерываний DOS – файл msdos.sys. Этот файл реализует работу файловой системы DOS;

командный процессор (интерпретатор команд) – файл command.com;

утилиты и драйверы, расширяющие возможности системы;

п рограмма загрузки MS-DOS – загрузочная запись (boot record).

1Кб


512б



35-60 Кб





580 Кб



18 Кб

160Кб


9 6 Кб


64 Кб





Рис. 6 Распределение оперативной памяти в ОС MS DOS


Распределение памяти в ОС MS-DOS начинается с первых 640 Кбайт. Однако полный объем памяти, используемый системой для работы, может быть расширен до 1 Мбайта с помощью драйвера himem.sys. Для этого необходимо в файл конфигурации операционной системы config.sys добавить строку: device=_путь_\himem.sys. Для разрешения размещения части кода ядра DOS и заданий пользователя в области памяти свыше 640 Кб необходимо в config.sys добавить строку: dos=high,umb. Для загрузки драйверов и резидентных прогарам в верхнюю память компьютера используется драйвер верхней памяти emm386.exe. А для указания конкретных программ, которые должны размещаться в этой области перед заданием пути к их размещению необходимо дописать devicehigh и lh в файле autoexec.bat. Для контроля за правильность загрузки оперативной памяти в MS DOS используется программа mem.ехе. Просмотреть загрузку оперативной памяти можно также из окна файлового менеджера (например, vc.com) нажав сочетание клавиш: Alt+F5.




4. Распределение оперативной памяти в Windows NT



В операционных системах Windows NT тоже используется плоская модель па­мяти. Заметим, что Windows NT 4.0 Server практически не отличается от Win­dows NT 4.0 Workstation; разница лишь в наличии у сервера некоторых дополни­тельных служб, дополнительных утилит для управления доменом и несколько иных значений в настройках системного реестра. Однако схема распределения возможного виртуального адресного пространства в системах Windows NT рази­тельно отличается от модели памяти Windows 95/98. Прежде всего, в отличие от Windows 95/98 в гораздо большей степени используется ряд серьезных аппарат­ных средств защиты, имеющихся в микропроцессорах, а также применено прин­ципиально другое логическое распределение адресного пространства (рис. 7).




Прикладные программы обращаются к DLL, которые перенаправляют обращение к системе



Этот системный код находится в своем собственном адресном пространстве и недоступен вызывающим его процессам




Рис. 7 Распределение памяти в ОС Windows NT


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

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

Прикладным программам выделяется 2 Гбайт локального (собственного) линей­ного (неструктурированного) адресного пространства от границы 640 Кбайт до 2 Гбайт (первые 640 Кбайт полностью недоступны). Прикладные программы изо­лированы друг от друга, хотя могут общаться через буфер обмена (clipboard), ме­ханизмы DDE (механизм динамического обмена данными) и OLE (механизм связи и внедрения объектов).

В верхней части каждой 2-гигабайтной области прикладной программы разме­щен код системных DLL кольца 3, который выполняет перенаправление вызовов в совершенно изолированное адресное пространство, где содержится уже собст­венно системный код. Этот системный код, выступающий как сервер-процесс (server process), проверяет значения параметров, исполняет запрошенную функ­цию и пересылает результаты назад в адресное пространство прикладной про­граммы. Хотя сервер-процесс сам по себе остается процессом прикладного уровня, он полностью защищен от вызывающей его прикладной программы и изолиро­ван от нее.

Между отметками 2 и 4 Гбайт расположены низкоуровневые системные компо­ненты Windows NT кольца 0, в том числе ядро, планировщик потоков и диспетчер виртуальной памяти. Системные страницы в этой области наделены привиле­гиями супервизора, которые задаются физическими схемами кольцевой защиты процессора. Это делает низкоуровневый системный код невидимым и недоступ­ным для записи для программ прикладного уровня, но приводит к падению про­изводительности во время переходов между кольцами.


Для 16-разрядных прикладных Windows-программ ОС Windows NT реализует сеансы Windows on Windows (WOW). В отличие от Windows 95/98 ОС Win­dows NT дает возможность выполнять 16-разрядные программы Windows инди­видуально в собственных пространствах памяти или совместно в разделяемом адресном пространстве. Почти во всех случаях 16-и 32-разрядные прикладные программы Windows могут свободно взаимодействовать, используя OLE, неза­висимо от того, выполняются они в отдельной или общей памяти. Собственные прикладные программы и сеансы WOW выполняются в режиме вытесняющей многозадачности, основанной на управлении отдельными потоками. Множест­венные 16-разрядные прикладные программы Windows в одном сеансе WOW выполняются в соответствии с кооперативной моделью многозадачности. Win­dows NT может также выполнять в многозадачном режиме несколько сеансов DOS. Поскольку Windows NT имеет полностью 32-разрядную архитектуру, не существует теоретических ограничений на ресурсы GDI (интерфейс графических устройств) и USER.

При запуске приложения создается процесс со своей информационной структу­рой. В рамках процесса запускается задача. При необходимости этот тред (задача) может запустить множество других тредов (задач), которые будут выполняться параллельно в рамках одного процесса. Очевидно, что множество запущенных процессов также выполняются параллельно и каждый из процессов может пред­ставлять из себя мультизадачное приложение. Задачи (треды) в рамках одного процесса выполняются в едином виртуальном адресном пространстве, а процес­сы выполняются в различных виртуальных адресных пространствах. Отображе­ние различных виртуальных адресных пространств исполняющихся процессов на физическую память реализует сама ОС; именно корректное выполнение этой задачи гарантирует изоляцию приложений от невмешательства процессов. Для обеспечения взаимодействия между выполняющимися приложениями и между приложениями и кодом самой операционной системы используются соответст­вующие механизмы защиты памяти, поддерживаемые аппаратурой микропро­цессора.

Процессами выделения памяти, ее резервирования, освобождения и подкачки управляет диспетчер виртуальной памяти Windows NT (Windows NT virtual memory manager, VMM). В своей работе этот компонент реализует сложную стратегию учета требований к коду и данным процесса для минимизации досту­па к диску, поскольку реализация виртуальной памяти часто приводит к боль­шому количеству дисковых операций.

Каждая виртуальная страница памяти, отображаемая на физическую страницу, переносится в так называемый страничный фрейм (page frame). Прежде чем код или данные можно будет переместить с диска в память, диспетчер виртуальной памяти (модуль VMM) должен найти или создать свободный страничный фрейм или фрейм, заполненный нулями. Заметим, что заполнение страниц нулями пред­ставляет собой одно из требований стандарта на системы безопасности уровня С2 , принятого правительством США. Страничные фреймы должны заполняться нулями для того, чтобы исключить возможность использования их предыдущего содержимого другими процессами. Чтобы фрейм можно было освободить, необ­ходимо скопировать на диск изменения в его странице данных, и только после этого фрейм можно будет повторно использовать. Программы, как правило, не меняют страницы кода. Страницы кода, в которые программы не внесли измене­ний, можно удалить.