Блокування сторінок у пам’яті



Як і в Linux, у Windows XP можна блокувати сторінки у пам’яті з коду режиму користувача. Для цього використовують функції Win32 API VirtualLock() і VirtualUnlock(). Відповідні сторінки мають бути до цього часу підтверджені.

SYSTEMINFO info; GetSystemInfo(&info);

DWORD pagesize = info.dwPageSize;

//резервування і підтвердження сторінки

char *pageaddr = (char *)VirtualAlloc(NULL.

pagesize. MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);

//блокування сторінки у пам’яті

VirtualLock(pageaddr, pagesіze);

// ... розблокування

VirtualUnlockCpageaddr, pagesize):

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

Висновки

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

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


Динамічний розподіл пам’яті

· Принципи функціонування розподілювачів пам’яті

· Організація списків вільних блоків

· Системи двійників

· Посилання та збирання сміття

· Динамічний розподіл пам’яті в Linux та Windows

Динамічний розподіл пам’яті – це розподіл за запитами процесів користувача або ядра під час їхнього виконання. Розрізняють динамічне виділення та динамічне вивільнення пам’яті. Прикладом бібліотечної та мовної підтримки засобів динамічного розподілу пам’яті є функції malloc(), free() і realloc() бібліотеки мови С, оператори new і delete в C++. Усі ці засоби спираються на підтримку з боку операційної системи.

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

З іншого боку, деякі з цих алгоритмів можна використати для реалізації розподілу не тільки логічної, але й неперервної фізичної пам’яті, зокрема й для потреб ядра системи. У цьому розділі йтиметься саме про такі алгоритми на прикладах динамічного розподілу пам’яті ядром Linux і Windows XP.

Динамічна ділянка пам’яті процесу

Динамічна ділянка пам’яті процесу відображає спеціальну частину його адресного простору, у якій відбувається розподіл пам’яті за запитами з його коду (подібно до виклику mallос() для виділення пам’яті або free() для її вивільнення). Такий розподіл пам’яті відбувається в режимі користувача, звичайно в коді системних бібліотек (цей розподіл відбувається всередині динамічної ділянки, і ядро в ньому участі не бере).

Такі операції у більшості випадків не ведуть до зміни розмірів динамічної ділянки, але якщо така зміна необхідна (наприклад, якщо вільного місця в динамічній ділянці не залишилося), ОС пропонує для цього спеціальний системний виклик. В UNIX-системах його зазвичай називають brk(). Його пряме використання у прикладних програмах не рекомендоване, хоч і можливе.

Динамічний розподіл пам’яті відбувається на двох рівнях. Спочатку ядро резервує динамічну ділянку пам’яті процесу за системним викликом brk(). Потім усередині цієї ділянки процеси користувача можуть розподіляти пам’ять, викли­каючи стандартні функції типу mallос() і free(). У разі потреби динамічну ділянку можна розширювати далі або скорочувати (знову-таки за допомогою виклику brk()).


Дата добавления: 2018-04-05; просмотров: 469; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!