Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
UchbnoePosobieV14 - p2.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
2.08 Mб
Скачать

4.1.6.Страничная подкачка

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

  • одни коды уже обработаны процессором и их нахождение в оперативной памяти может быть охарактеризовано как не совсем уместное;

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

Очевидно, что изменить ситуацию при подкачке процессов целиком не представляется возможным. Если же осуществлять подкачку по частям, то теоретически при удачно выбранной тактике можно не только существенно сократить объемы информации, которой обменивается оперативная и долговременная память в результате swapping, но и продуктивнее использовать ОП. Практические результаты скромнее и термин «существенно сократить» следует заменить на термин «сократить». «Стоит ли в этом случае игра свеч?», – вопрос, на который нет ответа, а метод частичной подкачки используется наряду со swapping.

Поддержка частичной подкачки основана на использовании страниц. Страница – это фиксированный раздел памяти. Её объём выбирается таким образом, чтобы, с одной стороны, в страницу помещалось большое количество программных кодов, а с другой стороны, она могла полностью помещаться в кэш память. Размер страницы в различных системах колеблется от 512 байт до 64 кб. Наиболее распространенный объём страницы составляет 4 кб. Процесс состоит из целого числа страниц. Частичная выгрузка или подкачка заключается в записи на диск или загрузки в ОП нескольких страниц. Страница должна:

  • быть самостоятельной программной единицей (загружаться в физическую память независимо от других);

  • иметь механизм быстрого формирования и обработки.

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

В качестве рабочей модели виртуальной памяти естественно выбрать страничную модель (см. Рис. 4 .1), объём адресуемой памяти которой равен объему физической страницы. Совокупность всех виртуальных страниц составляет адресуемое пространство. Объем адресуемого пространства зависит от разрядности процессора. Для 32-х разрядного процессора он составляет порядка 4 000 Мб (миллион виртуальных страниц размером 4 кб) и, как правило, существенно превышает размер транзитной области памяти. Это обстоятельство дополнительно дает возможность заменить механизм оверлеев на более простой, условно расположив всю программу, объем которой превышает область транзитной памяти, на виртуальных страницах. Применяя затем ниже изложенный механизм замещения страниц подкачивать эту программу в ОП. Адекватность физической и виртуальной модели памяти позволяет эффективно ДП осуществить связывание информации: при совмещении начала некоторой виртуальной страницы с базовым адресом соответствующей физической страницы ADбаз текущие адреса можно легко рассчитать по формуле:

ADтек = ADбаз + ADсмещ,

где ADсмещ – смещение от базового адреса.

Сложнее дело обстоит с сопоставлением конкретной виртуальной страницы физической области. Это связано с тем, что количество страниц в физической и виртуальной памяти различно, и конкретную виртуальную страницу согласно возникающей ситуации система должна быть готова записать в любую требуемую физическую страницу. На Рис. 4 .7 отображена схема взаимодействия между виртуальной памятью в 32 кб и физической памятью в 16 кб. В каждый момент времени виртуальная и физическая память связана между собой табличной функцией (таблицей страниц), которая определяет соответствие между страницами виртуальной и физической памяти. Для момента, изображенного на Рис. 4 .7, она имеет следующий вид:

виртуальная страница

5

4

3

1

0

2

6

7

физическая страница

3

2

1

0

-

-

-

-

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

Если требуется скопировать виртуальную страницу с установленным битом присутствия / отсутствия (например, с номером три), то согласно таблице страниц копия будет произведена в физическую страницу с номером 1. Однако если требуется загрузить в физическую память 7-ю виртуальную страницу, то неустановленный бит присутствия / отсутствия вызовет прерывание процессора (так называемое страничное прерывание). После этого прерывания содержимое вы­бран­ной по определенному критерию (см. дальше) физической страницы будет выгружено на диск (для определенности пусть это будет физическая страница под номером 2), и эта страница будет закреплена за виртуальной страницей, вызвавшей прерывание процессора. При этом будет произ­ведена следующая коррекция содержимого таблицы страниц:

  • в виртуальной странице с номером 4 будет снят бит присутствия/отсутствия, что инициализирует запрет копирования из этой страницы;

  • напротив, в 7-й виртуальной странице будет установлен бит присутствия / отсутствия и она будет связана в таблице страниц с физической страницей под номером 2.

Рис. 4.7. Соответствие виртуальных и физических страниц памяти

После этих изменений табличная функция соответствия физической и виртуальной памяти примет следующий вид:

виртуальная страница

5

4

3

1

0

2

6

7

физическая страница

3

-

1

0

-

-

-

2

Таким образом, для адекватного изменения таблицы страниц достаточно одной операции обмена.

Из рассмотренного примера создается впечатление, что механизм управления страницами достаточно простой и к тому же быстрый, так как диспетчер памяти, который, как правило, является частью микросхемы процессора, на аппаратном уровне. Однако в реальных системах все гораздо сложнее. Как было отмечено выше, при 32-х разрядном процессоре и объеме страницы, равному 4–м кб, количество страниц достигает миллиона и, следовательно, число экземпляров в таблице страниц также достигает миллиона. После этого впечатляющего расчета, и учитывая, что к таблице страниц приходится обращаться при выполнении каждой команды (при вычислении ADтек требуется знать конкретную физическую страницу), зарождаются сомнения в возможности быстрого выполнения рассмотренной обработки, если не предпринять дорогостоящих аппаратных решений. Например, постоянно держать всю таблицу в массиве быстрых регистров и тогда указанный механизм управления страницами не будет выглядеть слишком обременительным для производительности системы, но приведет к ощутимому росту стоимости системы. В другом крайнем случае можно было бы держать таблицу страниц в оперативной памяти и для переключения её состояния использовать быстрый регистр. Однако необходимость обращаться к оперативной памяти несколько раз при выполнении одной команды нанесло бы производительности системы ощутимый урон. Хорошим компромиссом между двумя предельными случаями является применение двухуровневых (в общем случае многоуровневых) таблиц. В частности, в 32–х разрядных процессорах адрес содержит три части.

Старшие 10 битов указывают на одну из 1024 запись в таблице первого уровня. Каждая запись этого уровня соответствует «большой странице» объёмом в 4 Мб памяти (по её значению адрес идентифицируется с точностью до 4 Мб).

В свою очередь каждая «большая страница» разбивается на 210 страниц по 4 кб в каждой. Их описанию посвящены 1024 таблицы второго уровня. Записи и этих таблицах локализируют адрес в пространстве 4 кб. Соответствующая запись содержится в следующих 10 битах 32-х битного адреса.

В оставшихся младших 12 битах в 32-х битовом адресе записывается смещение от начала 4–х кб страницы.

Указанным образом определяется место положения адреса текущей команды в адресном пространстве 232.

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

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

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

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

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

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

Не использовавшаяся в последнее время страница. Этот алгоритм называется NRU (Not Recently Used). Для его поддержки в каждую запись страниц вводится два битовых поля (значения этих битовых полей используются и в других алгоритмах). Одно поле (R) устанавливается в 1, если было хотя бы одно обращение к странице. Другое поле (M) устанавливается в единицу, если было изменение страницы (т.е. страница выгружалась на диск). Значения этих полей поддерживаются чаще всего на аппаратном уровне. При страничном прерывании система проверяет все указанные биты и по их значениям образует 4 класса:

  • класс 0: не было ни одного обращения к странице и не было её обновление (R=0, M=0);

  • класс 1: не было ни одного обращения к странице и было её обновление (R=0, M=1);

  • класс 2: было обращение к странице и не было её обновление (R=1, M=0);

  • класс 3: было обращение к странице и было её обновление (R=1, M=1).

В алгоритме NRU удаляется первая попавшаяся страница из непустого класса с наименьшим номером (более предпочтительный для этого класс с номером 0). Абсолютная продуктивность этого алгоритма не производит впечатления, но относительная продуктивность (с учетом незначительных затрат на него) вполне приемлема.

Алгоритм FIFO. На поддержку этого алгоритма также затрачивается немного ресурсов. Из всех страниц, находящихся в памяти организуется очередь. Страница, находящаяся в начале очереди (и следовательно, находящаяся в памяти дольше всех других страниц) выгружается на диск. Вновь поступившая в ОП страница становиться к конец очереди. Очевидно, что такой подход приводит в некоторых ситуациях к решениям типа «невпопад». Например, страница после долгого простоя, решительно собравшаяся включиться в плодотворный творческий процесс, неожиданно испытывает на себе воздействие бездушной и неумолимой силы, которая наглядно демонстрирует, что принцип FIFO не всегда то, что о нём думают. К ещё большим издержкам приводит удаление, давно загруженной, но активно используемой страницы. В алгоритме «вторая попытка» этот недостаток устраняется и такой подход становится более или менее продуктивным.

Алгоритм «вторая попытка». В этом алгоритме перед удалением первой страницы в очереди проверяется бит обращения (R). Если обращения к этой странице не было (R=0), то она удаляется из памяти, иначе (R=1) ей дается «вторая попытка» – бит R обнуляется, данная страница встаёт в конец очереди и в качестве кандидата на удаление из ОП рассматривается на таких же основаниях следующая в очереди страница. В конечном счете, определяется первая страница с нулевым битом обращения. Допустим, что в первоначальном состоянии очередь не содержала страницы с R = 0. Тогда, учитывая операцию обнуления бита обращения при рассмотрении каждого кандидата, в «разряд удаляемых» попадет страница, которая была первой в первоначальном состоянии очереди.

Усовершенствование этого алгоритма на логическом уровне не дает ещё права на его безоговорочное применение. Это усовершенствование поддержано на аппаратном уровне. Иначе дополнительные операции могли бы привести к таким временным затратам, которые сделали бы применение этого алгоритма не целесообразным.

Алгоритм «часы». В этом алгоритме сделан следующий шаг по усовершенствованию подхода FIFO к замещению страниц. Очевидно, основным недостатком предыдущего шага является наличие довольно большого числа операций, связанных с «перелистыванием» элементов очереди т. е. с передвижением страниц по списку. В алгоритме «часы» (Рис. 4 .8):

  • страницы (А…М) образуют кольцевой связанный список;

  • движение страниц по списку заменено движением стрелки (указателя) от текущей страницы к последующей.

В остальном этот алгоритм совпадает с алгоритмом «вторая попытка». В странице, на которую указывает стрелка, проверяется бит R. Если он равен 0, то страница считается свободной и её может заменить новая страница. Иначе бит R сбрасывается и стрелка-указатель переходит по кругу к следующей страницы. Поиск страницы – кандидата на замещение продолжается то тех пор, пока будет не найдена страница с R=0. Если значение стрелки-указателя держать в быстром регистре, то поиск нужной страницы не займёт много времени.

Распределение памяти под процессы. Пусть каждый процесс состоит из числа страниц Ni. Естественно поставить вопрос: как определить целесообразное число страниц N, которые каждый процесс должен держать в памяти? Если их будет слишком мало, то число страничных прерываний будет частым. Если будут загружены все Ni, то память может оказаться перегруженной. На Рис. 4 .9 отображен график, при использовании которого находится приемлемый компромисс между количеством страничных прерываний M и объёмом, занимаемым в памяти. Область, ограниченная линией 1 и линией 2, представляет собой допустимые значения страничных прерываний. Если значение M лежит выше этой области, то следует увеличить число загруженных страниц N. Если число страничных прерываний выходит за нижнюю границу, то N следует уменьшить.

Рис. 4.8. Выбор страниц по алгоритму «часы»

Рис. 4.9. График, иллюстрирующий выбор оптимальных значений страничных прерываний

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