
- •Семестр 1. Операционные системы
- •Введение
- •История развития ОС
- •Классификация ресурсов
- •Понятие операционной системы
- •Понятие процесса и потока
- •Дескриптор процесса
- •Диспетчеризация процессов
- •Механизмы взаимного исключения
- •Алгоритм Деккера
- •Типовые механизмы синхронизации
- •Поддержка механизмов синхронизации в UNIX
- •Механизмы межпроцессного взаимодействия
- •Барьеры
- •Обработка тупиковых ситуаций
- •Предотвращение взаимоблокировок
- •Управление памятью
- •Инвертированные таблицы страниц
- •Алгоритмы замещения страниц
- •Подсистемы ввода-вывода
- •Загрузка ОС
- •Загрузка ОС
- •Понятие файловой системы
- •Реализация каталогов
- •Совместно используемые файлы
- •Непротиворечивость файловой системы
- •Реализации файловых систем
- •HPFS
- •NTFS
- •Семестр 2. Теория компиляторов
- •Современные системы программирования
- •Литература
- •Формальные языки и грамматики
- •Форма Бэкуса-Наура
- •Классификация грамматик
- •Лексический анализ и регулярные грамматики
- •Лексический анализ
- •Конечные автоматы
- •Минимизация КА
- •КС-грамматики. Приведение КС-грамматик
- •НФ Хомского
- •НФ Грейбах
- •Алгоритмы построения синтаксических анализаторов
- •Синтаксический распознаватель с возвратом
- •Распознаватели без возвратов
- •Формальное определение
- •Ситуация
- •Грамматики предшествования
- •Построение матрицы предшествования
- •Построение матрицы предшествования
- •Генерация кода. Распределение памяти
- •Распределение памяти
- •Дисплей памяти процедуры
- •Синтаксическое дерево
- •Верификация и оптимизация кода
- •Ассемблеры и компоновщики

Алгоритмы замещения страниц
Стратегии выборки по запросу и с упреждением. Алгоритмы замещения страниц. Алгоритм NRU, LRU, FIFO, NFU. Бит использования страницы. Понятие рабочего набора. Аномалия Билэди. Рабочие наборы в Windows
При управлении памятью используются 2 стратегии: стратегия выборки – в какой момент переписывать страницу из вторичной памяти в первичную. Два основных варианта – по запросу и с упреждением. В первом случае страница алгоритм работает тогда, когда программа обращается к отсутствующей странице памяти, которая находится на диске. Во втором случае помимо отсутствующей страницы загружаются и несколько окружающих ее страниц, в предположении, что ближайшие адреса тоже будут необходимы.
Стратегия размещения – в какой участок первичной памяти поместить новую страницу. Стратегия замещения – какую страницу вытолкнуть во внешнюю память, если свободной страницы для размещения нет.
Алгоритмы замещения страниц.
При отсутствии в памяти требуемой страницы, ОС должна не только найти ее и загрузить, но и еще и определить, вместо какой страницы будет подгружена новая. Простейший вариант – случайным образом – не позволяет достичь максимальной производительности.
NRU – не использовавшаяся в последнее время страница. Используется информация бит изменения и обращения. Важно реализовать изменение этих бит при каждом обращении к памяти, поэтому необходимо, чтобы они задавались аппаратно. Когда процесс запускается оба бита всех его страниц равны нулю. Периодически, например, по таймеру, бит обращения очищается, чтобы отличить страницы, к которым давно не было обращений от используемых. Когда возникает страничное прерывание, система проверяет все страницы. Они делятся на 4 класса:
0 – не было изменений и обращений
1 – не было обращений, но страница изменена
2 – было обращение, страница не изменилась
3 – были и изменения и обращения.
Алгоритм NRU (not recently used) – замещает страницу в непустом классе с наименьшим номером. Считается, что лучше выгрузить измененную страницу, к которой не было обращений хотя бы в течение последнего тика таймера, чем страницу, к которой такие обращения были.
Алгоритм FIFO. Система поддерживает список всех страниц, которые хранятся в памяти, причем в порядке их поступления. Поэтому самая первая страница является и самой старой. В результате удаляется страница, находящаяся в начале списка, а новая добавляется в его конец. В таком варианте алгоритм используется редко.
Вторая попытка. Дополнительно изучается бит обращений. Если он равен 0, старая страница удаляется, если же нет, то страница переносится в конец списка, бит обнуляется, и вновь проверяется страница, находящаяся теперь первой. Т.е. алгоритм ищет самую старую страницу, к которой не было обращений. Если обращения были ко всем страницам, алгоритм вырождается в обычный FIFO. Эффективность алгоритма снижается из-за необходимости перемещать страницы по списку.
Интуитивно кажется, что чем больше страниц на диске, тем меньше страничных прерываний вызывается программой. Рассмотрим FIFO с 3 страницами и 4:
|
0 |
1 |
2 |
3 |
0 |
1 |
4 |
0 |
1 |
2 |
3 |
4 |
|
Самая новая страница |
0 |
1 |
2 |
3 |
0 |
1 |
4 |
4 |
4 |
2 |
3 |
3 |
|
|
|
0 |
1 |
2 |
3 |
0 |
1 |
1 |
1 |
4 |
2 |
2 |
|
Самая старая страница |
|
|
0 |
1 |
2 |
3 |
0 |
0 |
0 |
1 |
4 |
4 |
9 страничных прерываний |
|
Р |
Р |
Р |
Р |
Р |
Р |
Р |
|
|
Р |
Р |
|
|
0 |
1 |
2 |
3 |
0 |
1 |
4 |
0 |
1 |
2 |
3 |
4 |
|
Самая новая страница |
0 |
1 |
2 |
3 |
3 |
3 |
4 |
0 |
1 |
2 |
3 |
4 |
|
|
|
0 |
1 |
2 |
2 |
2 |
3 |
4 |
0 |
1 |
2 |
3 |
|
|
|
|
0 |
1 |
1 |
1 |
2 |
3 |
4 |
0 |
1 |
2 |
|
Самая старая страница |
|
|
|
0 |
0 |
0 |
1 |
2 |
3 |
4 |
0 |
1 |
10 страничных прерываний |
|
Р |
Р |
Р |
Р |
|
|
Р |
Р |
Р |
Р |
Р |
Р |
Как видно, система с большим числом страниц при определенной стратегии замещения и определенной последовательности обращений к страницам, может вызвать большее число страничных прерываний, т.е. оказаться менее производительной. Такая ситуация называется аномалией Биледи.
Существует класс магазинных алгоритмов, у которых выполняется следующее условие: М(m,r) M(m+1,r), где m-число страничных блоков, r-индекс в последовательности обращений, M – страничный массив. Т.е. множество виртуальных страниц, после r обращений попавших в физическую память, для памяти, имеющей m страничных блоков, также попадает в физическую память, если она состоит из m+1 блока. Они не подвержены аномалии Биледи. В частности, алгоритм LRU удовлетворяет этому требованию.
Часы. Записи хранятся в списке в виде кольца, и имеется текущий указатель. При необходимости замещения проверяется та запись, на которую направлен текущий указатель. Если бит обращений равен 0, на ее место загружается новая страница, а указатель перемещается к следующей записи. Если 1 – бит сбрасывается, указатель перемещается и вновь выполняется проверка бита.

Алгоритм LRU last recently usedдольше всего не использовавшаяся страница. Замещается та страница, к которой дольше всего не было обращений. Для реализации алгоритма необходим список страниц, где последняя использовавшаяся страница находится в начале списка, а дольше всего неиспользуемая – в конце. Список должен обновляться при каждом обращении к памяти. Другой вариант реализации – в таблице добавляется поле, хранящее значение таймера. При замещении ищется страница с наименьшим значением. Еще один вариант реализации – аппаратно поддерживается матрица NxN, где N – число страниц. Изначально матрица нулевая. При обращении к блоку i, всем битам строки i присваивается 1, затем всем битам столбца i присваивается 0. В любой момент времени строка, двоичное значение которой наименьшее, является не используемой дольше всего.
Алгоритм NFU. not frequently used – редко используемая. Разновидность предыдущего алгоритма. С каждой страницей памяти связан программный счетчик, изначально равный нулю. Периодически (по таймеру) бит использования прибавляется к счетчику. При замещении выбирается страница с наименьшим значением счетчика. Проблема в том, что если какая-то часть программы работала долго, но теперь уже не используется, то последующие части все равно будут с меньшим значением счетчика, и соответственно, произойдет удаление используемых страниц.
Старение. Модификация предыдущего алгоритма: бит использования добавляется не в правый, а в левый бит счетчика, и перед добавлением счетчик сдвигается вправо.
Биты R для страниц 0-5 по тактам
101011 |
110010 |
110101 |
100010 |
011000 |
Счетчики страниц по тактам |
|
|
|
|
10000000 |
11000000 |
11100000 |
11110000 |
01111000 |
00000000 |
10000000 |
11000000 |
01100000 |
10110000 |
10000000 |
01000000 |
00100000 |
00010000 |
10001000 |
00000000 |
00000000 |
10000000 |
01000000 |
00100000 |
10000000 |
11000000 |
01100000 |
10110000 |
01011000 |
10000000 |
01000000 |
10100000 |
01010000 |
00101000 |
Алгоритм Рабочий набор. Во время выполнения фрагмента кода, процесс обращается как правило к небольшой части своих страниц. Множество страниц, которое процесс использует в данный момент, называется рабочим набором. Если рабочий набор целиком находится в памяти, процесс будет работать практически не вызывая прерываний из-за отсутствия страницы. Если же в памяти не удается разместить весь рабочий набор, процесс вызовет большое количество страничных прерываний, в результате замедляя работу. При повторном запуске процесса вновь будут вызываться страничные прерывания до тех пор, пока в памяти не окажется весь страничный набор. Многие системы со страничной организацией пытаются отследить рабочий набор каждого процесса и сохраняют его до запуска нового процесса. Загрузка страниц перед тем, как разрешить процессу работу, называется опережающей подкачкой страниц. Если ОС постоянно отслеживает рабочий набор процесса, то при необходимости замены страницы в памяти можно реализовать следующую стратегию: замена той страницы, которая не входит в рабочий набор. Фактически отслеживается, какие из страниц использовались за последние k тактов таймера. Страницы, использовавшиеся в этот отрезок времени, входят в рабочий набор. Алгоритм достаточно громоздок, поскольку при каждом страничном прерывании требует проверки таблицы страниц.
Алгоритм WSClock. Основан на часовом алгоритме, но с использованием информации о рабочем наборе. Ведется структура в виде кольцевого списка страничных блоков. Вначале список пустой. По мере прихода страниц, они поступают в список, формируя кольцо. Каждая запись, кроме бит R и M, содержат время последнего использования. Если бит R равен 1, это значит, что страница использовалась за последний тик таймера, и не является оптимальным кандидатом на удаление. Если бит R равен 0, и времени от момента последнего использования прошло много, то страница не входит в рабочий набор, и в данный страничный блок просто загружается новая страница. Если у такой страницы были изменения, и ее необходимо сохранить на диск. Чтобы избежать переключения процессов, запись на диск записывается в очередь планировщика, а указательстрелка на начало (текущую запись)
В многозадачных системах встает следующий вопрос: при необходимости замещения страницы следует учитывать только страницы активного процесса или же все страницы памяти? В первом случае речь идет о локальных алгоритмах замещения страниц, во втором – о глобальных. В целом глобальные алгоритмы работают лучше.
Windows поддерживает рабочие наборы – это подмножество виртуальных страниц, резидентных в физической памяти. № вида рабочих наборов: процесса, системы, сеанса. Диспетчер памяти использует алгоритм подкачки по требованию с кластеризацией, т.е. с упреждением. Используется 2 алгоритма замещения: LRU и FIFO. По умолчанию ОС устанавливает минимальную и максимальную величину рабочего набора для процесса – 50 и 345 страниц соответственно. Функция SetProcessWorkingSetSize позволяет их изменить при наличии привилегии Increase Scheduling Priority. Однако жестко установить лимиты позволяет только Windows Server 2003, в остальных случаях диспетчер памяти позволяет как превышать допустимый размер рабочего набора при наличии достаточного объема свободной памяти, так и уменьшать его ниже лимита при отсутствии подкачки и при потребности ОС в большом объеме физической памяти. Максимально допустимый размер рабочего набора колеблется от 1984 Мб до 8192 Гб в зависимости от версии Windows и аппаратной платформы.