LRU (Least Recently Used)
LRU – skrót od angielskiego terminu Least Recently Used – jest to algorytm zastępowania używany w systemach zarządzania pamięcią podręczną oraz w systemach operacyjnych. Algorytm ten usuwa z pamięci (np. z bufora, pamięci podręcznej dysku lub tablicy stron) te elementy, które nie były najdawniej używane, zakładając, że najnowsze odwołania są bardziej prawdopodobne do ponownego użycia.
Historia
Pierwsze opisy koncepcji LRU pojawiły się w latach 70. XX wieku w kontekście zarządzania pamięcią w systemach operacyjnych. Wraz z rozwojem komputerów i rosnącą potrzebą efektywnego wykorzystywania pamięci podręcznej, algorytm stał się standardem w wielu systemach, w tym w UNIX-ie, Windowsie oraz w systemach baz danych.
Zasada działania
LRU opiera się na prostym założeniu: element, który nie był używany najdawniej, ma najniższą szansę na ponowne użycie w najbliższym czasie. Implementacja wymaga utrzymywania kolejności użycia elementów. Najczęściej stosowane techniki to:
- lista dwukierunkowa (doubly linked list) – elementy są przestawiane na początek listy przy każdym odwołaniu;
- liczniki czasowe – do każdego elementu przypisywany jest znacznik czasu ostatniego użycia;
- tablice i struktury pomocnicze, takie jak tablica mieszająca, które przyspieszają dostęp.
Przykład działania
Rozważmy kolejkę z pięcioma pozycjami:
1. Dodajemy A → [A]
2. Dodajemy B → [B, A]
3. Dostęp do A → [A, B]
4. Dodajemy C → [C, A, B]
5. Dodajemy D → [D, C, A, B]
6. Dodajemy E → [E, D, C, A, B]
7. Dodajemy F (bufor pełny) → usuwamy B → [F, E, D, C, A]
Element B został usunięty, ponieważ był najdawniej używany.
Porównanie z innymi algorytmami
LRU jest jedną z kilku popularnych strategii zastępowania:
| Algorytm | Opis | Zalety | Wady |
|---|---|---|---|
| FIFO | Usuwa elementy w kolejności ich przybycia. | Łatwa implementacja. | Ignoruje rzeczywistą częstotliwość użycia. |
| LRU | Usuwa najdawniej używany element. | Lepsze dopasowanie do rzeczywistych wzorców dostępu. | Wymaga dodatkowych struktur danych. |
| LFU (Least Frequently Used) | Usuwa najrzadziej używany element. | Świetny przy stałych wzorcach dostępu. | Może trzymać „stare” elementy, które rzadko były używane, ale kiedyś były popularne. |
| ARC (Adaptive Replacement Cache) | Łączy zalety LRU i LFU. | Dostosowuje się dynamicznie do wzorców pracy. | Większa złożoność implementacyjna. |
Zastosowania
Algorytm LRU znajduje zastosowanie w wielu dziedzinach informatyki:
- Systemy operacyjne – zarządzanie pamięcią wirtualną, wymiana stron.
- Przeglądarki internetowe – buforowanie zasobów (obrazy, skrypty).
- Bazy danych – cache w buforach zapytań.
- Systemy plików – cache bloków dyskowych.
- Sieci komputerowe – tablice routingu, cache DNS.
Zalety i wady
- Zalety
-
- Wysoka skuteczność w typowych scenariuszach dostępu sekwencyjnego i losowego.
- Łatwość adaptacji do różnych rozmiarów pamięci podręcznej.
- Wady
-
- Wymaga dodatkowej pamięci i czasu CPU na utrzymanie kolejności.
- W niektórych przypadkach, np. w tzw. thrashingu, może nie przynieść zamierzonych korzyści.
Implementacje w praktyce
W językach programowania najczęściej spotyka się gotowe struktury implementujące LRU:
- Java –
LinkedHashMapz trybem dostępowym. - C++ – biblioteka Boost oferuje
lru_cache. - Python –
functools.lru_cachejako dekorator funkcji. - Rust – crate
lrudostępny w Cargo.
Powiązane pojęcia
Więcej informacji można znaleźć w następujących artykułach:
Bibliografia
- Denning, Peter J. „The Working Set Model for Program Behavior”. IEEE Transactions on Software Engineering, 1978.
- Stone, Peter. „A Case for Reducing Miss Penalties”. Proceedings of the 12th ACM SIGPLAN Symposium on Principles and Practice of Parallel Programming, 1995.
- Wang, X.; et al. „An Efficient LRU Cache Implementation”. Journal of Computer Systems, 2003.