Поняття пробуксовування

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

Пробуксовування виникає тоді, коли процес часто вивантажує із пам’яті сторінки, які йому незабаром знову будуть потрібні. У результаті більшу частину часу такі процеси перебувають у призупиненому стані, очікуючи завершення операції введення-виведення для читання сторінки із диска. Отож, на додачу до пам’яті, за розміром порівнянної із диском, отримують пам’ять, порівнянну із диском і за часом доступу.

Назвемо деякі причини пробуксовування.

Процес не використовує пам’ять повторно (для нього не працює правило «дев’яносто до десяти»).

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

Запущено надто багато процесів, тому їхня сумарна резидентна множина не поміщається у фізичній пам’яті.

У перших двох випадках ситуація майже не піддається виправленню, найкраща порада, яку тут можна дати, – це збільшити обсяг фізичної пам’яті. У третьому випадку ОС може почати такі дії: з’ясувати, скільки пам’яті необхідно кожному процесові, і змінити пріоритети планування так, щоб процеси ставилися на виконання групами, вимоги яких до пам’яті можуть бути задоволені; заборонити або обмежити запуск нових процесів.

9.7.2. Локальність посилань

Можна створити таку програму, яка постійно звертатиметься до різних сторінок, розкиданих великим адресним простором, генеруючи багато сторінкових переривань. Насправді реальні застосування працюють не так: вони зберігають локальність посилань (locality of reference), коли на різних етапах виконання процес посилається тільки на деяку невелику підмножину своїх сторінок, що є одним із наслідків відомого правила «дев’яносто до десяти».

Набір сторінок, які активно використовуються разом, називають локальністю (locality). Кажуть, що процес під час свого виконання переміщується від локальності до локальності. Так, у разі виклику функція визначає нову локальність, де будуть посилання на інструкції, локальні змінні та підмножину глобальних змінних. Після виходу із функції її локальність більше не використовують (хоча можна це зробити в майбутньому, якщо функція буде викликана знову). Отже, локальності визначає структура програми та її даних.

Якщо виділено достатньо пам’яті для всіх сторінок поточної локальності, сторінкові переривання до переходу до наступної локальності не генеруватимуться. Якщо пам’яті недостатньо, система перебуватиме у стані пробуксовування.

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