У інформатиці помилка сторінки () — це виняток, який генерує модуль керування пам'яттю (MMU), коли процес звертається до сторінки пам'яті без належної підготовки. Для доступу до сторінки необхідно додати відповідне відображення до віртуального адресного простору процесу. Крім того, фактичний вміст сторінки може знадобитися завантажити з резервного сховища, наприклад із диска. MMU виявляє помилку сторінки, але ядро операційної системи обробляє цей виняток, роблячи необхідну сторінку доступною у фізичній пам'яті або забороняючи незаконний доступ до пам'яті.
Допустимі помилки сторінок є поширеними та необхідними для збільшення обсягу пам'яті, доступного програмам, у будь-якій операційній системі, що використовує віртуальну пам'ять, такій як Microsoft Windows і macOS.
Типи Незначна помилка сторінки
Якщо на момент виникнення помилки сторінка вже завантажена в пам'ять, але в модулі керування пам'яттю (MMU) не позначена як завантажена в пам'ять, то така помилка називається незначною або м'якою помилкою сторінки. Обробнику помилки сторінки в операційній системі достатньо зробити так, щоб запис для цієї сторінки в MMU вказував на сторінку в пам'яті, і позначити сторінку як завантажену в пам'ять; читати сторінку в пам'ять не потрібно. Таке може статися, якщо пам'ять є спільною для різних програм і сторінка вже була завантажена в пам'ять для іншої програми.
Значна помилка сторінки
Це механізм, який операційна система використовує для збільшення доступного обсягу пам'яті програми за потреби. Операційна система відкладає завантаження частин програми з диска доти, доки програма не спробує їх використати, унаслідок чого виникають помилки сторінок. Якщо на момент виникнення помилки сторінка не завантажена в пам'ять, то помилка є значною або жорсткою. Обробник помилки сторінки в ОС повинен завантажити сторінку в робочу пам'ять, а для цього він має вибрати місце: або вільну сторінку, або, якщо вільного простору недостатньо, сторінку, яку використовує інший процес. В останньому випадку ОС повинна записати дані цієї сторінки в зовнішнє сховище (якщо вони не були записані туди після останньої зміни) і позначити цю сторінку як відсутню в пам'яті в таблиці сторінок процесу. Після звільнення таким чином місця ОС зчитує дані нової сторінки в пам'ять, додає запис про її розташування до блока керування пам'яттю та позначає сторінку як завантажену. Отже, значні помилки сторінок є дорожчими за незначні та додають затримку доступу до сховища під час виконання перерваної програми.
Помилка недійсної сторінки
Якщо помилка сторінки виникає під час звернення до адреси, яка не належить до віртуального адресного простору, тобто для неї не може існувати відповідної сторінки в пам'яті, то така помилка називається помилкою недійсної сторінки. Обробник помилки сторінки в операційній системі зазвичай передає процесу, який спричинив помилку, помилку сегментації, повідомляючи, що звернення було недійсним; зазвичай це призводить до аварійного завершення коду, який здійснив недійсне звернення. Нульовий вказівник зазвичай представлений як вказівник на адресу 0 в адресному просторі; багато операційних систем налаштовують MMU так, щоб сторінка, яка містить цю адресу, позначалася як відсутня в пам'яті, і не включають цю сторінку до віртуального адресного простору. Завдяки цьому спроби прочитати або записати пам'ять, на яку посилається нульовий вказівник, спричиняють помилку недійсної сторінки.
Недійсні умови
Незаконні звернення та недійсні помилки сторінок можуть призвести до помилки сегментації або помилки шини, що спричиняє аварійне завершення роботи програми або ОС. Причиною таких проблем часто є програмна помилка, але апаратні помилки пам'яті, наприклад спричинені розгоном, можуть пошкодити вказівники та призвести до відмови коректного коду.
Операційні системи використовують різні механізми для повідомлення про помилки сторінок. Microsoft Windows використовує структуровану обробку винятків для повідомлення про помилки недійсних сторінок як винятки порушення доступу. Unix-подібні системи зазвичай використовують сигнали, такі як SIGSEGV, для повідомлення програмам про такі помилки. Якщо програма, яка отримала помилку, не обробляє її, операційна система виконує стандартну дію, зазвичай завершуючи процес, який спричинив помилковий стан, і повідомляючи користувача про несправність програми. Windows часто повідомляє про такі аварійні завершення без наведення подробиць. Досвідчений користувач може отримати детальну інформацію за допомогою WinDbg та мінідампа, який Windows створює під час аварійного завершення. Unix-подібні операційні системи повідомляють про такі стани такими повідомленнями про помилки, як «порушення сегментації» або «помилка шини», і можуть створювати дамп пам'яті.
Вплив на продуктивність
Помилки сторінок погіршують продуктивність системи та можуть спричиняти трешинг. Значні помилки сторінок на звичайному комп'ютері, що використовує жорсткий диск, можуть мати значний вплив на продуктивність, оскільки типовий жорсткий диск має середню затримку обертання 3 мс, час пошуку 5 мс і час передавання 0,05 мс на сторінку. Отже, загальний час операції підкачування становить близько 8 мс (8000 мкс). Якщо час доступу до пам'яті становить 0,2 мкс, то помилка сторінки збільшить тривалість операції приблизно у 40 000 разів. У сучаснішій системі зі швидким твердотільним накопичувачем, із затримкою читання сторінки 0,030 мс (30 мкс) і затримкою доступу до пам'яті 70 нс (0,070 мкс), жорстка помилка сторінки все одно займає більш ніж у 400 разів більше часу.
Оптимізація продуктивності програм або операційних систем часто передбачає спроби зменшити кількість помилок сторінок шляхом зменшення загального використання пам'яті або покращення локальності пам'яті. Щоб мінімізувати кількість помилок сторінок, розробники ОС використовують відповідний алгоритм заміщення сторінок, який максимізує кількість влучань у сторінки. Було запропоновано багато таких алгоритмів, наприклад із використанням евристичних алгоритмів для зменшення частоти виникнення помилок сторінок.
Більший обсяг фізичної пам'яті також зменшує ймовірність виникнення помилок сторінок. Частини відображених у пам'ять файлів, можуть довше залишатися в пам'яті, уникаючи повільного повторного читання зі сховища. Аналогічно, більший обсяг пам'яті зменшує потребу в частому вивантаженні сторінок пам'яті до пристрою резервного сховища.
Див. також Аномалія Беладі Ієрархія пам'яті
Примітки
Посилання "So What Is A Page Fault?" from OSR Online (a Windows-specific explanation) "Virtual Memory Details" from the Red Hat website. "UnhandledExceptionFilter (Windows)" from MSDN Online. "Page fault overhead" for information about how page faults can crucially affect processing time.