В ОС Windows 2000 аналогичную роль играет менеджер балансного набора (Working set manager), который вызывается раз в секунду или тогда, когда размер свободной памяти опускается ниже определенного предела, и отвечает за суммарную политику управления памятью и поддержку рабочих множеств.
Реализация функций операционной системы, связанных с поддержкой памяти, - ведение таблиц страниц, трансляция адреса, обработка страничных ошибок, управление ассоциативной памятью и др. - тесно связана со структурами данных, обеспечивающими удобное представление адресного пространства процесса. Формат этих структур сильно зависит от аппаратуры и особенностей конкретной ОС.
Чаще всего виртуальная память процесса ОС
разбивается на сегмен ты пяти типов: кода программы, данных, стека, разделяемый
и сегмен файлов, отображаемых в память (см. рис.).
Сегмент программного кода содержит только команды. Сегмент программного кода не модифицируется входе выполнения процесса, обычно страницы данного сегмента имеют атрибут read-only. Следствием этого является возможность использования одного экземпляра кода для разны процессов.
Сегмент данных, содержащий переменные программы и сегмент стекг содержащий автоматические переменные, могут динамически менять cboi размер (обычно данные в сторону увеличения адресов, а стек - в сторон уменьшения) и содержимое, должны быть доступны по чтению и запис: и являются приватными сегментами процесса.
С целью обобществления памяти между несколькими процессам: создаются разделяемые сегменты, допускающие доступ по чтению и записи. Вариантом разделяемого сегмента может быть сегмент файла, отображаемого в память. Специфика таких сегментов состоит в том, что из ни откачка осуществляется не в системную область выгрузки, а непосредственно в отображаемый файл. Реализация разделяемых сегментов основан на том, что логические страницы различных процессов связываются с од ними и теми же страничными кадрами.
Сегменты представляют собой непрерывные области (в Linux они так и называются - области) в виртуальном адресном пространстве процесса, выровненные по границам страниц. Каждая область состоит из набора страниц с одним и тем же режимом защиты. Между областями в виртуальном пространстве могут быть свободные участки. Естественно, что подобные объекты описаны соответствующими структурами (см., например, структуры mm_struct и vm_area_struct в Linux).
Часть работы по организации сегментов может происходить с участием программиста. Особенно это заметно при низкоуровневом программировании. В частности, отдельные области памяти могут быть поименованы и использоваться для обмена данными между процессами. Два процесса могут общаться через разделяемую область памяти при условии, что им известно ее имя (пароль). Обычно это делается при помощи специальных вызовов (например, тар и unmap), входящих в состав интерфейса виртуальной памяти.
Загрузка исполняемого файла (системный вызов exec) осуществляется обычно через отображение (mapping) его частей (кода, данных) в соответствующие сегменты адресного пространства процесса. Например, сегмент кода является сегментом отображаемого в память файла, содержащего исполняемую программу. При попытке выполнить первую же инструкцию система обнаруживает, что нужной части кода в памяти нет, генерирует page fault и подкачивает эту часть кода с диска. Далее процедура повторяется до тех пор, пока вся программа не окажется в оперативной памяти.
Как уже говорилось, размер сегмента данных динамически меняется. Рассмотрим, как организована поддержка сегментов данных в Unix. Пользователь, запрашивая (библиотечные вызовы malloc, new) или освобождая (free, delete) память для динамических данных, фактически изменяет границу выделенной процессу памяти через системный вызов brk (от слова break), который модифицирует значение переменной brk из структуры данных процесса. В результате происходит выделение физической памяти, граница brk смещается в сторону увеличения виртуальных адресов, а соответствующие строки таблиц страниц получают осмысленные значения. При помощи того же вызова brk пользователь может уменьшить размер сегмента данных. На практике освобожденная пользователем виртуальная память (библиотечные вызовы free, delete) системе не возвращается. На это есть две причины. Во-первых, для уменьшения размеров сегмента данных необходимо организовать его уплотнение или «сборку мусора». А во-вторых, незанятые внутри сегмента данных области естественным образом будут вытолкнуты из оперативной памяти вследствие того, что к ним не будет обращений. Ведение списков занятых и свободных областей памяти в сегменте данных пользователя осуществляется на уровне системных библиотек.
Более подробно информация об адресных пространствах процессов в Unix изложена в [Кузнецов], [Bach, 1986].
Корректная работа менеджера памяти помимо принципиальных вопросов, связанных с выбором абстрактной модели виртуальной памяти и ее аппаратной поддержкой, обеспечивается также множеством нюансов и мелких деталей. В качестве примера такого рода компонента рассмотрим более подробно локализацию страниц в памяти, которая применяется в тех случаях, когда поддержка страничной системы приводит к необходимости разрешить определенным страницам, хранящим буферы ввода-вывода, другие важные данные и код, быть блокированными в памяти.
Рассмотрим случай, когда система виртуальной памяти может вступить в конфликт с подсистемой ввода-вывода. Например, процесс может запросить ввод в буфер и ожидать его завершения. Управление передастся другому процессу, который может вызвать page fault и, с отличной от нуля вероятностью, спровоцировать выгрузку той страницы, куда должен быть осуществлен ввод первым процессом. Подобные ситуации нуждаются в дополнительном контроле, особенно если ввод-вывод реализован с использованием механизма прямого доступа к памяти (DMA). Одно из решений данной проблемы - вводить данные в невытесняемый буфер в пространстве ядра, а затем копировать их в пользовательское пространство.
Второе решение - локализовать страницы в памяти, используя специальный бит локализации, входящий в состав атрибутов страницы. Локализованная страница замещению не подлежит. Бит локализации сбрасывается после завершения операции ввода-вывода.
Другое использование бита локализации может иметь место и при нормальном замещении страниц. Рассмотрим следующую цепь событий. Низкоприоритетный процесс после длительного ожидания получил в свое распоряжение процессор и подкачал с диска нужную ему страницу. Если он сразу после этого будет вытеснен высокоприоритетным процессом, последний может легко заместить вновь подкачанную страницу низкоприоритетного, так как на нее не было ссылок. Имеет смысл вновь загруженные страницы помечать битом локализации до первой ссылки, иначе низкоприоритетный процесс так и не начнет работать.
Использование бита локализации может быть опасным, если забыть его отключить. Если такая ситуация имеет место, страница становится неиспользуемой. SunOS разрешает использование данного бита в качестве подсказки, которую можно игнорировать, когда пул свободных кадров становится слишком маленьким.
Другим важным применением локализации является ее использование в системах мягкого реального времени. Рассмотрим процесс или нить реального времени. Вообще говоря, виртуальная память - антитеза вычислений реального времени, так как дает непредсказуемые задержки при подкачке страниц. Поэтому системы реального времени почти не используют виртуальную память. ОС Solaris поддерживает как реальное время, так и разделение времени. Для решения проблемы page faults Solaris разрешает процессам сообщать системе, какие страницы важны для процесса, и локализовать их в памяти. В результате возможно выполнение процесса, реализующего задачу реального времени, содержащего локализованные страницы, где временные задержки страничной системы будут минимизированы.
Помимо системы локализации страниц, есть и другие интересные проблемы, возникающие в процессе управления памятью. Так, например, бывает непросто осуществить повторное выполнение инструкции, вызвавшей page fault. Представляют интерес и алгоритмы отложенного выделения памяти (копирование при записи и др.). Ограниченный объем данного курса не позволяет рассмотреть их более подробно.
Описанная система управления памятью
является совокупностью программно-технических средств, обеспечивающих производительное
функционирование современных компьютеров. Успех реализации той части ОС,
которая относится к управлению виртуальной памятью, определяется близостью
архитектуры аппаратных средств, поддерживающих виртуальную память, к
абстрактной модели виртуальной памяти ОС. Справедливости ради заметим, что в
подавляющем большинстве современных компьютеров аппаратура выполняет функции,
существенно превышающие потребности модели ОС, так что создание
аппаратно-зависимой части подсистемы управления виртуальной памятью ОС в
большинстве случаев не является чрезмерно сложной задачей.
В данной курсовой работе необходимо написать программу, моделирующую разбиение исходного неделимого адресного пространства ОП на страницы переменной длины. Исходя из этого было выделено 3 основных класса, необходимых для построения модели:
1) AddressSpace - класс, представляющий исходное адресное пространство ОП;
2) AddressSpacePage - класс, представляющий страницу структурированного адресного пространства ОП;
3) AddressSpacePages - класс, представляющий страницы структурированного адресного пространства с доступом по индексу [a, b], где a номер страницы, а b смещение.
Исходя из необходимости визуального отображения результатов структуризации АП ОП, было введено еще 2 класса, являющиеся компонентами:
1) AddressSpaceVisualizerControl - компонента для отображения состояния экземпляра класса AddressSpace и AddressSpacePages
2) VisualizerControl компонента для отображения состояния экземпляра класса AddressSpacePage
Далее рассмотрим эти классы более подробно.
Данный класс предназначен для представления страницы структурированного адресного пространства ОП. Для задания параметров страницы в классе предусмотрены свойства Size и BaseMemoryAddress, устанавливающие соответственно размер страницы и базовый адрес в исходном неструктурированном АП, смещение адреса задаётся свойством Displacement.
Данный класс предназначен для представления страниц структурированного адресного пространства ОП как единого целого. Он хранит в себе список страниц addressSpasePage, и максимальный размер страницы maxPageSize. Также для распределения размеров страниц содержится генератор случайных величин g. Так как этот класс является как бы посредником между АП и страницей он не иимет свойств, но имеет индексатор this, который позволяет получить доступ к странице по индексу [a, b], где a номер страницы, а b смещение.
Для задания параметров АП в классе предусмотрены свойства Size и MaxPageSize, устанавливающие соответственно размер исходного неструктурированного АП и максимальный размер страницы структурированного АП.
При создании экземпляра класса структуризация автоматически не производится. Чтобы выполнить структуризацию необходимо вызвать метод Structuring, который имеет всего один параметр - Generator. В качестве этого параметра должен быть передан экземпляр класса, наследованного от абстрактного класса Generator, и реализующего его абстрактные методы и свойства. По умолчанию используется случайный генератор чисел.
После вызова метода Structuring, исходное адресное пространство будет разбито на произвольное количество страниц случайного размера, доступ к которым можно получить через свойство addressSpacepages. Необходимо отметить, что в случае вызова метода Structuring для уже структурированного адресного пространства, перед выполнением разбиения будет выполнен сброс всех результатов предыдущей структуризации.
Так как генератор случайных чисел Random плохо генерирует случайные величины и не справляется со своей работой, пришлось прибегнуть к библиотеке Troschuetz. Random.dll.
Эта библиотека содержит абстрактные базовые классы для
генераторов случайных чисел и случайных распределений чисел. В данной работе
использовались 4 генератора.
Реализация
Описание
ALFGenerator
Метод Фибоначчи с запаздываниями
MT19937Generator
Вихрь Мерсенна
StandardGenerator
Стандартный генератор Random Xorshift
Класс VisualizerControl
Данный класс компоненты предназначен для отображения
пользователю состояния страницы структурированного и неструктурированного
адресного пространства. Отображаемая страница задается через свойство addressSpacePage.
Область контрола разделена на четыре составляющих:
) Область базового адреса - отображает базовый адрес
страницы в исходном неструктурированном адресном пространстве;
2) Область прямоугольника размера страницы - в данной области
отрисовывается закрашенный прямоугольник, ширина которого соответствует размеру
отображаемой страницы.
3) Область задания смещения - содержит поле для задания
смещения на текущей странице
) Последнее поле показывает исходный адрес текущего
элемента в неструктурированном АП
Данный класс компоненты предназначен для отображения
пользователю состояния адресного пространства. Отображаемое адресное
пространство задается через свойство AddressSpace. Также сдесь содержится
список компонент VisualizerControl которые отображают страницы текущего АП.
Область компоненты разделена на три составляющих:
) Информационная строка - предназначена для
отображения информации о размере исходного АП, количестве страниц, на которое
оно было разбито, и среднем размере страницы;
2) Компонента для отображения исходного
неструктурированного АП - представляет из себя экземпляр класса VisualizerControl;
) Зона страниц структурированного адресного
пространства - предназначена для вывода компонент страниц структурированного
АП.
Разбиение АП ОП осуществляется методом Structuring класса AddressSpace. Который создаст класс AddressSpacePages и разобьёт АП. Разбор
логики работы данного метода выполнен в комментариях в исходном коде.
// базовый адрес страницыindex=0;
// Проверка текущего генератора, иначе
поставить стандартный
if (g == null)
{= new StandardGenerator();
}
// пока базовый адрес страницы меньше обьёма
ОП(index < size)
{
// расчитать длину страницы
int i=g. Next (1, maxPageSize);
// проверить чтобы новая страница не
оказалась больше АП
if (index + i > size)
{= size - index;
}
// Создать страницу. Add (new AddressSpacePage (index, i));
// увеличить базовый адресс новой страницы+=
i;
}
Настройка параметров позволяет задать «Размер адресного
пространства», «Максимальный размер страницы» структурированного АП и
«Генератор случайных чисел», используемый для разбиения АП.
Выполнение структуризации выполняется нажатием на кнопку
«Структурировать АП.
При указании смещения внутри страницы, интересующий вас адрес
выделяется на самой странице, а его адрес в исходном пространстве отображается
рядом.
При указании смещения внутри АП, интересующий вас адрес
выделяется на самой странице.
Размер адресного пространства: 1024
Максимальный размер страницы: 256
Размер адресного пространства: 512
Максимальный размер страницы: 256
Размер адресного пространства: 512
Максимальный размер страницы: 128
В теоретической части курсовой работы мы
рассмотрели идеологию построения системы управления памятью в современных
операционных системах.
В практической части мы рассмотрели
программную реализацию визуальной модели структуризации адресного пространства
оперативной памяти страницами переменной длины. Построенная модель позволяет
задать параметры адресного пространства (его размер) и параметры структуризации
(максимальный размер страницы и генератор СВ, использующийся при разбиении).
Также созданная модель позволяет по значению смещения внутри страницы найти
адрес в исходном неструктурированном адресном пространстве.
Список использованных источников
1 Операционные
системы: Учебник для вузов. 2-е изд. / А.В. Гордеев. - СПб.: Питер, 2011. - 416
с.
2 Эффективное
администрирование. Ресурсы Windows Server 2010, Windows Server: Пер. с англ. - М.:
Изд-во «Русская Редакция» / В.В. Мельников СПб.: БХВ - Петербург, 2009. - 768
с.
Эффективная
работа: Windows - Сулацкая И.М.СПб.: Питер, 2008. - 1069 с.
Класс AddressSpaceVisualizerControl
Разбиение
адресного пространства ОП на страницы переменной длины
.
Описание работы с программой
Задание
параметров
Выполнение
структуризации
Поиск
адреса в исходном неструктурированном АП и наоборот.

Примеры
работы программы.

Выводы