Виштовхування рідко використовуваної сторінки. Алгоритм NFU

Оскільки більшість сучасних процесорів не надають відповідної апаратної підтримки для реалізації алгоритму LRU, хотілося б мати алгоритм, достатньо близький до LRU, але що не вимагає спеціальної підтримки.

Програмна реалізація алгоритму, близького до LRU, - алгоритм NFU(Not Frequently Used).

Для нього потрібні програмні лічильники, поодинці на кожну сторінку, які спочатку дорівнюють нулю. При кожному перериванні за часом (а не після кожної інструкції) операційна система сканує всі сторінки в пам'яті і у кожної сторінки зі встановленим прапором звернення збільшує на одиницю значення лічильника, а прапор звернення скидає.

Таким чином, кандидатом на звільнення виявляється сторінка з найменшим значенням лічильника, як сторінка, до якої найрідше зверталися. Головний недолік алгоритму NFU полягає в тому, що він нічого не забуває. Наприклад, сторінка, до якої дуже часто зверталися протягом деякого часу, а потім звертатися перестали, все одно не буде видалена з пам'яті, тому що її лічильник містить велику величину. Наприклад, в багатопрохідних компіляторах сторінки, які активно використовувалися під час першого проходу, можуть надовго зберегти великі значення лічильника, заважаючи завантаженню корисних надалі сторінок.

На щастя, можлива невелика модифікація алгоритму, яка дозволяє йому "забувати". Достатньо, щоб при кожному перериванні за часом вміст лічильника зрушувався управо на 1 битий, а вже потім проводилося б його збільшення для сторінок зі встановленим прапором звернення.

Іншим, вже стійкішим недоліком алгоритму є тривалість процесу сканування таблиць сторінок.