Открыть сервис

Алгоритм LRU

Алгоритм LRU (Least Recently Used, англ. «наименее недавно использовавшийся») — это алгоритм замещения кэша или страниц виртуальной памяти, который при необходимости освобождения места удаляет из него элемент, к которому дольше всего не было обращений. Принцип работы основан на предположении, что данные, к которым обращались недавно, с высокой вероятностью будут запрошены снова, а данные, не использовавшиеся долгое время, менее актуальны. LRU относится к семейству алгоритмов вытеснения с политикой «наименее недавно использованный» и широко применяется в операционных системах, системах управления базами данных (СУБД), веб-браузерах и процессорах для повышения производительности.

Принцип работы

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

Основные операции:

LRU является детерминированным: порядок вытеснения строго определён историей обращений. В идеальной реализации для каждого элемента должно храниться либо временное значение (счётчик или глобальный тик), либо порядок в списке.

Разновидности и реализации

LRU может быть реализован различными способами, отличающимися по сложности и производительности.

Аппаратные и программные реализации

Псевдо-LRU (PLRU)

Из-за сложности точного LRU в аппаратуре (особенно в кэшах процессоров) часто применяются приближённые варианты — pseudo-LRU (PLRU). Он хранит не полную историю доступа, а лишь некоторую информацию о том, какой набор элементов использовался недавно. Распространённый вариант — дерево битов доступа (tree-based PLRU), где каждый узел бинарного дерева хранит бит, указывающий, с какой ветви был последним доступ. При вытеснении обход начинается по указаниям битов, что позволяет выбрать кандидата за O(log n) операций. PLRU обеспечивает поведение, близкое к LRU, но с меньшими аппаратными затратами.

Применение

Операционные системы

В подсистеме управления памятью (MMU) операционных систем LRU используется для замещения страниц виртуальной памяти при нехватке физической памяти (подкачка). Например, ядро Linux использует алгоритм, напоминающий LRU, но с двухуровневой структурой страничных списков (активный и неактивный списки), который реализует приближение LRU. Реализация точного LRU для страниц памяти была бы слишком затратной, так как требуется обрабатывать каждую страницу при каждом доступе (что нарушило бы производительность).

Кэш-память процессоров

Алгоритмы замещения в кэш-памяти (L1, L2, L3) обычно реализуют PLRU или более простые политики (случайное, FIFO) из-за требований по скорости и площади на кристалле. Однако в некоторых современных процессорах (например, Intel Core) используются варианты LRU или PLRU с древовидным битом для каждого набора (set). В процессорах архитектуры x86-64 часто применяется алгоритм «NRU» (Not Recently Used) — упрощённая версия, где каждый элемент имеет флаг «использован», сбрасываемый периодически.

Базы данных

В СУБД (например, PostgreSQL, MySQL) буферный кэш страниц (буферный пул) часто использует политику LRU или его модификации. Это необходимо, чтобы уменьшить количество операций ввода-вывода с диском, сохраняя в памяти наиболее часто используемые страницы. В PostgreSQL используется алгоритм «часы» (clock sweep) — вариант LRU, реализованный с помощью кольцевого буфера и флага «использован» (аналог «дополнительный бит»). Позволяет избежать перемещения элементов в списке при каждом доступе, что снижает накладные расходы.

Веб-браузеры

Браузеры (Google Chrome, Mozilla Firefox, Safari) используют LRU для управления кэшем веб-страниц и изображений. Когда достигнут лимит кэша (например, 1 ГБ на диске), удаляются самые старые по последнему использованию файлы. Однако браузеры также применяют смешанные стратегии: например, приоритизация ресурсов с учётом размера файла и времени загрузки.

Системы управления содержимым (CMS)

Кэширование результатов запросов к базе данных часто реализуется через LRU, чтобы наиболее популярные страницы загружались быстрее. Пример: кэш WordPress (Object Cache) использует LRU для хранения объектов данных.

Преимущества и недостатки

Преимущества

Недостатки

Альтернативы и усовершенствования

Интересные факты

Источники

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →