Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
BOS.doc
Скачиваний:
12
Добавлен:
21.12.2018
Размер:
1.25 Mб
Скачать

Вопрос 53. Ос unix. Управление памятью. Виртуальная память. Принцип Деннинга. Структура виртуального адресного пространства.

В UNIX System V Release 4 реализована сегментно-страничная модель памяти в ее традиционном виде. Наряду с механизмом управления страницами используется и механизм свопинга, когда на диск выталкиваются все страницы какого-либо процесса. Свопинг применяется в "предаварийных" ситуациях, когда размер свободной оперативной памяти уменьшается до некоторого заданного порога, так что работа всей системы очень затрудняется.

На рисунке 5.11 показаны основные структуры, описывающие виртуальное адресное пространство отдельного процесса. В дескрипторе процесса proc содержится указатель на структуру as, с помощью которой описываются все виртуальные сегменты, кото­рыми обладает данный процесс. Элемент a_seg в структуре as указывает на первый дескриптор сегмента процесса. Каждый дескриптор сегмента (структура seg) описывает один виртуальный сегмент процесса. Дескрипторы сегментов процесса связаны в двунаправленный список. Дескриптор сегмента содержит базовый адрес начала сегмента в виртуальном адресном пространстве процесса, размер сегмента, а также указатели на операции, которые допускаются над этим сегментом (дублирование, освобождение, отображение и т.д.).

Имеются следующие типы виртуальных сегментов:

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

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

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

Есть еще два типа сегментов:

Разделяемая память (shared memory) - область памяти, доступная для чтения и записи нескольким процессам.

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

Поле s_data дескриптора сегмента указывает на структуру данных segvn_dat, в которой содержится специфическая для сегмента информация:

type: признак, является ли сегмент разделяемым или личным;

vp и offset: указатель на vnode файла и смещение в этом файле, которые задают адрес, начиная с которого расположены на диске данные этого сегмента;

amp: указатель на карту анонимных страниц сегмента.

Рис. 5.11. Сегментно-страничная модель виртуальной памяти UNIX

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

Отображение виртуальных страниц сегмента на физические задается с помощью таблицы HAT (Hardware Address Translation), указатель на которую имеется в структуре адресного пространства процесса as. Структура таблицы HAT зависит от аппа­ратной платформы, но в любом случае с ее помощью можно найти таблицу или таблицы страниц, содержащих дескрипторы страниц (структуры типа pte). Дескриптор страницы содержит признак наличия данной виртуальной страницы в физической памяти, номер соответствующей физической страницы, а также ряд признаков типа "модификация", "была ссылка", помогающих операционной сис­теме планировать процесс вытеснения виртуальных страниц на диск.

В UNIX System V Release 4 используется алгоритм перемещения виртуальных страниц процесса в физическую память по за­просу. Обычно при запуске процесса в физическую память помещается только небольшая часть страниц, необходимая для старта про­цесса, а остальные страницы загружаются при страничных сбоях. Очевидно, что начальный период работы любого процесса порождает повышенную нагрузку на систему. Если при поиске виртуального адреса в соответствующем дескрипторе обнаруживается признак отсутствия этой страницы в физической памяти, то происходит страничное прерывание, и ядро перемещает эту страницу с диска в физическую память. Для поиска страницы на диске используется информация из структуры s_data сегмента - либо vnode и offset, если страница типа vnode, либо информация о расположении анонимной страницы в области свопинга с помощью информации о ее распо­ложении там по карте amp.

Если в физической памяти недостаточно места для размещения затребованной процессом страницы, то ОС выгружает неко­торые страницы на диск. Этот процесс осуществляется специальным процессом ядра, "выталкивателем страниц", имеющем в UNIX System V Release 4 имя pageout. Для принятия решения о том, какую виртуальную страницу нужно переместить на диск, процессу pageout нужно иметь информацию о текущем состоянии физической памяти.

В 1968 году американский исследователь Питер Деннинг сформулировал принцип локальности ссылок (называемый принципом Деннинга) и выдвинул идею алгоритма подкачки, основанного на понятии рабочего набора. В некотором смысле предложенный им подход является практически реализуемой аппроксимацией оптимального алгоритма Биледи. Принцип локальности ссылок (недоказуемый, но подтверждаемый на практике) состоит в том, что если в период времени (T-t, T) программа обращалась к страницам (С1, С2, ..., Сn), то при надлежащем выборе t с большой вероятностью эта программа будет обращаться к тем же страницам в период времени (T, T+t). Другими словами, принцип локальности утверждает, что если не слишком далеко заглядывать в будущее, то можно хорошо его прогнозировать исходя из прошлого. Набор страниц (С1, С2, ..., Сn) называется рабочим набором программы (или, правильнее, соответствующего процесса) в момент времени T. Понятно, что с течением времени рабочий набор процесса может изменяться (как по составу страниц, так и по их числу). Идея алгоритма подкачки Деннинга (иногда называемого алгоритмом рабочих наборов) состоит в том, что операционная система в каждый момент времени должна обеспечивать наличие в основной памяти текущих рабочих наборов всех процессов, которым разрешена конкуренция за доступ к процессору. Мы не будем вдаваться в технические детали алгоритма, а лишь заметим следующее. Во-первых, полная реализация алгоритма Деннинга практически гарантирует отсутствие thrashing. Во-вторых, алгоритм реализуем (известна, по меньшей мере, одна его полная реализация, которая однако потребовала специальной аппаратной поддержки). В-третьих, полная реализация алгоритма Деннинга вызывает очень большие накладные расходы.

Виртуальная память (ВП)

Используется сегментно-страничное распределение. При глобальном алгоритме – ищется во всех процессах, а при локальном – в одном процессе. При использовании гло­бального алгоритма могут быть тупики.

«Если в момент времени t программа обращается к страницам, то при надлежащем выборе t для того же набора с большей вероятностью это программа будет обращаться к тем же страницам». {c, …, a} – {T, T – t}.

С увеличением времени набор изменился. Смена рабочего набора не часто.

В самой ОС используется следующее представление виртуальной памяти:

ВП каждого процесса представлена в виде набора сегментов, три из которых обяза­тельны для каждого процесса, два – …… Сегменты описываются в структуре.

Сегменты:

сегменты программного кода – доступен только для чтения и может быть раз­деляем (принадлежать разным процес­сам).

сегмент данных – доступен для чтения и записи и является частным (принад­лежит одному процессу).

сегмент стека – доступен для чтения и записи и является частным (принадле­жит одному процессу).

разделяемый сегмент ВП – принадлежит нескольким процессам, помогает обмениваться данными, доступен для чте­ния и записи.

сегмент файлов, отображаемых в ВП – можно отображать файл в память и работать как с частью ОП. Откачки не про­исходит.

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

Описатель каждого сегмента содержит индивидуальные характеристики сегмента такие, как:

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

размер сегмента в байтах

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

статус сегмента

указатель на таблицу описателей станиц сегмента

На уровне страниц поддерживается два вида описательных структур. Для каждой станицы физической ОП существует описатель, входящий в один из трех списков.

1 список – описатель указания страниц, не допускающий модификаций.

2 список – список описателя свободных страниц, которые не используются.

3 список – список страниц, которые могут изменяться.

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

Периодически, при использовании алгоритма подкачки для каждого процесса выполняются следующие действия:

Просматривается таблица отображения всех сегментов ВП данного процесса.

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

Упрощенная версия:

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]