Огляд механізмів віртуальної пам'яті windows (продовження огляд virtual address space)

У моїй попередній статті згадувалося, що ділянки VAS можуть бути негайно прив'язані до фізичної пам'яті або після використання VirtualAlloc API. Як і більшість операційних систем, Windows здійснює прив'язку фізичної пам'яті на вимогу, при першому зверненні до сторінки на ділянці VAS (це поведінка трохи відрізняється від тих випадків, коли Ви не використовуєте файл підкачки, і сторінка VAS негайно прив'язується до сторінки фізичної пам'яті). Одночасно прив'язується тільки одна сторінка. Коли перше звернення до пам'яті йде від апаратних засобів, генерується виняток, зване відсутністю сторінки. Виняток обробляється Windows і операційна система перевіряє, чи був закріплений поточний ділянку VAS, використовуючи для цього відповідну цій ділянці структуру - Virtual Address Descriptor (VAD). Якщо ділянка закріплений, і до нього відбувається перше звернення, операційна система знайде в оперативній пам'яті фізичну сторінку, яку можна для цього використовувати (варто мати на увазі, що ця сторінка буде попередньо заповнена нулями, перш ніж вона буде задіяна, що обумовлено міркуваннями безпеки) . Нарешті, після цього буде виконана прив'язка ділянки VAS на сторінку, яка буде заповнена відповідними структурами даних, і ця інформація буде завантажена в процесор, що б продовжити роботу з того моменту, коли було виявлено відсутність сторінки.

Через недостатність оперативної пам'яті Windows може прийняти рішення відібрати фізичні сторінки у процесу. Використовуючи політику самостійного виправлення, операційна система буде відшукувати вільні сторінки. Для цього вона перевіряє, чи присутній актуальний образ сторінки в файлі підкачки на диску, і при необхідності ініціює перегортання для сторінки, що б перемістити її в файл підкачки. Як тільки сторінка потрапить на диск, операційна система зможе так налаштувати необхідні структури даних, щоб при наступному зверненні до сторінки було відомо, де її знайти. Після цього, фізична сторінка заповнюється нулями і відзначається в списку вільних сторінок, який використовується для подальших запитів пам'яті.

Використовуваний в Windows механізм віртуальної пам'яті дозволяє відображати в різний час одні і ті ж фізичні сторінки на різні VAS в різних місцях. Фізичні сторінки, які можуть бути відображені тільки на єдине VAS, називаються приватними (private physical pages), тому що вони не можуть розділяться між декількома VAS. Фізичні сторінки, які одноразово відображаються на кілька VAS, називаються розділяються фізичними сторінками (shared physical pages).

Всі закріплені за допомогою інтерфейсів VirtualAlloc * ділянки VAS прив'язані до тих фізичним сторінок, які не можуть бути розділені між різними VAS. Їх можна вважати приватними фізичними сторінками. Суму всіх приватних фізичних сторінок в оперативній пам'яті і на диску називають приватними байтами (private bytes), якщо використовують термінологію Системного Монітору, або розміром віртуальної (виділяється) пам'яті, згідно з термінологією Диспетчера Завдань. Суму всіх приватних фізичних сторінок, які розташовуються в оперативній пам'яті, називають робочим безліччю, яке відображається у вигляді значення "Виділення пам'яті" (Memory Usage) в рядку стану Диспетчера Завдань.

Як я згадував раніше, залежність Windows від потреби у фізичній пам'яті призводить до того, що операційна система може вилучати фізичні сторінки з робочого безлічі процесу. Зазвичай це проявляється у вигляді перегортання. Операційна система має можливість запобігти перегортання цих ділянок VAS. За це відповідає механізм блокування ділянок VAS в фізичної оперативної пам'яті. Як Ви могли здогадатися, додаток, яке пробує блокувати свої ділянки VAS, може дестабілізувати всю систему. Щоб згладити цей ефект, в Windows привілей "Lock pages in memory" за замовчуванням вимкнена, через що тільки ті додатки, яким адміністратором дано на це дозвіл, можуть блокувати сторінки в пам'яті. Крім того, операційна система має можливість, у разі необхідності, піддати листанню робоче безліч процесу цілком.

Деяким призначеним для користувача додатків необхідно мати VAS більше ніж 2 Гб. У Windows є можливість збільшити VAS для призначеного для користувача додатки до 3 Гб. Цей режим має серйозний недолік. У такому режимі буде обмежений до 1 Гб доступний ядру обсяг VAS. Збільшення розміру VAS для користувача можна додавши ключ / 3GB в файл boot.ini. Після внесення таких змін необхідне перезавантаження системи.

Обмеження VAS для ядра до 1 Гб впливає на весь комп'ютер, а не тільки на додаток, з яким потрібен великий обсяг VAS. Наприклад, установка ключа / 3GB впливає на розмір доступний операційного системі обсягу пам'яті, якщо включений режим PAE, то він знижується з 64 Гб до 16 Гб. Ключ / 3GB впливаєте на всі компоненти ядра, включаючи всі драйвери. Включення / 3GB може викликати такі негативні ефекти, як зниження продуктивності і відмови розподілу пам'яті з зупинкою системи. Моя думка - потрібно уникати використання ключа / 3GB, якщо в цьому немає великої необхідності.

AWE API може використовуватися навіть на комп'ютерах з пам'яттю меншою обсягу VAS процесу. Насправді, AWE можна використовувати для того, щоб позбутися від будь-якого типу перегортання (згадайте, що при блокуванні сторінок в пам'яті з використанням механізмів VirtualLock, у Windows ще залишається можливість піддати листанню цілком весь процес). При використанні ж AWE механізму, операційна система не зможе ніяк втрутитися. Така гнучкість створює деякі труднощі. Неправильне використання AWE механізму може привести до зупинки всього комп'ютера, подолати яку можна буде тільки шляхом перезавантаження.

Кожен процес має свою власну область VAS.

Розробники часто не враховують особливості VAS.

VAS є обмеженим ресурсом, навіть на 64 - бітної платформі.

Windows управляє VAS точно так же, як управляється хіп (динамічна пам'ять).