ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 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 практически не отличается от Windows 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 ОС Windows NT дает возможность выполнять 16-разрядные программы Windows индивидуально в собственных пространствах памяти или совместно в разделяемом адресном пространстве. Почти во всех случаях 16-и 32-разрядные прикладные программы Windows могут свободно взаимодействовать, используя OLE, независимо от того, выполняются они в отдельной или общей памяти. Собственные прикладные программы и сеансы WOW выполняются в режиме вытесняющей многозадачности, основанной на управлении отдельными потоками. Множественные 16-разрядные прикладные программы Windows в одном сеансе WOW выполняются в соответствии с кооперативной моделью многозадачности. Windows NT может также выполнять в многозадачном режиме несколько сеансов DOS. Поскольку Windows NT имеет полностью 32-разрядную архитектуру, не существует теоретических ограничений на ресурсы GDI (интерфейс графических устройств) и USER.
При запуске приложения создается процесс со своей информационной структурой. В рамках процесса запускается задача. При необходимости этот тред (задача) может запустить множество других тредов (задач), которые будут выполняться параллельно в рамках одного процесса. Очевидно, что множество запущенных процессов также выполняются параллельно и каждый из процессов может представлять из себя мультизадачное приложение. Задачи (треды) в рамках одного процесса выполняются в едином виртуальном адресном пространстве, а процессы выполняются в различных виртуальных адресных пространствах. Отображение различных виртуальных адресных пространств исполняющихся процессов на физическую память реализует сама ОС; именно корректное выполнение этой задачи гарантирует изоляцию приложений от невмешательства процессов. Для обеспечения взаимодействия между выполняющимися приложениями и между приложениями и кодом самой операционной системы используются соответствующие механизмы защиты памяти, поддерживаемые аппаратурой микропроцессора.
Процессами выделения памяти, ее резервирования, освобождения и подкачки управляет диспетчер виртуальной памяти Windows NT (Windows NT virtual memory manager, VMM). В своей работе этот компонент реализует сложную стратегию учета требований к коду и данным процесса для минимизации доступа к диску, поскольку реализация виртуальной памяти часто приводит к большому количеству дисковых операций.
Каждая виртуальная страница памяти, отображаемая на физическую страницу, переносится в так называемый страничный фрейм (page frame). Прежде чем код или данные можно будет переместить с диска в память, диспетчер виртуальной памяти (модуль VMM) должен найти или создать свободный страничный фрейм или фрейм, заполненный нулями. Заметим, что заполнение страниц нулями представляет собой одно из требований стандарта на системы безопасности уровня С2 , принятого правительством США. Страничные фреймы должны заполняться нулями для того, чтобы исключить возможность использования их предыдущего содержимого другими процессами. Чтобы фрейм можно было освободить, необходимо скопировать на диск изменения в его странице данных, и только после этого фрейм можно будет повторно использовать. Программы, как правило, не меняют страницы кода. Страницы кода, в которые программы не внесли изменений, можно удалить.