Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

ЭВУ 2 семестр / Презентации ЭВУ в пдф / метода моховикова

.pdf
Скачиваний:
36
Добавлен:
31.05.2015
Размер:
4.4 Mб
Скачать

В нашем примере установка CR3 производится почти в самом нача-

ле программы, процедурой "set_PDBR". Дело в том, что каталог страниц и любые таблицы страниц должны находиться целиком в физической странице памяти, т. е. по адресам, кратным 4 Кб. Определить эти адреса гораздо про-

ще, находясь в режиме реальных адресов, используя значения сегментных регистров – в защищенном режиме понадобилось бы обратиться к GDT, что-

бы получить адрес текущего сегмента данных, либо вводить дополнительные переменные.

Процедура "set_PDBR" вычисляет адрес каталога страниц как адрес ближайшей к концу программы свободной физической страницы памяти и помещает его в CR3:

set_PDBR

proc

near

 

 

 

; Установка значения в PDBR

 

 

xor

eax,eax

 

 

 

 

mov

edx,eax

 

 

 

 

mov

ax,ds

 

 

 

 

shl

eax,4

 

 

 

 

mov

ebx,eax

 

; Сохраняем в EBX физический адрес начала

 

 

 

 

;

сегмента данных.

lea

dx,Last_label

 

; Last_label - это последняя метка программы.

add

eax,edx

 

; EAX = физический адрес последней метки.

mov

dx,ax

 

 

 

 

and

ax,0f000h

; Сбрасываем младшие 12 бит адреса.

sub

dx,ax

 

 

 

 

cmp

dx,0

 

; Адрес последней метки уже был выравнен

 

 

 

;

на границу 4 Кб?

je

spdbr_1

 

 

 

 

add

ah,10h

 

; Если нет, то выравниваем его.

spdbr_1:

 

 

 

 

 

mov

cr3,eax ; Загрузка адреса в CR3 (т. е. в PDBR).

 

 

 

;

По этому

адресу будет размещен каталог стра-

ниц.

191

sub

eax,ebx ; EAX = AX = смещение каталога страниц

;относительно начала сегмента данных.

mov Page_Directory,ax

ret

endp

Примечание:

Команда ADD AH,10h здесь используется для выравнивания адреса на границу 4 Кб. Эта команда эквивалентна команде:

add eax,1000h

но так как в EAX уже находится адрес со сброшенными 12 младшими бита-

ми, а добавляем мы dw-число, то код можно сократить:

add ax,1000h

или

add ah,10h

3. Разрешение в процессоре страничного преобразования

Для того чтобы включить или, другими словами, разрешить в про-

цессоре страничное преобразование, необходимо установить бит PG (это 31-

й бит) в регистре управления CR0.

После того, как это будет сделано, нужно выполнить команду пере-

хода – она заставит процессор сбросить конвейер и начать выборку команд,

уже используя механизм трансляции страниц.

Перед возвратом программы в режим реальных адресов нужно за-

претить страничное преобразование – сбросить бит PG в CR0 и выполнить команду перехода – в этом случае она заставит процессор при выборке ко-

192

манд не использовать содержимое буферов TLB и программа корректно вый-

дет в R-Mode.

В нашем примере тождественное отображение для всех страниц ус-

танавливается не потому, что это просто, а потому, что это – надежно. Если вы включите страничное отображение и какая-либо часть программы (код,

стек, данные) будет описываться страницами с нетождественным отображе-

нием, то программа может «уйти» по нормальному линейному адресу, ука-

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

Для разрешения страничного преобразования в наших примерах будет использоваться процедура "set_paging", для запрещения –

"reset_paging":

set_paging proc

near

 

; Включение страничного преобразования

mov

eax,cr0

 

 

bts

eax,31

 

; Устанавливаем 31-й бит (PG)

mov

cr0,eax

 

 

jmp

spg_1

 

 

spg_1:

 

 

 

ret

 

 

 

endp

 

 

 

reset_paging

proc

near

; Запрещение страничного преобразования

mov

eax,cr0

 

 

btc

eax,31

 

; Сбрасываем 31-й бит (PG)

mov

cr0,eax

 

 

jmp

rspg_1

 

 

193

rspg_1:

ret

endp

В примере оставлен подсчет времени – теперь только до двух секунд.

Результатом работы страничного преобразования этого примера есть то, что он – работает. Это значит, что страничное отображение было установлено правильно, и все элементы PTE и элемент PDE хранят правильные адреса и флаги; в противном случае процессор попросту зависнет, либо произойдет аппаратный сброс, так как в программе разрешены прерывания.

И все же изменения в работе примера есть – число, которое оста-

нется на экране, будет отличаться от того, которое там осталось, если бы вы закомментировали вызов процедуры "set_paging". Оно – больше (на 2–3 %,

но больше). Это результат работы страничного отображения – работают бу-

феры TLB, кэшируя обращения к памяти (TLB – это отдельная тема).

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

12.10. Алгоритмы замещения страниц

Итак, наиболее ответственным действием страничной системы является выделение страницы основной памяти для удовлетворения требования дос-

тупа к отсутствующей в основной памяти виртуальной странице. Напомним,

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

стся найти свободную (не приписанную к какой-либо виртуальной памяти)

страницу. В этом случае операционная система должна в соответствии с за-

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

194

мять, должным образом модифицировать соответствующий элемент соответ-

ствующей таблицы страниц и после этого продолжить процесс удовлетворе-

ния доступа к странице.

Заметим, что при замещении приходится дважды передавать страницу между основной и вторичной памятью. Процесс замещения может быть оп-

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

ряется бит модификации. Если бит не установлен, нет необходимости пере-

писывать данную страницу на диск, она уже там. Эта техника также приме-

няется к read-only («только чтение страниц»), они никогда не модифициру-

ются. Эта схема уменьшает время обработки fault'а.

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

в отличие от глобальных, распределяют фиксированное или динамически на-

страиваемое число страниц для каждого процесса. Когда процесс израсходу-

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

Глобальные алгоритмы имеют несколько недостатков. Во-первых, они делают одни процессы чувствительными к поведению других процессов. На-

пример, если один процесс в системе использует большое количество памя-

ти, то все остальные приложения будут в результате ощущать сильное замед-

ление из-за недостатка памяти. Во-вторых, некорректно работающее прило-

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

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

195

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

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

лах.

Алгоритм обычно оценивается на конкретной последовательности ссы-

лок к памяти, для которой подсчитывается число fault'ов. Эта последователь-

ность называется reference string. Мы можем генерировать reference string

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

Для конкретного размера страниц можно запоминать только их номера, а не адреса, на которые идет ссылка.

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

Как уже говорилось, большинство процессоров имеют простейшие ап-

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

рой флаг (флаг изменения, modify-бит) устанавливается, если производится запись в эту страницу. Чтобы использовать эти возможности, операционная система должна периодически сбрасывать эти флаги.

12.10.1. FIFO-алгоритм. Выталкивание первой пришедшей страни-

цы

Простейший алгоритм. Каждой странице присваивается временная мет-

ка. Реализуется это через создание очереди страниц, в конец которой стра-

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

196

ся, когда требуется освободить память. Для замещения выбирается старей-

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

Аномалия Белейди (Belady)

Интуитивно ясно, что чем больше страничных кадров имеет память, тем реже будут иметь место page fault'ы. Удивительно, но это не всегда так. Как установил Белейди с коллегами, определенные последовательности обраще-

ний к страницам приводят в действительности к увеличению числа странич-

ных нарушений при увеличении кадров, выделенных процессу. Это явление носит название аномалии FIFO (рис. 82).

Три кадра (9 faults) оказываются лучше, чем 4 кадра (10 faults) для це-

почки 012301401234 чередования страниц при выборе стратегии FIFO.

197

Рис. 82. Аномалия Белейди:

a – FIFO с тремя страничными кадрами, b – FIFO с четырьмя страничными кадрами

Аномалию FIFO следует считать скорее курьезом, чем фактором, тре-

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

12.10.2. Оптимальный алгоритм

Одно из последствий открытия аномалии Belady – поиск оптимального алгоритма. Этот алгоритм имеет минимальную частоту fault'ов среди всех алгоритмов. Он прост: замещай страницу, которая не будет использоваться в течение длительного периода. Каждая страница помечается числом инструк-

ций, которые будут выполнены, прежде чем на эту страницу будет сделана первая ссылка. Этот алгоритм нереализуем. ОС не знает, к какой странице будет следующее обращение. (Ранее такие проблемы были с планированием процессов – алгоритм SJF). Для второго обращения уже можно делать про-

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

горитм применяется для оценки качества реализуемых алгоритмов.

12.10.3. Выталкивание дольше всего не использовавшейся страни-

цы. LRU-алгоритм

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

другой вперед. Если использовать прошлое, для аппроксимации будущего,

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

198

го времени. Такой подход называется least recently used (LRU) алгоритм. LRU

часто используется и считается хорошим. Основная проблема – реализация.

Необходимо иметь связанный список всех страниц в памяти, в начале кото-

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

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

носится значение указателя при каждой ссылке на страницу. При возникно-

вении page fault'а выгружается страница с наименьшим указателем. Как оп-

тимальный алгоритм, так и LRU не страдают от аномалии Белейди. Сущест-

вует класс алгоритмов, называемых стековыми (stack) алгоритмами, которые не проявляют аномалии Белейди. Это алгоритмы, для которых множество страниц в памяти для n кадров – всегда подмножество страниц для n+1 кадра. LRU таковым является.

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

вать прерывание для модификации полей, то это будет замедлять ссылку к памяти в 10 раз.

12.10.4.Выталкивание редко используемой страницы. NFU-

алгоритм

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

точно близкий к LRU, но не требующий сложной специальной поддержки.

Один из таких возможных алгоритмов – это алгоритм NFU (Not Frequently Used).

199

Для него требуются программные счетчики, по одному на каждую стра-

ницу, которые сначала равны нулю. При каждом прерывании по времени (а

не после каждой инструкции) операционная система сканирует все страницы в памяти и у каждой страницы с установленным флагом обращения увеличи-

вает на единицу значение счетчика, а флаг обращения сбрасывает.

Таким образом, кандидатом на освобождение оказывается страница с наименьшим значением счетчика, как страница, к которой реже всего обра-

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

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

мешая загрузке полезных в дальнейшем страниц.

К счастью, возможна небольшая модификация алгоритма, которая реа-

лизует «забывание». Достаточно, чтобы при каждом прерывании по времени содержимое каждого счетчика сдвигалось вправо на 1 бит, а уже затем про-

изводилось бы его увеличение для страниц с установленным флагом обраще-

ния.

Другим, уже не так просто устранимым недостатком алгоритма является длительность процесса сканирования таблиц страниц.

12.10.5. Другие алгоритмы

Для полноты картины можно упомянуть еще несколько алгоритмов. На-

пример, алгоритм Second-Chance – модификации FIFO, которая позволяет избежать потери часто используемых страниц – анализ бита r (reference) для самой старой страницы. Если бит 1, то страница в отличие от FIFO не вытал-

кивается, а очищается бит и страница становится в конец очереди. Если на

200