Чому Linux використовує розділ swap, коли ядро ​​так чи інакше підтримує пейджингову / віртуальну пам'ять?


23

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

Але чому тоді Linux потрібен розділ swap? Якщо фізична пам'ять заповнена, деякі процеси будуть передані на жорсткий диск, і новий процес буде відображено з віртуальної пам'яті у фізичну пам'ять.

Я просто не розумію, чому тоді потрібен розділ swap (або взагалі своп)?

Або це лише питання термінології та swap partition == virtual memory?


5
Будьте уважні, що "віртуальна пам'ять" в архітектурі комп'ютера - це техніка, тоді як MS Windows (неправильно IMO) визначає це як "Віртуальна пам'ять - це місце для зберігання на жорсткому диску вашого комп’ютера, який Windows використовує спільно з оперативною пам'яттю оперативного доступу". IE google windows "віртуальна пам'ять"
тирса

Відповіді:


25

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

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


6
І таким чином також простіше поділити один розділ swap між установками Linux.
oKtosiTe

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

12
На самих ранніх UNIX-і відбулася лише заміна, не підказка, і вони могли змінюватись лише на виділений розділ. Підказка була здійснена, як тільки апаратне забезпечення її підтримало, але назва "swap partition" застрягла. Пейджинг до файлу є нещодавнішим та має вищі накладні витрати на ОС, а також ризикує фрагментація, тому він все ще не перешкоджає.
zwol

1
"розділ swap використовується як віртуальна пам'ять." - Тільки Microsoft Windows визначає вторинну пам’ять (наприклад, файл сторінки на диску) як "віртуальну пам'ять". Але навіть вони намагаються відійти від цього використання. Спробуйте в Google "віртуальну пам'ять" googling windows, і конспект першого результату ("Віртуальна пам'ять - це місце для зберігання ...") не відповідає вмісту сторінки. Правильне твердження буде «розділ підкачки використовується на віртуальній пам'яті.»
тирса

14

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

Історично під час перемикання говорилося про переміщення з / у вторинне сховище цілої програми одночасно за схемою, відомою як розгортання / розгортання. У 1960-х роках, після введення концепції віртуальної пам'яті - у двох варіантах, або за допомогою сегментів, або сторінок - термін "заміна" застосовувався для переміщення відповідно сегментів або сторінок між диском і пам'яттю. Сьогодні віртуальна пам'ять, що базується на сторінках, а не на сегментах, заміною стала досить близьким синонімом підкачки, хоча з однією різницею.

Дійсно, в будь-якому контексті, що включає Linux (або інші системи Unix з цього приводу), пейджингові роботи та обміняння в значній мірі є синонімами. Обидва стосуються використання віртуальної пам'яті, де дані сторінки можуть бути збережені в оперативній пам'яті або на диску. (Сторінка становить 4 КБ на будь-якому пристрої, з яким ви, мабуть, зіткнетеся.) Програма, яка використовує сторінку пам'яті, не хвилює і навіть не знає, де зберігаються дані, вона просто продовжує використовувати віртуальну адресу. Ядро передає дані між оперативною пам’яттю та диском та оновлює таблиці MMU в міру того, як запис для віртуальної адреси або вказує на фізичну сторінку в пам'яті, або містить спеціальне значення, яке змушує процесор виконувати якийсь код ядра який завантажить відповідні дані з диска.

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

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


У першому абзаці вашої відповіді йдеться про те, звідки у нього ідея: старі документи. (Я пам’ятаю, коли також була різниця між заміною та пейджингом.)
RonJohn

9

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

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

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

Цей механізм "помилка сторінки" також може дозволити ядру поміняти сторінку, до якої процес намагався отримати доступ з однієї з диска, якщо ядро ​​здатне перезавантажити пам'ять (і Windows, і Linux підтримують це), отже, чому воно називається своп. Якщо доступ до пам'яті був дійсно недійсним (тобто процес намагається отримати доступ до пам'яті, він не запитував спочатку), зазвичай процес буде знищений за допомогою SIGSEGV.

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


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

Але чому тоді Linux потрібен розділ swap? Якщо фізична пам'ять заповнена, деякі процеси будуть передані на жорсткий диск, і новий процес буде відображено з віртуальної пам'яті у фізичну пам'ять.

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


2

Загалом розділ swap не дорівнює віртуальній пам'яті.

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

Ця віртуальна пам'ять в основному є фізичною пам'яттю і частиною диска. Ця частина диска в Linux називається "swap".

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

Щоб відповісти на ваше запитання: для обміну деякими сторінками пам'яті Linux потрібен розділ swap, і ви можете побачити статистику використання віртуальної пам'яті за допомогою vmstat:

procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r  b   swpd   free   buff  cache    si   so    bi    bo   in   cs us sy id wa
2  0  35424 524560 134164 1858728    0    0    13    11   55   42  5  1 94  0
0  0  35424 526720 134164 1857872    0    0     0     0 2774 5224  7  2 91  0
1  0  35424 516328 134172 1870116    0    0     0     6 3464 6561 13  3 84  0
0  0  35424 522992 134212 1862676    0    0     0   125 4135 7135 12  4 84  1

У стовпці "swap" відображається своп і в статистиці. Також це посилання пояснює віртуальну пам'ять і використання vmstat.

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