В операционной системе компьютера , которая использует подкачку для управления виртуальной памятью , алгоритмы замены страниц решают, какие страницы памяти выгружать, иногда называемые подкачкой, или записывать на диск, когда необходимо выделить страницу памяти. Замена страниц происходит, когда запрошенная страница отсутствует в памяти ( ошибка страницы ) и свободная страница не может быть использована для удовлетворения выделения, либо потому, что их нет, либо потому, что количество свободных страниц меньше некоторого порогового значения.
Когда страница, которая была выбрана для замены и выгружена, снова используется, она должна быть выгружена (считана с диска), и это включает в себя ожидание завершения ввода-вывода. Это определяет качество алгоритма замены страниц: чем меньше времени ожидания загрузки страниц, тем лучше алгоритм. Алгоритм замены страниц анализирует ограниченную информацию о доступе к страницам, предоставляемую оборудованием, и пытается угадать, какие страницы следует заменить, чтобы минимизировать общее количество промахов страниц, одновременно уравновешивая это затратами (основное хранилище и процессорное время) самого алгоритма.
Задача замены страницы является типичной онлайн-задачей с точки зрения конкурентного анализа в том смысле, что известен оптимальный детерминированный алгоритм.
Алгоритмы замены страниц были горячей темой исследований и дебатов в 1960-х и 1970-х годах. Это в основном закончилось разработкой сложных приближений LRU (наименее недавно используемых) и алгоритмов рабочего набора . С тех пор некоторые основные предположения, сделанные традиционными алгоритмами замены страниц, были признаны недействительными, что привело к возрождению исследований. В частности, следующие тенденции в поведении базового оборудования и программного обеспечения на уровне пользователя повлияли на производительность алгоритмов замены страниц:
Требования к алгоритмам замены страниц изменились из-за различий в архитектурах ядер операционных систем . В частности, большинство современных ядер ОС имеют унифицированные кэши виртуальной памяти и файловой системы, требующие, чтобы алгоритм замены страниц выбирал страницу из страниц как виртуальных адресных пространств пользовательских программ, так и кэшированных файлов. Последние страницы имеют особые свойства. Например, они могут быть заблокированы или могут иметь требования к порядку записи, налагаемые журналированием . Более того, поскольку целью замены страниц является минимизация общего времени ожидания памяти, она должна учитывать требования к памяти, налагаемые другими подсистемами ядра, которые выделяют память. В результате замена страниц в современных ядрах ( Linux , FreeBSD и Solaris ) имеет тенденцию работать на уровне распределителя памяти ядра общего назначения, а не на более высоком уровне подсистемы виртуальной памяти.
Алгоритмы замены могут быть локальными или глобальными.
Когда процесс сталкивается с ошибкой страницы, локальный алгоритм замены страниц выбирает для замены некоторую страницу, принадлежащую тому же процессу (или группе процессов, совместно использующих раздел памяти ). Глобальный алгоритм замены может выбрать любую страницу в памяти.
Локальная замена страниц предполагает некоторую форму разбиения памяти, которая определяет, сколько страниц должно быть назначено данному процессу или группе процессов. Наиболее популярными формами разбиения являются алгоритмы фиксированного разбиения и сбалансированного набора, основанные на модели рабочего набора . Преимуществом локальной замены страниц является ее масштабируемость: каждый процесс может обрабатывать свои ошибки страниц независимо, что приводит к более стабильной производительности для этого процесса. Однако глобальная замена страниц более эффективна на основе всей системы. [1]
Современные компьютеры общего назначения и некоторые встроенные процессоры поддерживают виртуальную память . Каждый процесс имеет свое собственное виртуальное адресное пространство. Таблица страниц отображает подмножество виртуальных адресов процесса в физические адреса. Кроме того, в большинстве архитектур таблица страниц содержит бит «доступа» и «грязный» бит для каждой страницы в таблице страниц. ЦП устанавливает бит доступа, когда процесс считывает или записывает память на этой странице. ЦП устанавливает грязный бит, когда процесс записывает память на этой странице. Операционная система может изменять биты доступа и грязные биты. Операционная система может обнаруживать доступы к памяти и файлам с помощью следующих средств:
read
в write
POSIX.Большинство алгоритмов замены просто возвращают целевую страницу в качестве результата. Это означает, что если целевая страница грязная (то есть содержит данные, которые должны быть записаны в стабильное хранилище, прежде чем страница может быть возвращена), необходимо инициировать ввод-вывод для отправки этой страницы в стабильное хранилище (чтобы очистить страницу). В ранние дни виртуальной памяти время, потраченное на очистку, не имело большого значения, поскольку виртуальная память была впервые реализована в системах с полнодуплексными каналами к стабильному хранилищу, и очистка обычно перекрывалась подкачкой. С другой стороны, современное аппаратное обеспечение не поддерживает полнодуплексные передачи, и очистка целевых страниц становится проблемой.
Чтобы справиться с этой ситуацией, реализуются различные политики предварительной очистки . Предварительная очистка — это механизм, который запускает ввод-вывод на грязных страницах, которые (вероятно) будут вскоре заменены. Идея заключается в том, что к тому времени, когда предварительно очищенная страница будет фактически выбрана для замены, ввод-вывод завершится, и страница будет чистой. Предварительная очистка предполагает, что можно определить страницы, которые будут заменены следующими . Слишком активная предварительная очистка может тратить пропускную способность ввода-вывода, записывая страницы, которые успевают снова загрязниться до того, как будут выбраны для замены.
Проблема (h,k)-пагинации является обобщением модели проблемы пагинации: пусть h,k будут положительными целыми числами, такими что . Мы измеряем производительность алгоритма с кэшем размером относительно теоретически оптимального алгоритма замены страниц. Если , мы предоставляем оптимальный алгоритм замены страниц со строго меньшим ресурсом.
Задача (h,k)-пейджинга — это способ измерения производительности онлайн-алгоритма путем сравнения ее с производительностью оптимального алгоритма, в частности, путем раздельной параметризации размера кэша онлайн-алгоритма и оптимального алгоритма.
Алгоритмы маркировки — это общий класс алгоритмов страничного обмена. Для каждой страницы мы связываем ее с битом, называемым ее меткой. Изначально мы устанавливаем все страницы как немаркированные. Во время этапа (периода работы или последовательности запросов) запросов страниц мы помечаем страницу, когда она впервые запрашивается на этом этапе. Алгоритм маркировки — это такой алгоритм, который никогда не выгружает помеченную страницу.
Если ALG — это алгоритм маркировки с кэшем размером k, а OPT — оптимальный алгоритм с кэшем размером h, где , то ALG является -конкурентным. Таким образом, каждый алгоритм маркировки достигает -конкурентного отношения.
LRU — это алгоритм маркировки, а FIFO — нет.
Алгоритм является консервативным, если при любой последовательной последовательности запросов, содержащей k или менее различных ссылок на страницы, алгоритм вызовет k или менее ошибок страниц.
Если ALG — консервативный алгоритм с кэшем размером k, а OPT — оптимальный алгоритм с кэшем размером , то ALG является -конкурентным. Таким образом, каждый консервативный алгоритм достигает -конкурентного отношения.
LRU, FIFO и CLOCK — консервативные алгоритмы.
Существует множество алгоритмов замены страниц: [2]
Теоретически оптимальный алгоритм замены страниц (также известный как OPT, алгоритм ясновидящей замены или политика оптимальной замены страниц Белади ) [3] [4] [2] — это алгоритм, который работает следующим образом: когда необходимо заменить страницу, операционная система заменяет страницу, следующее использование которой произойдет в самом отдаленном будущем. Например, страница, которая не будет использоваться в течение следующих 6 секунд, будет заменена страницей, которая будет использоваться в течение следующих 0,4 секунды.
Этот алгоритм не может быть реализован в операционной системе общего назначения, поскольку невозможно надежно вычислить, сколько времени пройдет до того, как страница будет использована, за исключением случаев, когда все программное обеспечение, которое будет работать в системе, либо известно заранее и поддается статическому анализу его шаблонов ссылок на память, либо только класс приложений, допускающих анализ во время выполнения. Несмотря на это ограничение, существуют алгоритмы [5] , которые могут предложить почти оптимальную производительность — операционная система отслеживает все страницы, на которые ссылается программа, и использует эти данные для решения о том, какие страницы следует загружать и выгружать при последующих запусках. Этот алгоритм может предложить почти оптимальную производительность, но не при первом запуске программы и только если шаблон ссылок на память программы относительно постоянен при каждом запуске.
Анализ проблемы пейджинга также был выполнен в области онлайн-алгоритмов . Эффективность рандомизированных онлайн-алгоритмов для проблемы пейджинга измеряется с помощью амортизированного анализа .
Алгоритм замены недавно использованных страниц (NRU) — это алгоритм, который поддерживает сохранение в памяти страниц, которые недавно использовались. Этот алгоритм работает по следующему принципу: когда ссылаются на страницу, для этой страницы устанавливается бит ссылки, помечая ее как ссылаемую. Аналогично, когда страница изменяется (записывается), устанавливается измененный бит. Установка битов обычно выполняется аппаратно, хотя это возможно сделать и на программном уровне.
В определенный фиксированный интервал времени прерывание таймера срабатывает и очищает ссылочный бит всех страниц, так что только страницы, на которые есть ссылки в текущем интервале таймера, помечаются ссылочным битом. Когда страницу необходимо заменить, операционная система делит страницы на четыре класса:
Хотя кажется невозможным, чтобы страница была изменена, но не была использована, это происходит, когда бит ссылки страницы класса 3 очищается прерыванием таймера. Алгоритм NRU выбирает случайную страницу из самой низкой категории для удаления. Таким образом, из четырех вышеуказанных категорий страниц алгоритм NRU заменит неиспользуемую, неизмененную страницу, если такая страница существует. Обратите внимание, что этот алгоритм подразумевает, что измененная, но неиспользуемая (в течение последнего интервала таймера) страница менее важна, чем неизмененная страница, на которую часто ссылаются.
NRU — это алгоритм маркировки, поэтому он является конкурентным.
Самый простой алгоритм замены страниц — это алгоритм FIFO. Алгоритм замены страниц «первым пришел, первым вышел» (FIFO) — это алгоритм с низкими накладными расходами, который требует небольшого учета со стороны операционной системы . Идея очевидна из названия — операционная система отслеживает все страницы в памяти в очереди, с самым последним поступлением в конце, а самым старым поступлением в начале. Когда страницу необходимо заменить, выбирается страница в начале очереди (самая старая страница). Хотя FIFO дешев и интуитивно понятен, на практике он работает плохо. Поэтому он редко используется в своей неизмененной форме. Этот алгоритм испытывает аномалию Белади . Проще говоря, при ошибке страницы заменяется кадр, который находится в памяти дольше всего.
Алгоритм замены страниц FIFO используется операционной системой OpenVMS с некоторыми изменениями. [6] Частичный второй шанс предоставляется путем пропуска ограниченного числа записей с допустимыми ссылками на таблицу трансляции, [7] и, кроме того, страницы перемещаются из рабочего набора процесса в общесистемный пул, из которого их можно восстановить, если они еще не были повторно использованы.
FIFO — консервативный алгоритм, поэтому он конкурентный.
Модифицированная форма алгоритма замены страниц FIFO, известная как алгоритм замены страниц второго шанса, работает относительно лучше, чем FIFO, при небольших затратах на улучшение. Он работает, просматривая начало очереди, как это делает FIFO, но вместо того, чтобы немедленно выгружать эту страницу, он проверяет, установлен ли ее ссылочный бит. Если он не установлен, страница выгружается. В противном случае ссылочный бит очищается, страница вставляется в конец очереди (как если бы это была новая страница), и этот процесс повторяется. Это также можно рассматривать как циклическую очередь. Если у всех страниц установлен их ссылочный бит, при втором появлении первой страницы в списке эта страница будет выгружена, так как теперь ее ссылочный бит очищен. Если у всех страниц их ссылочный бит очищен, то алгоритм второго шанса вырождается в чистый FIFO.
Как следует из названия, функция Second-chance дает каждой странице «второй шанс» — старая страница, на которую есть ссылка, вероятно, используется, и ее не следует заменять новой страницей, на которую нет ссылки.
Clock — более эффективная версия FIFO, чем Second-chance, потому что страницы не нужно постоянно отодвигать в конец списка, но он выполняет ту же общую функцию, что и Second-Chance. Алгоритм clock хранит в памяти циклический список страниц, при этом «рука» (итератор) указывает на последний проверенный кадр страницы в списке. Когда происходит ошибка страницы и пустых кадров нет, то бит R (ссылка) проверяется в месте расположения стрелки. Если R равен 0, то новая страница помещается на место страницы, на которую указывает «рука», и стрелка продвигается на одну позицию. В противном случае бит R очищается, затем стрелка часов увеличивается, и процесс повторяется до тех пор, пока страница не будет заменена. [8] Этот алгоритм был впервые описан в 1969 году Фернандо Х. Корбато . [9]
CLOCK — консервативный алгоритм, поэтому он является конкурентным.
Алгоритм замены наименее недавно использованных страниц (LRU), хотя и похож по названию на NRU, отличается тем, что LRU отслеживает использование страниц за короткий период времени, в то время как NRU просто смотрит на использование за последний тактовый интервал. LRU работает на идее, что страницы, которые наиболее интенсивно использовались в последних нескольких инструкциях, скорее всего, будут активно использоваться и в следующих нескольких инструкциях. Хотя LRU может обеспечить почти оптимальную производительность в теории (почти такую же хорошую, как адаптивный кэш замены ), его довольно дорого реализовать на практике. Существует несколько методов реализации этого алгоритма, которые пытаются снизить стоимость, но при этом сохранить как можно большую часть производительности.
Самый дорогой метод — метод связанного списка, который использует связанный список, содержащий все страницы в памяти. В конце этого списка находится наименее использованная страница, а в начале — наиболее использованная страница. Стоимость этой реализации заключается в том, что элементы в списке придется перемещать при каждом обращении к памяти, что является очень трудоемким процессом.
Другой метод, требующий аппаратной поддержки, заключается в следующем: предположим, что оборудование имеет 64-битный счетчик, который увеличивается на каждой инструкции. Всякий раз, когда осуществляется доступ к странице, она приобретает значение, равное счетчику на момент доступа к странице. Всякий раз, когда необходимо заменить страницу, операционная система выбирает страницу с наименьшим счетчиком и выгружает ее.
Из-за затрат на реализацию можно рассмотреть алгоритмы (например, те, что приведены ниже), которые похожи на LRU, но предлагают более дешевую реализацию.
Одним из важных преимуществ алгоритма LRU является то, что он поддается полному статистическому анализу. Например, было доказано, что LRU никогда не может привести к более чем N-кратному количеству ошибок страниц, чем алгоритм OPT, где N пропорционально количеству страниц в управляемом пуле.
С другой стороны, слабость LRU заключается в том, что его производительность имеет тенденцию к ухудшению при многих довольно распространенных шаблонах ссылок. Например, если в пуле LRU есть N страниц, приложение, выполняющее цикл по массиву из N + 1 страниц, будет вызывать ошибку страницы при каждом доступе. Поскольку циклы по большим массивам являются обычным явлением, много усилий было вложено в модификацию LRU для лучшей работы в таких ситуациях. Многие из предлагаемых модификаций LRU пытаются обнаружить шаблоны ссылок цикла и переключиться на подходящий алгоритм замены, например Most Recently Used (MRU).
Сравнение ARC с другими алгоритмами (LRU, MQ, 2Q, LRU-2, LRFU, LIRS ) можно найти в работе Megiddo & Modha 2004. [19]
LRU — это алгоритм маркировки, поэтому он является конкурентным.
Алгоритм случайной замены заменяет случайную страницу в памяти. Это устраняет накладные расходы на отслеживание ссылок на страницы. Обычно он работает лучше, чем FIFO, а для циклических ссылок на память он лучше, чем LRU, хотя в целом LRU работает лучше на практике. OS/390 использует глобальную аппроксимацию LRU и возвращается к случайной замене, когда производительность LRU ухудшается, а процессор Intel i860 использовал политику случайной замены (Rhodehamel 1989 [20] ).
Алгоритм замены нечасто используемых страниц (NFU) требует счетчика, и у каждой страницы есть свой счетчик, который изначально установлен на 0. В каждом тактовом интервале все страницы, к которым были обращения в течение этого интервала, будут увеличивать свой счетчик на 1. По сути, счетчики отслеживают, как часто использовалась страница. Таким образом, страница с наименьшим счетчиком может быть заменена при необходимости.
Основная проблема с NFU заключается в том, что он отслеживает частоту использования без учета временного интервала использования. Таким образом, в многопроходном компиляторе страницы, которые интенсивно использовались во время первого прохода, но не нужны во втором проходе, будут иметь преимущество перед страницами, которые сравнительно редко используются во втором проходе, так как у них более высокие счетчики частоты. Это приводит к низкой производительности. Существуют и другие распространенные сценарии, в которых NFU будет работать аналогично, например, загрузка ОС. К счастью, существует похожий и лучший алгоритм, и его описание приведено ниже.
Редко используемый алгоритм замены страниц генерирует меньше ошибок страниц, чем наименее часто используемый алгоритм замены страниц, когда таблица страниц содержит нулевые значения указателей.
Алгоритм старения является потомком алгоритма NFU с модификациями, позволяющими ему учитывать временной интервал использования. Вместо того чтобы просто увеличивать счетчики страниц, на которые ссылаются, делая одинаковый акцент на ссылках на страницы независимо от времени, счетчик ссылок на странице сначала сдвигается вправо (делится на 2), прежде чем добавлять бит ссылки слева от этого двоичного числа. Например, если страница ссылалась на биты 1,0,0,1,1,0 за последние 6 тактов часов, ее счетчик ссылок будет выглядеть следующим образом в хронологическом порядке: 10000000, 01000000, 00100000, 10010000, 11001000, 01100100. Ссылки на страницы, которые ближе к настоящему времени, оказывают большее влияние, чем ссылки на страницы, которые были давно. Это гарантирует, что страницы, на которые ссылаются недавно, хотя и реже ссылаются, будут иметь более высокий приоритет по сравнению со страницами, на которые ссылаются чаще в прошлом. Таким образом, когда необходимо заменить страницу, будет выбрана страница с наименьшим счетчиком.
Следующий код Python имитирует алгоритм старения. Счетчики инициализируются с помощью0 и обновляется, как описано выше , с помощью операторов арифметического сдвига .
из collections.abc импортировать последовательностьdef simulation_aging ( Rs : Sequence , k : int ) -> None : # Моделирование старения print ( " t | R-биты (0- {length} ) | Счетчики для страниц 0- {length} " . format ( length = len ( Rs ))) Vs = [ 0 ] * len ( Rs [ 0 ]) for t , R in enumerate ( Rs ): Vs [:] = [ R [ i ] << ( k - 1 ) | V >> 1 for i , V in enumerate ( Vs )] print ( " {:02d} | {} | [ {} ]" . format ( t , R , ", " . join ( [ " {:0 {} b}" . format ( V , k ) for V in Vs ])))
В приведенном примере R-битов для 6 страниц за 5 тактов функция выводит следующий вывод, в котором перечислены R-биты для каждого такта t и отдельные значения счетчика для каждой страницы в двоичном представлении. [21]
>>> Rs = [[ 1 , 0 , 1 , 0 , 1 , 1 ], [ 1 , 1 , 0 , 0 , 1 , 0 ], [ 1 , 1 , 0 , 1 , 0 , 1 ], [ 1 , 0 , 0 , 0 , 1 , 0 ], [ 0 , 1 , 1 , 0 , 0 , 0 ] ] >>> k = 8 >>> simulation_aging ( Rs , k ) t | R-биты (0-5) | Счетчики для страниц 0-5 00 | [1, 0, 1, 0, 1, 1] | [10000000, 00000000, 10000000, 00000000, 10000000, 10000000] 01 | [1, 1, 0, 0, 1, 0] | [11000000, 10000000, 01000000, 00000000, 11000000, 01000000] 02 | [1, 1, 0, 1, 0, 1] | [11100000, 11000000, 00100000, 10000000, 01100000, 10100000] 03 | [1, 0, 0, 0, 1, 0] | [11110000, 01100000, 00010000, 01000000, 10110000, 01010000] 04 | [0, 1, 1, 0, 0, 0] | [01111000, 10110000, 10001000, 00100000, 01011000, 00101000]
Обратите внимание, что старение отличается от LRU в том смысле, что старение может отслеживать только ссылки в последней версии.16/32 (в зависимости от размера бит целых чисел процессора) временных интервалов. Следовательно, две страницы могут ссылаться на счетчики 00000000, даже если одна страница ссылалась 9 интервалов назад, а другая 1000 интервалов назад. Вообще говоря, знания использования в течение последних 16 интервалов достаточно для принятия правильного решения о том, какую страницу следует заменить. Таким образом, старение может предложить почти оптимальную производительность за умеренную цену.
Основная идея этого алгоритма — локальность ссылок, как в LRU, но разница в том, что в LDF локальность основана на расстоянии, а не на используемых ссылках. В LDF замените страницу, которая находится на самом большом расстоянии от текущей страницы. Если две страницы находятся на одинаковом расстоянии, то будет заменена страница, которая находится рядом с текущей страницей в антитактовой ротации. [ необходима цитата ]
Многие из рассмотренных выше методов предполагают наличие бита ссылки, связанного с каждой страницей. Некоторое оборудование не имеет такого бита, поэтому для его эффективного использования требуются методы, которые хорошо работают без него.
Одним из ярких примеров является оборудование VAX , работающее под управлением OpenVMS . Эта система знает, была ли изменена страница, но не обязательно, была ли она прочитана. Ее подход известен как вторичное кэширование страниц. Страницы, удаленные из рабочих наборов (обычно это частная память процесса), помещаются в специальные списки, оставаясь в физической памяти в течение некоторого времени. Удаление страницы из рабочего набора технически не является операцией по замене страницы, но фактически идентифицирует эту страницу как кандидата. Страница, резервное хранилище которой все еще действительно (чье содержимое не является загрязненным или иным образом не нуждается в сохранении), помещается в конец списка свободных страниц. Страница, требующая записи в резервное хранилище, будет помещена в список измененных страниц. Эти действия обычно запускаются, когда размер списка свободных страниц падает ниже регулируемого порогового значения.
Страницы могут быть выбраны для удаления рабочего набора по существу случайным образом, с ожиданием того, что если будет сделан неудачный выбор, будущая ссылка может извлечь эту страницу из списка свободных или измененных, прежде чем она будет удалена из физической памяти. Страница, на которую ссылаются таким образом, будет удалена из списка свободных или измененных и помещена обратно в рабочий набор процесса. Список измененных страниц дополнительно предоставляет возможность записывать страницы в резервное хранилище группами по более чем одной странице, что повышает эффективность. Затем эти страницы можно поместить в список свободных страниц. Последовательность страниц, которая прокладывает свой путь к началу списка свободных страниц, напоминает результаты механизма LRU или NRU, а общий эффект имеет сходство с алгоритмом Second-Chance, описанным ранее.
Другой пример используется ядром Linux на ARM . Недостаток аппаратной функциональности компенсируется предоставлением двух таблиц страниц — собственных таблиц страниц процессора, без ссылочных битов и грязных битов , и поддерживаемых программным обеспечением таблиц страниц с необходимыми битами. Эмулированные биты в поддерживаемой программным обеспечением таблице устанавливаются ошибками страниц. Чтобы получить ошибки страниц, очистка эмулированных битов во второй таблице отменяет некоторые права доступа к соответствующей странице, что реализуется путем изменения собственной таблицы.
Linux использует унифицированный кэш страниц для
mmap
ed -регионы. Сюда входят куча и стек программ пользовательского пространства . Он пишется для подкачки при выгрузке.mmap
ed-регионы. Если они присутствуют в памяти и не изменены в частном порядке, физическая страница используется совместно с файловым кэшем или буфером.shm_open
.Унифицированный кэш страниц работает с блоками наименьшего размера страницы, поддерживаемого ЦП (4 КиБ в ARMv8 , x86 и x86-64 ), с некоторыми страницами следующего большего размера (2 МиБ в x86-64 ), которые Linux называет «огромными страницами». Страницы в кэше страниц делятся на «активный» и «неактивный» наборы. Оба набора хранят список LRU страниц. В базовом случае, когда к странице обращается программа пользовательского пространства, она помещается в заголовок неактивного набора. Когда к ней обращаются повторно, она перемещается в активный список. Linux перемещает страницы из активного набора в неактивный набор по мере необходимости, так что активный набор становится меньше неактивного набора. Когда страница перемещается в неактивный набор, она удаляется из таблицы страниц любого адресного пространства процесса, не выгружая ее из физической памяти. [22] [23] Когда страница удаляется из неактивного набора, она выгружается из физической памяти. Размер списка «активных» и «неактивных» можно запросить в /proc/meminfo
полях «Активный», «Неактивный», «Активный(анон)», «Неактивный(анон)», «Активный(файл)» и «Неактивный(файл)».
Рабочий набор процесса — это набор страниц, которые, как ожидается, будут использоваться этим процессом в течение некоторого интервала времени.
«Модель рабочего набора» не является алгоритмом замены страниц в строгом смысле (на самом деле это своего рода среднесрочный планировщик ) [ необходимо разъяснение ]