Скачиваний:
273
Добавлен:
15.06.2014
Размер:
3.05 Mб
Скачать

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

Стратегии выборки по запросу и с упреждением. Алгоритмы замещения страниц. Алгоритм 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 и аппаратной платформы.