Пам'ять Linux: Принцип роботи
10:58, 01.12.2023
У специфікаціях комп'ютерів, особливо серверів, зазвичай вказується N гігабайт оперативної пам'яті для позначення доступної фізичної пам'яті. Розподілом цих ресурсів керують операційні системи, тому кожна програма має власний набір ресурсів, віртуальний адресний простір, щоб кожна програма працювала так, ніби вона є незалежною.
Таким чином, програмам не потрібно знати про використання пам'яті одна одною або про загальний обсяг доступної фізичної пам'яті.
Linux використовує ієрархічний набір структур даних та спеціалізовані апаратні механізми для відстеження відповідності між фізичною та віртуальною пам'яттю. Разом вони називаються MMU.
Задля ефективності пам'ять управляється великими блоками або сторінками, кожна з яких зазвичай має вагу 4 кілобайта.
У Linux, на відміну від інших операційних систем, не використовується сегментація пам'яті на апаратному рівні.
Поняття віртуальної пам'яті в Linux охоплює як оперативну пам'ять, так і всі розділи підкачки (SWAP).
Процес роботи з пам'яттю, у свою чергу, може бути як резидентним (фактично використовувана фізична пам'ять), так і віртуальним (сукупність потенційно доступної пам'яті). Зазвичай rss менший за vsz.
Розділ підкачки - це розділ на диску, в якому розміщуються рідко використовувані дані з резидентної пам'яті, а іноді і всі дані (якщо фізичної пам'яті не вистачає). Linux може працювати як з розділами підкачки, так і з файлами підкачки, дозволяючи переносити дані з фізичної пам'яті до спеціального файлу на жорсткому диску. У цьому файлі та розділі підкачки використовується той самий формат, що і в оперативній пам'яті.
Детальна інформація про використання пам'яті процесом зберігається у файлі proc/<pid>/.
Віртуальна пам'ять складається зі сторінок. Це набори комірок пам'яті у віртуальному просторі, які відповідають реальній пам'яті на диску. Більшість сторінок мають стандартний розмір 4 КБ, але в деяких випадках використовуються сторінки більшого розміру (2 мегабайти або 1 гігабайт). Величезні сторінки використовуються для роботи з великими даними (базами даних тощо).
Методи керування підсистемою пам'яті
Керування пам'яттю має вирішальне значення для продуктивності системи у Linux,
Методами розподілу пам'яті у Linux є bootmem (початковий базовий розподільник), buddy (розподіл суміжних фреймів сторінок), vmalloc (робота з несуміжними областями фізичної пам'яті) і kmemcache (розподіл невеликих об'єктів у межах фреймів сторінок). Ці розподільники служать для різних цілей, від початкового завантаження до обробки різних потреб у розподілі пам'яті.
NUMA (Non-Uniform Memory Access - нерівномірний доступ до пам'яті) у багатопроцесорних системах - ще один аспект, яким ефективно керує Linux. Він відповідає за оптимізацію доступу до пам'яті на основі фізичної близькості пам'яті до процесорів, підвищуючи продуктивність.
Керування пам'яттю користувача
Запити alloc_pages() та kmalloc() призводять до негайного виділення пам'яті, оскільки ядро є найбільш довіреним компонентом системи.
Адресний простір процесів
Адресний простір процесу - це лінійні адреси, до яких звертаються процеси.
Процес отримує доступ до нових ділянок пам'яті через виклики: malloc(), calloc(), mmap(), brk(), shmget() + shmat(), posix_memalign(), mmap() на основі void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset).
Дескриптор пам'яті
mm_struct, дескриптор пам'яті, містить всю інформацію про адресний простір.
Область пам'яті
Пам'ять поділяється на два поля - vm_start і vm_end. Вони позначають адресу початку та першого біта після кінця виділеної області.
Всі області з'єднуються у двонаправлений список, де вони впорядковані за зростанням адрес.
Лінійний розподіл інтервалу адрес
Лінійні адреси, що виділяються, або пов'язані з файлом (FILE), або ні (ANON), при цьому процес, що запитує пам'ять, може ділитися ними з іншими процесами або мати приватний доступ до них.
(MAP_SHARED або MAP_PRIVATE).
Відкладене виділення
У деяких випадках запити процесів користувача можуть бути відкладені до моменту, коли пам'ять дійсно знадобиться.