ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 24.12.2021

Просмотров: 12150

Скачиваний: 10

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
background image

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

443

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

мяти одновременно. Контроллер управления памятью проверяет

 бит

 присутствия

в данном элементе таблицы страниц. В нашем примере этот бит равен 1. Это зна-

чит, что страница в данный момент находится в памяти.

-15-битный адрес памяти

Виртуальная

страница

Бит присутствия

Таблица

страниц

1

110 --

20-битная виртуальная страница — И - * - 12-битное смещение -

32-битный виртуальный адрес

Выходной

регистр

Входной

регистр

Рис. 6.4. Формирование адреса основной памяти из адреса виртуальной памяти

Далее из выбранного элемента таблицы нужно взять значение страничного кадра

(в нашем примере — 6) и скопировать его в старшие три бита 15-битного выходного
регистра. Нужно именно три бита, потому что в физической памяти находится
8 страничных кадров. Параллельно с этой операцией младшие 12 битов виртуально-
го адреса (поле смещения страницы) копируются в младшие 12 битов выходного


background image

4 4 4 Глава 6. Уровень операционной системы

регистра. Затем полученный 15-битный адрес отправляется в кэш-память или ос-
новную память для поиска.

На рисунке 6.5 показано возможное отображение виртуальных страниц в физи-

ческие страничные кадры. Виртуальная страница 0 находится в страничном кадре 1.

Виртуальная страница 1 находится в страничном кадре 0. Виртуальной страницы 2
нет в основной памяти. Виртуальная страница 3 находится в страничном кадре 2.
Виртуальной страницы 4 нет в основной памяти. Виртуальная страница 5 нахо-

дится в страничном кадре 6 и т. д.

Таблица страниц

Виртуальная Страничный

страница кадр

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

0

;

 '.

0

1

0

0

1

0

0

1

0

1

1

0

1

0

1

1

г s

0

4 \

0

0

5 N

0

0

3 -

0

7 -

6 -

0

2 -

0

0 -

1 -

Страничный

кадр

Основная память

Виртуальная страница 6

Виртуальная страница 5

Виртуальная страница 11

Виртуальная страница 14

Виртуальная страница 8

Виртуальная страница 3

Виртуальная страница 0

Виртуальная страница 1

7

6

5

4

3

2

1

0

\

1 = присутствует в основной памяти

0 = отсутствует в основной памяти

Рис. 6.5. Возможное отображение первых 16 виртуальных страниц

в основную память, содержащую 8 страничных кадров

Вызов страниц по требованию

и рабочее множество

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


background image

Виртуальная память 445

При обращении к адресу страницы, которой нет в основной памяти, происходит

ошибка из-за отсутствия страницы.

 В случае такой ошибки операционная систе-

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

На машине с виртуальной памятью можно запустить программу даже в том

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

Такой метод работы с виртуальной памятью называется

 вызовом страниц по

требованию.

 Он похож на один из способов кормления младенцев: когда младе-

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

Вопрос о том, стоит ли использовать вызов страниц по требованию или нет,

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

Альтернативный подход основан на наблюдении, что большинство команд обра-

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

 к

 обращени-

ях. Деннинг [29] назвал этот набор страниц

 рабочим множеством.

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

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

Политика замещения страниц

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

 рабочее множество),

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

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


background image

4 4 6

 Глава 6. Уровень операционной системы

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

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

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

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

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

 LRU (Least Recently Used — алго-

ритм удаления наиболее давно использовавшихся элементов).

 Хотя этот алгоритм

работает достаточно хорошо, иногда возникают патологические ситуации. Ниже
описана одна из них.

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

рается на девять виртуальных страниц, а в физической памяти место есть только
для восьми страниц. Когда программа перейдет к странице 7, в основной памяти
будут находиться страницы с 0 по 7 (табл. 6.1). Затем совершается попытка вы-
звать команду из виртуальной страницы 8, что вызывает ошибку из-за отсутствия
страницы. Нужно принять решение, какую страницу убрать. По алгоритму LRU
будет выбрана виртуальная страница 0, поскольку она использовалась раньше всех.

Виртуальная страница 0 удаляется, а нужная виртуальная страница помещается
на ее место (табл. 6.2).

Таблица  6 . 1 .

 Ситуация, в которой алгоритм LRU не действует (1)

Виртуальная страница 7
Виртуальная страница 6
Виртуальная страница 5
Виртуальная страница 4
Виртуальная страница 3
Виртуальная страница 2
Виртуальная страница 1
Виртуальная страница О

Таблица 6.2.

 Ситуация, в которой алгоритм LRU не действует (2)

Виртуальная страница 7
Виртуальная страница 6
Виртуальная страница 5
Виртуальная страница 4
Виртуальная страница 3
Виртуальная страница 2
Виртуальная страница 1
Виртуальная страница 8


background image

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

  4 4 7

Таблица 6.3.

 Ситуация, в которой алгоритм LRU не действует (3)

Виртуальная страница 7
Виртуальная страница 6
Виртуальная страница 5
Виртуальная страница 4
Виртуальная страница 3
Виртуальная страница 2
Виртуальная страница О
Виртуальная страница 8

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

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

(табл. 6.3). Через некоторое время программа пытается вызвать команду из вир-
туальной страницы 1, что опять вызывает ошибку. Затем вызывается страница 1
и удаляется страница 2 и т. д.

Очевидно, что в этой ситуации алгоритм LRU совершенно не работает (другие

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

Можно применять и другой алгоритм —

 FIFO (First-in First-out — первым

поступил, первым выводится).

 FIFO удаляет ту страницу, которая раньше всех

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

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

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

Если размер рабочего множества больше, чем число доступных страничных

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

ошибки, то говорят, что наблюдается

 пробуксовка (thrashing).

 Думаю, не нужно

объяснять, что пробуксовка очень нежелательна. Если программа использует боль-

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

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

Если страница, которую нужно удалить, не менялась с тех пор, как ее считали

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