Приклади віртуальної пам'яті

В цьому підрозділі ми поговоримо про віртуальної пам'яті в UNIX і Windows ХР. З точки зору програміста вони багато в чому схожі.

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

Модель пам'яті UNIX досить проста. Кожен процес має три сегменти: код, дані та стек, як показано на рис. 6.26. У машині з лінійним адресним простором код зазвичай розташовується в нижній частині пам'яті, а за ним слідують дані. Стек поміщається у верхній частині пам'яті. Розмір коду фіксований, а дані і стек можуть збільшуватися або зменшуватися. Таку модель легко реалізувати практично на будь-якій машині. Вона використовується в операційній системі Solaris.

В цьому підрозділі ми поговоримо про віртуальної пам'яті в UNIX і Windows ХР

Мал. 6.26. Адресний простір одного процесу в UNIX

Більш того, якщо машина підтримує сторінкову пам'ять, то все адресний простір може бути розбите на сторінки абсолютно прозоро для користувача програм. Їм буде відомо тільки те, що розмір програми може перевищувати розмір фізичної пам'яті машини. Ті системи UNIX, які не підтримують сторінкову організацію пам'яті, зазвичай подкачивают цілі процеси між пам'яттю і диском, щоб паралельно могло виконуватися довільне число процесів.

Дане раніше опис системи UNIX (віртуальна пам'ять з підкачкою сторінок на вимогу) в цілому відповідає версії Berkeley UNIX, проте версії Sysytem V і Solaris мають деякі особливості, що дозволяють користувачам управляти віртуальною пам'яттю. Найважливішою є здатність процесу відображати файл або частину файлу на частину адресного простору процесу. Наприклад, якщо файл розміром 12 Кбайт відображається на віртуальний адреса 144К, то в осередку з адресою 144К буде знаходитися перше слово цього файлу. Таким чином, можна виконувати введення-виведення файлу без системних викликів. Оскільки розмір деяких файлів перевищує розмір віртуального адресного простору, можна відображати не весь файл, а тільки його частину. Для відображення спочатку потрібно відкрити файл і отримати дескриптор файлу fd (file descriptor). Дескриптор використовується для ідентифікації відображуваного файлу. Потім процес здійснює виклик

paddr = mmap (virtual_address. length, protection, flags, fd, file_offset)

Цей виклик відображає length байт, починаючи з зміщення file_offset в файлі, на ВАП, починаючи з адреси virtual_address. Параметр flags вимагає, щоб система вибрала віртуальний адреса, який потім повертається в параметрі paddr. Видима область повинна бути вирівняна в межах сторінки і містити ціле число сторінок. Параметр protection визначає рівень захисту, включаючи можливість читання, записи і виконання (в будь-якій комбінації). Відображення можна в подальшому видалити за допомогою команди unmap.

Кілька процесів можуть одночасно виконувати відображення одного і того ж файлу. Є два варіанти поділу. У першому варіанті загальними є всі сторінки, тому записи, зроблені одним процесом, доступні всім іншим процесам. Ця можливість забезпечує високошвидкісне взаємодія між процесам. У другому варіанті сторінки залишаються загальними для всіх процесів до тих пір, поки жоден з процесів їх не міняє. Як тільки який-небудь процес спробує зробити запис в сторінку, він отримає помилку захисту, в результаті якої операційна система надасть йому власну копію цієї сторінки для запису. Така схема, яка називається копіюванням при запису (copy on write), використовується в тому випадку, коли для кожного з декількох процесів потрібно створити ілюзію, що тільки він виконує відображення файлу.

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

У Windows ХР кожен призначений для користувача процес має власний віртуальний адресний простір. Довжина ВА становить 32 біта, тому у кожного процесу є 4 Гбайт віртуального адресного простору. Нижні 2 Гбайт призначені для коду та даних процесу; верхні 2 Гбайт забезпечують доступ (обмежений) до пам'яті ядра. Виняток становлять серверні версії Windows ХР, в яких поділ пам'яті може бути іншим (3 Гбайт користувачеві і 1 Гбайт ядру). ВАП з підкачкою сторінок на вимогу містить сторінки фіксованого розміру (4 Кбайт на машині Pentium 4).

Кожна віртуальна сторінка може перебувати в одному з трьох станів: вільна (free), зарезервована (reserved) або виділена (committed). Вільна сторінка в поточний момент не використовується, і звернення до неї викликає помилку відсутності сторінки. Коли процес починається, всі його сторінки знаходяться у вільному стані до тих пір, поки програма і початкові дані не будуть відображені на свій адресний простір. Якщо код або дані відображені в сторінку, то така сторінка є виділеної. Звернення до виділеної сторінці буде успішним, якщо сторінка знаходиться в основній пам'яті. Якщо сторінка відсутня в основний пам'яті, відбудеться помилка, і операційній системі доведеться викликати потрібну сторінку з диска. Віртуальна сторінка може перебувати і в зарезервованому стані. Це означає, що сторінка залишається недоступною для відображення до тих пір, поки резервування не буде скасовано. Крім атрибутів стану, сторінки мають і інші атрибути (наприклад, вказують на можливість читання, записи і виконання). Верхні 64 Кбайт і нижні 64 Кбайт пам'яті завжди вільні, щоб можна було відшукувати помилки покажчиків (неініціалізовані покажчики часто дорівнюють 0 або -1).

Кожна виділена сторінка має тіньову сторінку на диску, де вона зберігається, коли її немає в основний пам'яті. Вільні і зарезервовані сторінки не мають тіньових сторінок, тому звернення до них викликають помилки відсутності сторінки (система не може викликати сторінку з диска, якщо цієї сторінки немає на диску). Тіньові сторінки на диску згруповані в один або кілька сторінкових файлів. Операційна система стежить, на яку частину якого сторінкового файлу відображається кожна віртуальна сторінка. Файли з текстами програм мають тіньові сторінки; для сторінок даних використовуються спеціальні сторінкові файли.

Windows ХР, як і System V, дозволяє відображати файли прямо на області віртуального адресного простору. Якщо файл відображений на адресний простір, його можна зчитувати або записувати шляхом звичайних звернень до пам'яті.

Відображені на пам'ять файли реалізуються так само, як інші виділені сторінки, тільки тіньові сторінки можуть перебувати в файлі на диску, а не в сторінковому файлі. В результаті, коли файл відображається, версія в пам'яті може не збігатися з версією на диску (через останніх записів в ВАП). Однак коли відображення файлу видаляється, версія на диску оновлюється.

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

Win32 API містить ряд функцій, які дозволяють процесу безпосередньо управляти віртуальною пам'яттю. Найважливіші з цих функцій перераховані в табл. 6.4. Всі вони виконуються в області, що складається або з однієї сторінки, або з двох або більше сторінок, послідовно розташованих у віртуальному адресному просторі.

Перші чотири функції очевидні. Наступні дві функції дозволяють процесу робити скільки-небудь область пам'яті розміром до 30 сторінок і скасовувати цю дію. Ця якість може знадобитися програмам, що працюють в режимі реального часу. Операційна система встановлює певну межу, щоб процеси не ставали занадто "ненажерливими". В системі Windows ХР також є функції API (вони не вказані в табл. 6.4), які дозволяють процесу отримувати доступ до віртуальної пам'яті іншого процесу.

Останні 4 функції API призначені для управління відображеними на пам'ять файлами. Щоб відобразити файл, спочатку потрібно створити об'єкт відображення файлу за допомогою функції CreateFi 1 eMappi ng. Ця функція повертає описувач об'єкта відображення файлу і іноді ще й вводить в файлову систему ім'я для цього об'єкта, щоб інший процес міг його використовувати. Наступні 2 функції відповідно створюють і видаляють відображення файлів.

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

Таблиця 6.4. Основні функції АРІ для управління віртуальною пам'яттю

в Windows ХР

функція API

опис

VirtualAlloc

Резервування або виділення області

VirtualFree

Звільнення області або скасування виділення

Virtual Protect

Зміна варіанту захисту (читання / запис / виконання)

VirtualQuery

Запит про стан області пам'яті

VirtualLock

Заборона розбиття пам'яті на сторінки (область пам'яті

стає резидентної)

VirtualUnlock

Зняття заборони щодо розбиття на сторінки

CreateFileMapping

Створення об'єкта відображення файлу і призначення (не завжди) йому

імені

MapViewOfFile

Щоб відобразити файл або частини файлу на адресний простір

UnmapViewOfFile

Видалення відображеного файлу з адресного простору

OpenFileMapping

Відкриття раніше створеного об'єкта відображення файлу

Ці функції API є основними. На них будується вся інша система управління пам'яттю. Наприклад, існують функції API для розміщення і звільнення структур даних в одній або декількох купах. Купи використовуються для зберігання структур даних, які динамічно створюються і руйнуються. Купи не займаються прибиранням сміття, тому призначене для користувача програмне забезпечення саме повинно звільняти блоки віртуальної пам'яті, які вже не потрібні (прибиранням сміття називають автоматичне видалення невикористовуваних структур даних). Купа в Windows ХР нагадує результат виклику функції mall ос в UNIX, але в Windows ХР, на відміну від UNIX, може бути кілька незалежних куп.

Знайомство з операційними системами UNIX і Windows ХР || Зміст || Приклади віртуального введення-виведення