Память Linux: Принцип работы
10:41, 01.12.2023
В спецификациях компьютеров, особенно серверов, обычно указывается N гигабайт оперативной памяти для обозначения доступного объема физической памяти. Распределением этих ресурсов управляют операционные системы, поэтому каждое приложение имеет свой собственный набор ресурсов - виртуальные адресные пространства, чтобы каждое приложение функционировало так, как будто оно независимое.
Таким образом, программам не нужно знать об использовании памяти друг другом или об общем объеме доступной физической памяти.
Linux использует иерархический набор структур данных и специализированные аппаратные механизмы для отслеживания соответствия между физической и виртуальной памятью. Все вместе они называются MMU.
Для повышения эффективности память управляется большими блоками или страницами, каждая из которых обычно имеет вес 4 килобайта.
В Linux, в отличие от других операционных систем, сегментация памяти на аппаратном уровне не используется.
Понятие виртуальной памяти в Linux охватывает как оперативную память, так и все SWAP-разделы.
Процесс памяти, в свою очередь, может быть как резидентным (реально используемая физическая память), так и виртуальным (общая потенциальная доступная память). Обычно rss меньше, чем vsz.
Раздел SWAP - это раздел на диске, куда помещаются редко используемые данные из резидентной памяти, а иногда и все данные (в случае нехватки физической памяти). 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).
Отложенное выделение
В некоторых случаях запросы пользовательских процессов могут быть отложены до тех пор, пока память действительно не
понадобится.