Як віртуальна пам'ять насправді збільшує простір пам’яті?


70

Я розумію, що віртуальна пам'ять обдурює програму, показуючи більше пам'яті, ніж є насправді.

Але в кінцевому підсумку воно має зіставити логічну адресу з фактично фізичною адресою. Тепер як це збільшує пам’ять?


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

2
"Тепер як це збільшує пам'ять?". Це не так. Програма не знає фізичної пам’яті системи, вона знає лише віртуальну пам’ять, що є причиною, коли програма скаржиться на недостатню кількість пам’яті, це говорить про віртуальну пам’ять, а не про фізичну пам’ять
Рамхаунд,

2
Майте на увазі, що системи віртуальної пам'яті досить розумні. Якщо n процесів мають одну і ту ж сторінку лише для читання, всі n процесів можуть використовувати одну і ту ж сторінку фізичної пам'яті.
Ерік Ліпперт

65
Не думайте, що віртуальна пам'ять нічого не обманює . Пам'ять - це абстрактна здатність зберігати та отримувати дані . Віртуальна пам'ять забезпечує реалізацію цієї абстракції. Те, що деяка частина цієї абстракції підтримується оперативною пам’яттю, а частина - диском, є деталлю реалізації абстракції.
Ерік Ліпперт

4
@HagenvonEitzen Не впевнений, як пам'ять "завжди" на диску ... окрім сторінок, які спочатку читаються з диска, якщо тільки сторінка не поміщена, її вміст ніколи не буде на диску, і це особливо стосується сторінок, закріплених у пам'яті, наприклад через критичне значення для функціональності ядра.
Михайло

Відповіді:


116

Це зовсім не збільшення фізичної пам’яті. Її призначення - це зовсім інше. Що можна зробити, це зробити доступними інші резервні магазини, які дозволяють програмам використовувати більше пам'яті, ніж це доступно фізично.

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

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

Простір віртуальної пам’яті програми додається за потребою. Додаток виглядає (само по собі) в одному суміжному блоці пам'яті, але насправді може бути повністю розсіяний по фізичній пам'яті.

Віртуальна пам'ять також дозволяє захоплювати та переадресовувати доступ до пам'яті, що дозволяє нам використовувати такі функції, як файл swap. Це означає, що ми можемо висувати частину пам'яті, яка нещодавно не використовувалась на диску, і встановити покажчик, який говорить, що "цей блок пам'яті знаходиться у файлі x у місці y", і тоді ми можемо звільнити фізичну пам'ять область для використання іншим додатком. Коли програмі потрібна ця пам'ять, її можна зчитувати з диска, розміщувати в якомусь місці фізичної оперативної пам’яті (потенційно відрізняється від місця, де вона була раніше) і відображати назад у тому ж місці віртуальної пам’яті, що і раніше.

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

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

Файл підкачки включений в системах віртуальної пам'яті, але в минулому було збентежений , як бути віртуальною пам'яттю.


Коментарі не для розширеного обговорення; ця розмова перенесена в чат .
Сатьядхіт Бхат

21

Пояснення Леймана

Системі доведеться зіставляти кожну віртуальну адресу до фізичної адреси, коли використовується ця пам'ять, але не вся пам'ять використовується одночасно . Наприклад, припустимо, у вашому браузері є 20 вкладок, кожна з яких займає 1 Гб пам'яті. У ОС без підтримки віртуальної пам’яті вам знадобиться 20 Гб оперативної пам’яті, щоб це працювало. Хитрість полягає в тому, що ви не переглядаєте всі 20 вкладок одночасно, тому ОС з віртуальною пам’яттю дозволить вам використовувати ваш браузер таким чином, лише за допомогою декількох ГБ оперативної пам’яті, замінюючи неактивні вкладки на диск.

Більш складні аспекти

Віртуальна пам'ять не використовується виключно для заміни. Його основна мета - це фактично уникнути фрагментації оперативної пам’яті, що є великою проблемою в системах без управління віртуальною пам’яттю: можливо, у вас є 1 Гб оперативної пам’яті безкоштовно, але якщо вона надійде в шматки 10 МБ, додаток, що вимагає 100 МБ, не зможе працювати .

З часом віртуальна пам'ять знайшла ще більше використання, зокрема випадковий доступ до файлів: багато програм, як-от бази даних, стануть болісно повільними, якщо їх змусять читати файли послідовно, і працюватимуть набагато швидше, якщо ОС дозволить зробити вигляд, що весь файл знаходиться в (віртуальний ) пам'ять та оптимізація дискового вводу-виводу та кешування на основі моделей доступу.


9
прикро, що ми живемо у світі, де на кожній вкладці браузера потрібно 1 Гб пам’яті
tbodt

9
@tbodt Я звинувачую давніх єгиптян. Якби вони тільки знали, що роблять, одомашнюючи цих примхливих котів!
Дмитро Григор’єв

@tbodt Це теж трохи перебільшення. Мій браузер з відкритими 8 вкладками займає лише 500 МБ пам'яті.
Випадково832

2
@ Random832 Звичайно, це перебільшення, хоча я не впевнений у межі між перебільшенням та майбутнім. Мій перший ПК мав 32 Мб оперативної пам’яті, і я міг легко відкрити 8 вкладок в Opera, не помітно поміняючи місцями. Зараз це займає 500 Мб, тож за 20 років він може досягти 8 Гб.
Дмитро Григор’єв

5

Віртуальна пам’ять не збільшує пам’ять, тобто в тому, що насправді додається більше обладнання для основної пам'яті. Але це МОЖЕ збільшити діапазон корисних адрес . Таким чином, можна мати запущену програму, що складається з сегмента коду та сегмента даних (стек та купа), і обидва вони могли б займати діапазон віртуальних адрес, більший за діапазон фізичних адрес, наданий фізично-реальним простором зберігання машина. Хитрість полягає в тому, що лише невелика частина цих віртуальних адрес у будь-який момент підкріплюється фізичною основною пам'яттю [але в кінцевому підсумку все підтримується дисковим сховищем] . Це працює через явище місцевості відліку: У будь-який момент виконуються лише вказівки в одному або декількох невеликих суміжних розділах сегмента програми, і тільки з даними в одному або декількох малих суміжних розділах сегменту даних оперують [звичайно, поведінка насправді складніша , але вона відповідає цій схемі протягом великої частки часу]


4

Я розумію, що віртуальна пам'ять обдурює програму, показуючи більше пам'яті, ніж є насправді.

Початковою мотивацією віртуальної пам’яті була форма управління пам’яттю, щоб забезпечити адресний простір більше, ніж фізична пам’ять.
Програмне забезпечення може використовувати повний адресний простір центрального процесора (наприклад, 2 ^ 32 адресний простір), тоді як фактично встановлена ​​фізична пам'ять була лише часткою від цього числа.
Великі програми можуть бути портативними серед комп'ютерів, які використовують віртуальну пам'ять, не пред'являючи великих (встановлених) вимог до пам'яті.
Це використання віртуальної пам’яті було ще в день основних комп'ютерів та феритової основної пам’яті (що було фізично і дорого низької щільності).

Але в кінцевому підсумку воно має зіставити логічну адресу з фактично фізичною адресою. Тепер як це збільшує пам’ять?

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

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

Несуттєвий код (тому що він зараз не виконується) та дані (тому що на нього не посилаються / обробляються) не повинні постійно залишатися в пам'яті. Сторінки коду та / або дані / сегменти можуть бути "замінені" на сховище резервного копіювання (наприклад, простір підкачки або файл сторінки на жорсткому диску або SSD), а пізніше "поміняти (назад) на" за потребою (так само "на вимогу" ).

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


3

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

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

За допомогою віртуальної пам’яті операційна система «сторінкиє» дані, які не використовувались протягом певного часу, зберігаючи їх на жорсткому диску. Це все ще доступно, просто повільно. Якщо програма запитує дані, що знаходяться на жорсткому диску, операційній системі доведеться витратити час, щоб прочитати дані з диска та перенести їх назад в DRAM.

Теоретично він міг просто зчитувати дані безпосередньо з диска. Однак є причини, що це не робиться так. Програми не хочуть усвідомлювати всі ці ускладнення. Ми можемо писати програмне забезпечення, яке інтелектуально ставить дані на диск (це називається кешування). Однак потрібно багато зайвої роботи. Найшвидший, що ми можемо це зробити в коді, це:

if data is not in memory
    read data from disk into memory
operate on data

Проникливий читач помітить, що, навіть якщо дані є в пам’яті, нам довелося мати умовні умови, щоб перевірити, чи є вони. Це набагато повільніше, ніж просто працювати в пам'яті безпосередньо!

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

Це призводить до того, що ми завжди повертаємо дані назад в пам'ять, а не просто читаємо їх з диска і залишаємо при цьому. Ми розбиваємо пам'ять на "сторінки", кожна з яких позначена як присутніми, так і відсутніми в пам'яті. Операційна система підтримує цю таблицю у форматі, зручному для безпосередньо процесора. Щоразу, коли програма отримує доступ до наявних даних, апаратне забезпечення на процесорі надає їм доступ до даних в DRAM безпосередньо. Коли даних немає, видається "помилка сторінки", яка спонукає операційну систему перевантажити цю сторінку з диска на якусь фізичну сторінку пам'яті та оновити таблицю, щоб вказати ЦП на цю нову фізичну сторінку.

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


2

Це робиться, роблячи записи на карті тимчасовими.

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

Максимально виділена пам'ять - це розмір місця для заміни, який може бути набагато більшим, ніж встановлена ​​пам'ять. Можливо, буде корисним уявити про простір підкачки як про "справжню" пам'ять, а про оперативну пам'ять як про швидкісний кеш для місця обміну.

(Це далеко не ґрунтовний опис, він призначений відповісти на негайне запитання, не потрапляючи у відповідні, але непотрібні деталі.)


1

Основна концепція спирається на той факт, що сучасний процесор може керувати таблицями перекладу, відслідковуючи "які діапазони адрес призначено для використання певним процесом та які фізичні адреси (подумайте, A00..Axx рядки на шині пам'яті), ЯКЩО ЯКЩО , в даний час використовуються для фактичного зберігання даних. "ЯКЩО ЯКЩО", оскільки "взагалі немає" - це можливий і прийнятний стан: У цьому випадку умова помилки (так звана "помилка сторінки") буде підвищена на апаратному рівні - і ця помилка спровокує обробник рівня ОС, який може, наприклад, завантажувати вміст пам'яті, записаний у файл swap, назад у будь-яке вільне місце у фізичній пам'яті (у випадку зчитування) або знаходити фактичне місце для розміщення матеріалів (у випадку запису), оновіть вищезгадану таблицю перекладу,і лише ТОГО ручне управління повернеться до процесу, який намагався отримати доступ до цієї пам’яті .. і який не стане мудрішим у тому, що сталося.


1

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

1) дозволяє великий віртуальний адресний простір відображати на менший об'єм фізичної пам'яті, із надлишком "заміщеного" на диск або SSD, або потенційно на NVRAM та інші пристрої.

2) дозволяє збільшити більший віртуальний адресний простір (наприклад, 64 біт) на менший фізичний адресний простір (наприклад, 32 або 64 біт)

3) дозволяє зменшити менший віртуальний адресний простір (наприклад, 32 біти) на більший фізичний адресний простір (наприклад, 40 біт), і тим самим дозволяє старішим програмам скористатися більшою кількістю фізичної DRAM.

4) дозволяє фізичній пам’яті, яка нам фрагментована і безперервна у фізичному адресному просторі, бути винесеною у віртуальний адресний простір.

5) дозволяє процесам надавати власні віртуальні адресні простори, а отже, бути ізольованими один від одного.

6) дозволяє різним віртуальним адресам, які мають спільний доступ до одних і тих же значень даних для виділеної однієї фізичної сторінки.

Це може статися в межах одного процесу або ОС - більшість ОС, отриманих BSD UNIX, мають одну нульову сторінку для читання, яка може бути відображена на будь-яку віртуальну сторінку, заповнену нулем, як правило, COW (Copy On Write - читання лише нулів, пише пастка а сторінка не поділяється та робиться для запису).

Це може статися між процесами - наприклад, UNIX fork () створює дочірні процеси, які обмінюються майже всією віртуальною пам'яттю в режимі COW.

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

7) віртуальна пам'ять може дозволяти частини віртуального адресного простору відображати у файли або в пам'ять, відображену на інших процесорах, в тій же багатопроцесорній системі чи через Інтернет.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.