- •36. Подсистема Win32. 32-х разрядный api. Подсистема Win32
- •37. Структура.
- •38. Конструктивные изменения.
- •39. Api: ms-dos и 16-ти разрядной Windows. Виртуальные dos-машины. Api: ms-dos и 16-ти разрядной Windows.
- •Виртуальные dos-машины
- •44. Диспетчер. Виртуальная память. Диспетчер.
- •Виртуальная память
- •45. Средства пользовательского режима: управление памятью, совместное использование. Средства пользовательского режима
- •Управление памятью
- •Совместное использование памяти
- •46. Совместное использование: секции, проекции и проецируемые файлы. Секции, проекции и проецируемые файлы
- •47. Объект-секция. Способы защиты памяти. Объект-секция
- •Защита памяти
- •48. Собственная память процесса. Совместное использование памяти. Собственная память процесса
- •Совместное использование памяти
- •49. Адресное пространство. Подкачка страниц. Адресное пространство
- •Подкачка страниц
- •50. Механизмы подкачки страниц. Механизмы подкачки страниц
- •51. Стратегия подкачки и рабочие наборы. Стратегия подкачки и рабочие наборы
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), для увеличения объема свободной памяти. Он просматривает все процессы, сравнивая текущий размер рабочего набора с минимальным . Когда диспетчер виртуальной памяти обнаруживает процессы, использующие набор больше минимального, он удаляет страницы из их рабочих наборов, так чтобы эти страницы можно было использовать в других целях. Если, несмотря на это, свободной памяти по-прежнему мало, диспетчер виртуальной памяти продолжает удалять страницы из рабочих наборов процессов, пока рабочий набор каждого процесса не станет минимальным.
После того, как рабочий набор процесса уменьшился до минимума, диспетчер виртуальной памяти отслеживает число генерируемых данным процессом страничных ошибок. Если процесс претерпевает страничные ошибки и память не слишком загружена, то диспетчер виртуальной памяти увеличивает размер рабочего набора. Однако, если в течение некоторого периода времени в процессе не происходит страничных ошибок, то либо код, исполняемый потоками процесса, комфортно умещается в минимальном рабочем наборе процесса, либо ни один из потоков процесса не исполняется. Например, процесс регистрации пользователя в системе просто ждет, пока пользователь не захочет зарегистрироваться. После регистрации пользователя этот процесс ждет выхода пользователя из системы. Для процесса регистрации пользователя и для других процессов, которые большую часть времени простаивают, диспетчер виртуальной памяти продолжает снижать размер рабочего набора, пока в процессе не произойдет страничная ошибка. Страничная ошибка означает, что либо потоки процесса вновь начали выполняться, либо достигнут минимальный размер памяти, необходимый потокам процесса для выполнения.
Процесс может изменить минимальный и максимальный размер своего рабочего набора, вызвав сервис объекта-процесса, однако в базе данных локальной стратегии подсистемы защиты хранятся абсолютные минимальное и максимальное значение для каждого процесса пользовательского режима. Несмотря на данную возможность, отдельным процессам по большей части не требуется изменять размеры своих рабочих наборов. Диспетчер памяти устроен так, чтобы при помощи стратегии локального замещения и автоматического урезания рабочего набора отслеживать нагрузку на память и соответствующим образом корректировать ее использование. Он пытается обеспечить максимальную возможную производительность каждого процесса без настройки системы пользователями или администратором.
