Ноу Інти, лекція, управління пам'яттю

Віртуальна пам'ять

Всім процесам в операційній системі Windows надається найважливіший ресурс - віртуальна пам'ять (virtual memory). Всі дані, з якими процеси безпосередньо працюють, зберігаються саме в віртуальної пам'яті.

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

Реалізація віртуальної пам'яті в Windows

Ноу Інти, лекція, управління пам'яттю


Мал. 11.1. Реалізація віртуальної пам'яті в 32-розрядних Windows

Віртуальна пам'ять ділиться на блоки однакового розміру - віртуальні сторінки. У Windows сторінки бувають великі (x86 - 4 МБ, x64 - 2 МБ) і малі (4 КБ). Фізична пам'ять (ОЗУ) також ділиться на сторінки точно такого ж розміру, як і віртуальна пам'ять. Загальна кількість малих віртуальних сторінок процесу в 32 розрядних системах дорівнює 1 048 576 (4 ГБ / 4 КБ = 1 048 576).

Зазвичай процеси задіють не весь обсяг віртуальної пам'яті, а тільки невелику його частину. Відповідно, не має сенсу (і, часто, можливості) виділяти сторінку в фізичної пам'яті для кожної віртуальної сторінки всіх процесів. Замість цього в ОЗУ (кажуть, "резидентно") знаходиться обмежена кількість сторінок, які безпосередньо необхідні процесу. Таке підмножина віртуальних сторінок процесу, розташованих у фізичній пам'яті, називається робочим набором процесу (working set).

Ті віртуальні сторінки, які поки не потрібні процесу, операційна система може вивантажити на диск. в спеціальний файл. званий файлом підкачки (page file).

Яким чином процес дізнається, де в даний момент знаходиться потрібна сторінка? Для цього служать спеціальні структури даних - таблиці сторінок (page table).

У призначеному для користувача ВАП розташовуються виконуваний образ процесу, спільні бібліотеки (DLL. Dynamic-link library), купа процесу і стеки потоків.

При запуску програми створюється процес (див. Лекцію 6 "Процеси і потоки"), при цьому в пам'ять завантажуються код і дані програми (виконуваний образ, executable image), а також необхідні програмі спільні бібліотеки (DLL). Формується купа (heap) - область, в якій процес може виділяти пам'ять динамічним структурам даних (т. Е. Структурам, розмір яких заздалегідь невідомий, а визначається в ході виконання програми). За замовчуванням розмір купи становить 1 МБ, але при компіляції програми або в ході виконання процесу може бути змінений. Крім того, кожному потоку надається стек (stack) для зберігання локальних змінних і параметрів функцій, також за замовчуванням розміром 1 МБ.

Ноу Інти, лекція, управління пам'яттю

У системному ВАП розташовані:

  • образи ядра (ntoskrnl.exe), виконавчої системи, HAL (hal.dll), драйверів пристроїв, необхідних при завантаженні системи;
  • таблиці сторінок процесу;
  • системний кеш;
  • пул підкачувати пам'яті (paged pool) - системна купа підкачувати пам'яті;
  • пул підкачувати пам'яті (nonpaged pool) - системна купа неподкачіваемой пам'яті;
  • інші елементи (див. [5]).

Виділення пам'яті процесам

WinAPI функція VirtualAlloc для виділення пам'яті використовує функцію ядра NtAllocateVirtualMemory (файл base \ ntos \ mm \ allocvm.c, рядок 173).

2. Для більш гнучкого розподілу пам'яті існує купа процесу, яка управляється диспетчером купи (heap manager). Купу використовують WinAPI функція HeapAlloc. а також оператор мови C malloc і оператор C ++ new. Диспетчер купи надає можливість процесу виділяти пам'ять з гранулярністю 8 байтів (в 32-розрядних системах), а для обслуговування цих запитів використовує ті ж функції ядра, що і VirtualAlloc.

Для зберігання інформації про стан області пам'яті, за яку відповідає дескриптор. в структурі MMVAD міститься поле прапорів VadFlags.

Схожі статті