Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
8.10.11.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
5.95 Mб
Скачать

51. Стратегия подкачки и рабочие наборы. Стратегия подкачки и рабочие наборы

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

Стратегия считывания (fetch policy) определяет, когда средство подкач­ки должно перемещать страницу с диска в память. Стратегия считывания одного типа пытается загружать страницы, которые потребуются процессу, до того как он их запросит. В соответствии с другой стратегией считывания, называемой стратегией подкачки по запросу (demand paging policies), страница загружает­ся в память только тогда, когда происходит страничная ошибка. В системе с подкачкой по запросу в начале исполнения процесса возникает много странич­ных ошибок, так как его потоки обращаются к начальному набору страниц, не­обходимому для запуска процесса. После того как эти страницы загружены в память, интенсивность подкачки для данного процесса снижается.

Для загрузки страниц в память диспетчер виртуальной памяти NT использует алгоритм подкачки по запросу с "кластеризацией". Когда поток генерирует страничную ошибку, диспетчер виртуальной памяти загружает страницу, выз­вавшую ошибку, вместе с небольшим количеством окружающих ее страниц. Та­кая стратегия пытается минимизировать число страничных ошибок, возникаю­щих при исполнении потока. Поскольку программы, особенно большие, имеют тенденцию исполняться в данный момент времени в небольшом объеме своего виртуального адресного пространства, то загрузка кластеров виртуальных стра­ниц позволяет снизить число страничных ошибок.

При возникновении страничной ошибки система виртуальной памяти должна также определить, в какое место физической памяти следует загрузить виртуальную страницу. Набор используемых при этом правил называется стра­тегией размещения (placement policy). Хотя для сегментных архитектур памяти стратегия замещения часто бывает сложной, она обычно проста в линейных архитектурах, где требуется лишь найти свободный страничный фрейм. В NT, если память не заполнена, диспетчер виртуальной памяти просто выбирает пер­вый фрейм из списка свободных страничных фреймов. Если список пуст, дис­петчер просматривает несколько других поддерживаемых им списков; порядок просмотра зависит от типа обрабатываемой страничной ошибки.

Если страничная ошибка происходит, когда вся физическая память запол­нена, то применяется стратегия замещения (replacement policy), которая опре­деляет, какую виртуальную страницу нужно извлечь из памяти, чтобы освобо­дить место для новой страницы. К числу часто используемых стратегий замеще­ния относятся замещение используемого меньше всего (least recently used, LRU) и "первым пришел, первым ушел" (first in, first out, FIFO). Алгоритм LRU требует, чтобы система виртуальной памяти отслеживала, когда используется страница, находящаяся в памяти. Если нужно загрузить новую страницу, то на диск выг­ружается та страница, которая не использовалась дольше всех остальных, и ее страничный фрейм освобождается для обработки страничной ошибки. Алгоритм FIFO несколько проще: в соответствии с ним на диск перемещается та страница, которая дольше всех находилась в памяти, независимо от того, как часто она использовалась.

Стратегии замещения можно далее классифицировать как глобальные или локальные. Стратегия локального замещения (local replacement policy) выделя­ет каждому процессу фиксированное (или, как в NT, динамически настраивае­мое) число страничных фреймов. Когда процесс использует все выделенные ему фреймы, программное обеспечение виртуальной памяти освобождает (т. е. уда­ляет из физической памяти) одну из его страниц при каждой страничной ошиб­ке в данном процессе. В случае стратегии глобального замещения для обработки страничной ошибки используется любой страничный фрейм, независимо от того, принадлежит ли он процессу, в котором она произошла. Например, стратегия глобального замещения по алгоритму FIFO должна отыскивать страницу, которая дольше остальных находилась в памяти, и освобождать ее для обработ­ки страничной ошибки; стратегия локального замещения ограничивает поиск самой старой страницы набором только тех страниц, которые уже принадлежат процессу, вызвавшему страничную ошибку.

Стратегия глобального замещения создает ряд проблем. Во-первых, про­цессы становятся подверженными влиянию поведения других процессов. На­пример, если один или несколько процессов в системе используют большие объемы памяти, весьма вероятно, что любое исполняющееся приложение будет часто претерпевать страничные ошибки, и время его выполнения будет возрас­тать. Во-вторых, плохое приложение может подорвать работу всей системы, повышая интенсивность подкачки страниц во всех процессах. В Windows NT важно, чтобы подсистемам среды не приходилось бороться за память с другими процессами. Для эффективной работы и адекватной поддержки своих клиент­ских приложений подсистемы должны постоянно держать в памяти некоторое количество страниц. По этим причинам диспетчер виртуальной памяти исполь­зует стратегию локального замещения FIFO. При таком подходе ему необходимо отслеживать находящиеся в памяти страницы для каждого процесса. Это множе­ство страниц называется рабочим набором (working set) процесса. Деннинг обозначал термином рабочий набор (working set) минимальное количество страниц процесса, которое должно находиться в памяти, прежде чем процесс сможет выполняться. Если число страниц меньше рабочего набора, то процесс "пробуксовывает" (в нем постоянно встречаются стра­ничные ошибки — thrashing. В момент создания процессу назначается минимальный размер рабочего набора, т. е. минимальное число страниц процесса, которые гарантированно будут присутствовать в памяти во время его исполнения. Если память не слиш­ком загружена, то диспетчер виртуальной памяти позволяет процессу иметь в памяти число страниц, равное максимальному размеру его рабочего набора8. Если процессу потребуются дополнительные страницы, диспетчер виртуальной памяти удаляет одну из его страниц при каждой сгенерированной процессом страничной ошибке.

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

Когда физической памяти становится недостаточно, диспетчер виртуаль­ной памяти использует метод, называемый автоматическим урезанием рабоче­го набора (automatic working set trimming), для увеличения объема свободной памяти. Он просматривает все процессы, сравнивая текущий размер рабочего набора с минимальным . Когда диспетчер виртуальной памяти обнаруживает процессы, использующие набор больше минимального, он удаляет страницы из их рабочих наборов, так чтобы эти страницы можно было использовать в других целях. Если, несмотря на это, свободной памяти по-прежнему мало, диспет­чер виртуальной памяти продолжает удалять страницы из рабочих наборов процессов, пока рабочий набор каждого процесса не станет минимальным.

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

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

27

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