Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
АК_лекции.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
1.74 Mб
Скачать
  1. Демоны пейджинга

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

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

Основная идея заключается в оценке рабочего набора процесса на основе использования аппаратно (а в некоторых реализациях – программно) устанавливаемых признаков обращения к страницам основной памяти. Анализ признаков обращения и модификации страниц позволяет выделить наименее используемые страницы. Системный процесс-stealer производит откачку страниц не входящих в рабочие наборы процессов. Он начинает работать, когда количество страниц в списке свободных страниц достигает установленного нижнего порога. Если, после генерации процессом page fault'а выясняется, что список свободных страниц не пуст, то из него выбирается вакантная страница, которая после подкачки подключается к виртуальной памяти процесса.

Но если возникает требование страницы в условиях, когда список свободных страниц пуст, то начинает работать механизм свопинга, поскольку простое отнятие страницы у любого процесса (включая тот, который затребовал бы страницу) потенциально вело бы к ситуации thrashing, и разрушало бы рабочий набор некоторого процесса. Любой процесс, затребовавший страницу не из своего текущего рабочего набора, становится в очередь на свопинг, в расчете на то, что после завершения свопинга одного из процессов свободной памяти уже может быть достаточно.

Другим примером может быть подсистема управления памятью Windows 2000, которая включает такие потоки исполнения как:

1) Working set manager, которая является менеджером балансного набора. Этот поток вызывается раз в секунду или тогда, когда свободная память опускается ниже определенного предела. Она ответственна за суммарную политику управления памятью, и поддержку рабочих множеств.

2) Modified page writer - записывает модифицированные страницы в соответствующие файлы выгрузки. Этот поток пробуждается, когда размер списка модифицированных страниц нуждается в уменьшении

  1. Аппаратно-независимая модель памяти процесса

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

Чаще всего виртуальная память процесса ОС разбивается на сегменты пяти типов:

- сегмент кода программы;

- сегмент данных;

- сегмент стека;

- разделяемый сегмент и сегмент файлов, отображаемых в память.

Сегмент программного кода содержит только команды. Сегмент программного кода не модифицируется в ходе выполнения процесса, обычно страницы данного сегмента имеют атрибут read-only. Следствием этого является возможность использования одного экземпляра кода для разных процессов.

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

Сегмент стека, содержащий автоматические переменные, может динамически менять свой размер (обычно в сторону уменьшения) и содержимое, и должен быть доступен по чтению и по записи и является приватным сегментом процесса.

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

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

а) виртуальный адрес начала сегмента,

б) размер сегмента, список операций, которые можно выполнять над данным сегментом,

в) статус сегмента (например, в каком режиме к нему возможен доступ, допускается ли совместное использование и т.д.),

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

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

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

Загрузка исполняемого файла (системный вызов exec) осуществляется обычно через отображение (mapping) его частей (кода, данных) в соответствующие сегменты адресного пространства процесса. После установления отображения, система начинает генерировать page fault'ы, в первую очередь для сегментов кода, данных и стека, подкачивая с диска необходимую информацию.

Сегмент данных динамически меняет свой размер. Пользователь, осуществляя выделение (библиотечный вызов malloc) или освобождение (free) динамических данных, фактически изменяет границу динамически выделенных процессу данных через системный вызов brk, который модифицирует значение переменной brk из структуры данных процесса. В результате происходит выделение физической памяти, а соответствующие строки таблиц страниц получают осмысленные значения. Ведение списков занятых и свободных областей памяти в сегменте данных пользователя осуществляется на уровне системных библиотек. На практике, освобожденная пользователем память (библиотечный вызов free) системе не возвращается, а резервируется для обслуживания возможных дальнейших запросов пользовательского процесса на выделение памяти.