Віртуальна пам'ять — Вікіпедія

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

Також під віртуальною пам'яттю часто розуміють файл підкачки (Windows-системи), або окремий розділ на диску (Unix-системи). Ця пам'ять використовується для того, щоб дати можливість системі або користувачу одночасно виконувати більшу кількість програм, ніж це дозволяє фізична оперативна пам'ять.

Віртуальну пам'ять підтримують процесори, що працюють у захищеному режимі, починаючи з 80286 (випущено у 1982 році), але широко стали використовувати тільки в операційних системах і оболонках для 32-розрядних процесорів (80386 і новіші, починаючи з 1985 року).

Віртуальна пам'ять у Windows[ред. | ред. код]

У Windows реалізовано систему віртуальної пам'яті, яка утворює плоский (лінійний) адресний простір[1]. Вона створює кожному процесу ілюзію того, що в нього є власний достатньо великий і закритий від інших процесів адресний простір. Віртуальна пам'ять дає логічне представлення (звідси й назва- віртуальна, "неіснуюча"), яке не обов'язково відповідає (і як правило не відповідає) структурі фізичної пам'яті. У період виконання диспетчер пам'яті, використовуючи апаратну підтримку, транслює, або проектує (maps), віртуальні адреси на фізичні, за якими реально зберігаються дані. Керуючи проектуванням і захистом сторінок пам'яті, операційна система гарантує, що жоден процес не зашкодить іншому й не зможе пошкодити дані самої операційної системи. Оскільки в більшості комп'ютерів обсяг фізичної пам'яті набагато менший від загального обсягу віртуальної пам'яті, задіяної процесами, диспетчер пам'яті переміщає (підкачує) частину вмісту пам'яті на диск. Підкачування даних на диск звільняє фізичну пам'ять для інших процесів або операційної системи. Коли потік звертається до скинутої на диск сторінки віртуальної пам'яті, диспетчер пам'яті завантажує цю інформацію з диска назад у пам’ять. Для використання переваг підкачування в програмах ніякого додаткового коду не потрібно, тому що диспетчер пам'яті спирається на апаратну підтримку цього механізму.

Керування віртуальною пам'яттю[ред. | ред. код]

Механізм керування пам’яттю є однією з найважливіших складових операційної системи. У комп’ютерах IBM-сумісної архітектури застосунки разом з оброблюваними даними розташовуються в оперативній пам'яті. Таким чином, виконання будь-якого процесу обов’язково супроводжується операціями з пам’яттю. Для реалізації схеми керування віртуальною пам’яттю, при якій кожен процес отримує власний закритий адресний простір, використовується диспетчер віртуальної пам’яті (virtual memory manager). Диспетчер пам’яті виконує два головних завдання: узгодження адрес віртуального адресного простору з наявними фізичними ресурсами пам’яті (трансляція віртуальних адрес) та керування використанням сторінкового файлу, який дозволяє компенсувати нестачу фізичної пам’яті.

Структура віртуального адресного простору[ред. | ред. код]

Структура адресного простору для 32- та 64-розрядних Windows

Розмір віртуального адресного простору залежить від конкретної апаратної платформи. На 32-розрядних системах теоретичний максимум для загального віртуального адресного простору становить 4 Гб. За замовчуванням Windows виділяє нижню половину цього простору (у діапазоні адрес від х00000000 до х7FFFFFFF) процесам, а другу половину (у діапазоні адрес від х80000000 до xFFFFFFFF) використовує у власних цілях. Windows 2000 Advanced Server, Windows 2000 Datacenter Server, Windows XP (SP2 і вище) і Windows Server 2003 підтримують завантажувані параметри /3GB і /USERVA, які вказують у файлі Boot.ini та дозволяють процесам, що виконують програми зі спеціальним прапорцем у заголовку образу, використовувати до 3 Гб закритого адресного простору й залишає операційній системі тільки 1 Гб. Цей варіант дає можливість вимогливій до пам’яті програмі зберігати в адресному просторі свого процесу великі порції даних і тим самим зменшити частоту дискових звертань.

Кожному процесу виділяється власний віртуальний адресний простір[1]. Для 32-розрядних процесів його розмір становить 4 Гб (це максимальний обсяг, який може використовуватися при 32-бітній адресації – 232 байт). Для 64-розрядних процесів розмір адресного простору становить 16 екзабайт (264 байт). Потоки при виконанні отримують доступ тільки до пам'яті, яка належить його процесу. Пам'ять, відведена іншим процесам, прихована від потоку й недоступна для використання. Тому дані різних процесів, записані за тією ж віртуальною адресою, розміщуються в різних сторінках фізичної пам'яті (це забезпечує система трансляції адрес). У ряді випадків ізоляція може бути частково знята (наприклад, для відображених файлів). У подібних випадках забезпечують контроль доступу до області пам'яті, для чого створюють окремий об'єкт, який містить атрибути захисту. 4 Гб адресного простору система ділить на дві приблизно однакові за обсягом частини. Перша частина надається у користування процесу, а друга резервується для системних потреб. Таким чином, за замовчуванням кожен користувацький процес в 32-розрядній версії Windows має у своєму розпорядженні власний адресний простір розміром до 2 Гб; інші 2 Гб використовує операційна система. У системному просторі розміщуються такі компоненти[2]:

  • Системний код. Містить образ операційної системи, HAL і драйвери пристроїв, які використовуються для завантаження системи. Сюди ж проектується частина підсистеми Windows режиму ядра, а також графічні драйвери.
  • Гіперпростір. Особлива область, яка використовується для проектування на пам’ять списку робочого набору процесу й тимчасового проектування інших фізичних сторінок для ряду системних операцій.
  • Структури даних списку робочого набору, які описують системний робочий набір.
  • Системний кеш. Віртуальний адресний простір, який використовується для проектування[що?] файлів.
  • Системна купа підкачуваної пам’яті.
  • Елементи системної таблиці сторінок. Це елементи в таблиці сторінок, що містять фізичну адресу, на яку проектується віртуальна.
  • Системна купа непідкачуваної пам’яті.
  • Дані аварійного дампу. Область, зарезервована для запису інформації про стан системи на момент краху.
  • Область, зарезервована під специфічні для HAL структури.

Віртуальний адресний простір 32-бітних систем[ред. | ред. код]

Структура віртуального адресного простору в системах типу х86

Віртуальний адресний простір кожного процесу розбивається на розділи, розмір і призначення яких залежать від версії Windows. Розділ для виявлення нульових вказівників резервується, щоб полегшити розробникам програмного забезпечення виявляти нульові вказівники. Спроба читання або запису за цими адресами викликає порушення доступу. Якщо в програмі відсутня належна обробка помилок, то при невдалій спробі виділення пам’яті за вказівником він може мати нульове значення. Тоді спроба звертання до даних за таким вказівником (тобто за адресою $00000000) буде явно помилковою. Оскільки цей розділ адресного простору заблокований, виникне виняткова ситуація некоректного доступу до пам’яті. Ця особливість допомагає програмістам виявляти помилки у програмах. Розділ для коду й даних є закритою частиною адресного простору процесу. Основний обсяг даних, що належать процесу, зберігається саме тут. Сюди завантажуються всі виконавчі модулі, враховуючи й динамічні бібліотеки. На цей же розділ відображуються проектовані файли, доступні даному процесу.

Сторінковий файл[ред. | ред. код]

У старих операційних системах фізичною пам'яттю вважалася лише оперативна пам'ять (RAM). Сучасні ОС імітують пам'ять за рахунок дискового простору. При цьому на диску створюється сторінковий файл (paging file), який містить доступну для всіх процесів віртуальну пам'ять. З погляду прикладної програми, сторінковий файл просто збільшує обсяг доступної пам'яті. Під час роботи операційна система скидає вміст частини оперативної пам'яті в сторінковий файл і при необхідності довантажує його порціями назад у пам’ять. Якщо такого файлу немає, система працюватиме, але застосункам буде доступний менший обсяг пам'яті. Сторінковий файл збільшує обсяг доступної пам'яті і дозволяє програмам працювати з більшими обсягами даних. Фізична пам’ять ділиться на сторінки, кожна з яких може мати окремі атрибути захисту.

Механізм розширеної пам'яті (Address Windowing Extension)[ред. | ред. код]

Проте інколи для роботи програми недостатньо й 3 Гб (наприклад, для великих баз даних). У зв'язку з цим у 32-розрядних Windows з'явився механізм Address Windowing Extension (AWE), що дозволяє 32-розрядній програмі виділяти до 64 Гб фізичної пам'яті, а потім створювати подання (views), або вікна (windows), на свій 2-гігабайтний віртуальний адресний простір[2]. Застосування AWE ускладнює керування проєкціями віртуальної пам'яті на фізичну, але знімає проблему прямого доступу до обсягу фізичної пам'яті, що перевищує ліміти 32-розрядного адресного простору процесу.

Переваги[ред. | ред. код]

Використання віртуальної пам'яті дає ряд переваг:

  • спрощення адресації пам'яті клієнтським програмних забезпеченням
  • раціонально керувати ОЗП комп'ютера
  • ізолювати процеси один від одного (кожен процес «вважає», що монопольно володіє всією пам'яттю)

Примітки[ред. | ред. код]

  1. а б Коноваленко І.В., Федорів П.С. Системне програмування у Windows з прикладами на Delphi, Т:ТНТУ.- 2012 [Архівовано 8 грудня 2012 у Wayback Machine.].
  2. а б Руссинович М. Внутреннее устройство Microsoft Windows : Windows Server 2003, Windows XP и Windows 2000. Мастер-класс / М.Руссинович, Д.Соломон ; пер. с англ. – 4-е изд. – М : Издательско-торговый дом "Русская редакция" ; СПб : Питер, 2005.

Див. також[ред. | ред. код]