ГоловнаСтаттіРозповсюджені системи

Політики заміни сторінок: FIFO, LRU, Clock та Оптимальна

Аномалія Беладі, чому LRU є стековим алгоритмом, як алгоритм Clock дешево наближає LRU, і чому збої потребують контролю прийому, а не розумнішої політики.

mysimulator teamОновлено — червень 2026≈ 8 хв читання▶ Відкрити симуляцію

Чому пам’яті потрібна політика виключення

Віртуальна пам'ять дозволяє процесу адресувати більше пам’яті, ніж фізично існує, зберігаючи лише найбільш часто використовувані сторінки в оперативній пам’яті (RAM), а решту на диску. Коли процес звертається до сторінки, яка не знаходиться в RAM, відбувається помилка сторінки, і якщо всі фрейми вже заповнені, операційна система повинна виключити одну з них, щоб звільнити місце. Яку саме сторінку виключити – це ключове питання – і якщо виключити неправильну, програма негайно знову дасть помилку, щоб повернути її в RAM, що призведе до втрати дискового доступу, який може бути у п’ять разів повільнішим, ніж доступ до пам’яті.

жива демонстрація · пов'язана симуляція● LIVE

FIFO та аномалія Беладі

Найпростіша політика, FIFO, виганяє сторінку, яка перебувала в пам’яті найдовше, незалежно від того, чи використовувалася вона щойно. Це дешево — просто черга — але повністю ігнорує локальність звернення та має відому патологію: аномалію Беладі, виявлену Ласлом Беладі в 1969 році, де додавання більшої кількості фізичних кадрів може збільшити кількість помилок заміни сторінок для одного і того ж ряду звернень під FIFO. Оптимальні, LRU та інші політики належать до класу алгоритмів стеку, які доведено не можуть проявляти цю аномалію — множина сторінок, що перебуває в пам’яті з k кадрами, завжди є підмножиною множини сторінок, що перебувають у пам’яті з k+1 кадрами — але FIFO не є алгоритмом стеку, тому більше пам’яті може, контрінтуїтивно, зробити його повільнішим.

reference string: 1 2 3 4 1 2 5 1 2 3 4 5
FIFO, 3 frames  -> 9 faults
FIFO, 4 frames  -> 10 faults   (Bélády's anomaly: more RAM, more faults)

LRU: практичний стандарт

Найменш нещойно використаний (LRU) вимикає сторінку, яка не торкалася найдовше, на основі припущення, що нещодавній доступ передбачає майбутній доступ – принцип локальності, який майже всі реальні робочі навантаження демонструють. LRУ є стековальною алгоритмою, тому ніколи не страждає від аномалії Беладі, і емпірично він тісно слідує за оптимальною політикою для типових програм. Його проблема полягає в вартості: точний LRU потребує позначки часу або відсортованого списку, оновленого на кожному доступі до пам’яті, що надзвичайно дорого коштує реалізації апаратно чи програмно на повній швидкості доступу до пам'яті.

Алгоритм Годинки приблизно імітує LRU недорожче

Майже кожна виробнича ядрова система використовує алгоритм Годинки (також відомий як другий шанс): кожен кадр сторінки містить один апаратне засоблений біт посилання, встановлений у 1 при доступі сторінки. Рука обертається циклично по кадрах; при виникненні несправності він перевіряє кадр під рукою — якщо біт посилання дорівнює 1, він очищає біт і дає сторінці другий шанс, переходячи до наступного кадру; якщо біт вже дорівнює 0, ця сторінка виселяється. Це коштує один біт на кадр та O(1) середньозважену роботу за несправність, і його поведінка досить добре приблизно імітує LRU, щоб різниця в коефіцієнті несправностей зазвичай була невеликою.

// Clock / second-chance
while (true) {
  const p = frames[hand];
  if (p.referenceBit === 0) { evict(p); frames[hand] = newPage; break; }
  p.referenceBit = 0;              // give it a second chance
  hand = (hand + 1) % frames.length;
}

Белядова Оптимальна (MIN) як недосяжний бенчмарк

Алгоритм Белядова оптимального (MIN) виводить будь-яку життєву сторінку, яка буде залучена найдалі в майбутньому – або взагалі більше. Він доводимо зменшує кількість помилок заміни для будь-якої послідовності звернень, що робить його мірним покатником, проти якої вимірюють усі реальні політики. Його неможливо реалізувати онлайн, оскільки він потребує знання майбутніх звернень, але його легко обчислити офлайн для відомого трасування, і його кількість помилок дорівнює кількості, яку намагаються досягти всі практичні алгоритми.

Збій (Thrashing)

Коли сума робочих налаштувань процесів перевищує фізичну пам’ять, система переходить у режим збію: сторінки виганяються та негайно повторно виникають (refault), використання ЦП падає, оскільки процеси майже весь час чекають на диску, і додавання більшої кількості процесів робить ситуацію ще гіршою, а не кращою. Виправленням є не більш розумна політика заміни, а контроль над прийомом процесів – модель робочого налаштування або моніторинг частоти виникнення помилок, які призупиняють процеси дотиків, поки достатньо пам’яті не буде доступно для запуску решти набору без постійних виникнень помилок.

Frequently asked questions

Що таке аномалія Беладі?

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

Чому кожна ОС просто не реалізує справжній LRU?

Точний LRU вимагає оновлення відсордованого запису кожного окремого доступу пам'яті, що надто повільно для виконання на швидкості пам’яті на загальному призначенні обладнання. Алгоритм 'Годинникар' (другий шанс) приблизно його імітує за допомогою одного апаратного біта на фрейм та переміщувального покажчика, отримуючи більшу частину переваг LRU при незначному відношенні до вартості.

Що викликає «збої» (thrashing) і як це виправити?

«Збої» виникають, коли сукупний розмір робочих наборів занадто багатьох процесів перевищує фізичну пам’ять, тому сторінки виганяються та майже миттєво повторно завантажуються в цикл, а час ЦП майже повністю витрачається на очікування диска замість корисної роботи. Жодна політика заміни не вирішує цю проблему — ОС повинна зменшити ступінь мультипрограмування, призупиняючи деякі процеси до тих пір, поки решта комфортно не поміститься в пам’яті.

Спробуйте наживо

Усе, що вище, працює прямо у вашому браузері — відкрийте Page Replacement і змінюйте параметри під час роботи. Нічого не встановлюється, нічого не завантажується на сервер, уся модель живе в одній вкладці.

▶ Відкрити симуляцію Page Replacement

Що ви знайшли?

Додати кроки відтворення (опційно)