НОУ ІНТУІТ, Лекція, Управління пам’яттю
Віртуальна пам'ять
Всім процесам в операційній системі Windows надається найважливіший ресурс - віртуальна пам'ять (virtual memory). Усі дані, з якими процеси безпосередньо працюють, зберігаються саме у віртуальній пам'яті.
Введення віртуальної пам'яті, по-перше, дозволяє прикладним програмістам не займатися складними питаннями реального розміщення даних у пам'яті, по-друге, дає можливість операційній системі запускати кілька процесів одночасно, оскільки замість дорогого обмеженого ресурсу – оперативної пам'яті, використовується дешева та велика за ємністю зовнішня пам'ять.
Реалізація віртуальної пам'яті у Windows

Віртуальна пам'ять поділяється на блоки однакового розміру – віртуальні сторінки. У Windows сторінки бувають великі (x86 – 4 МБ, x64 – 2 МБ) та малі (4 КБ). Фізична пам'ять (ОЗУ) також ділиться на сторінки такого самого розміру, як і віртуальна пам'ять. Загальна кількість малих віртуальних сторінок процесу в 32 розрядних системах дорівнює 1048576 (4 ГБ / 4 КБ = 1048576).
Зазвичай процеси задіяють не весь обсяг віртуальної пам'яті, а лише невелику частину. Відповідно, немає сенсу (і, часто, можливості) виділяти сторінку у фізичної пам'яті кожної віртуальної сторінки всіх процесів. Натомість у ОЗП (кажуть, "резидентно") знаходиться обмежена кількість сторінок, які безпосередньо необхідні процесу. Таке підмножина віртуальних сторінок процесу, розміщених у фізичній пам'яті, називається робочим набором процесу (working set).
Ті віртуальні сторінки, які поки не потрібні процесу, операційна система може вивантажити на диск у спеціальний файл , званий файлом підкачки (page file).
ЯкимЯким чином процес дізнається, де в даний момент знаходиться необхідна сторінка? І тому служать спеціальні структури даних – таблиці сторінок ( page table ).
У ВАП користувача розташовуються виконуваний образ процесу, бібліотеки (DLL, dynamic-link library), що динамічно підключаються, купа процесу і стеки потоків.
При запуску програми створюється процес (див. лекцію 6 "Процеси та потоки"), при цьому в пам'ять завантажуються код і дані програми (виконуваний образ, executable image ), а також необхідні програмі бібліотеки, що динамічно підключаються ( DLL ). Формується купа (heap) - область, в якій процес може виділяти пам'ять динамічним структурам даних (тобто структурам, розмір яких заздалегідь невідомий, а визначається в ході виконання програми). За замовчуванням розмір купи становить 1 МБ, але при компіляції програми або в ході виконання може бути змінений. Крім того, кожному потоку надається стек для зберігання локальних змінних і параметрів функцій, також за замовчуванням розміром 1 МБ.

У системному ВАП розташовані:
- образи ядра (ntoskrnl.exe), виконавчої системи, HAL (hal.dll), драйверів пристроїв, необхідних під час завантаження системи;
- таблиці сторінок процесу;
- системний кеш;
- пул пам'яті, що підкачується (paged pool) - системна купа пам'яті, що підкачується;
- пул пам'яті, що підкачується (nonpaged pool) – системна купа пам'яті, що не підкачується;
- інші елементи (див. [5]).
Виділення пам'яті процесам
Існує кілька способів виділення віртуальної пам'яті процесам за допомогою Windows API 2 Див. 85). Aspx). . Розглянемодва основних способи – за допомогою функції VirtualAlloc та з використанням купи.
WinAPI функція VirtualAlloc для виділення пам'яті використовує функцію ядра NtAllocateVirtualMemory (файл base\ntos\mm\allocvm.c, рядок 173).
2. Для більш гнучкого розподілу пам'яті існує купа процесу, яка керується диспетчером купи (heap manager). Купу використовують WinAPI функція HeapAlloc, а також оператор мови C malloc і оператор C++ new. Диспетчер купи надає можливість процесу виділяти пам'ять з гранулярністю 8 байтів (у 32-розрядних системах), а обслуговування цих запитів використовує самі функції ядра, як і VirtualAlloc.
Для зберігання інформації про стан області пам'яті, яку відповідає дескриптор , у структурі MMVAD міститься поле прапорів VadFlags.