Вы находитесь на странице: 1из 9

Менеджер памяти в Linux.

Средства и
механизмы управления основной
памятью

Презентация
На тему: “менеджер памяти в Linux.
Средства и механизмы управления
основной памятью
Менеджер памяти

Менеджер памяти — часть компьютерной


программы (как прикладной, так и
операционной системы), обрабатывающая
запросы на выделение и освобождение
оперативной памяти или (для некоторых
архитектур ЭВМ) запросы на включение
заданной области памяти в адресное
пространство процессора.

Основное назначение менеджера памяти в


первом смысле — реализация динамической
памяти
Работа с памятью организована через страницы. Объём памяти, как правило, большой, присутствует
адресация, но операционной системе и железу не очень удобно работать с каждым из адресов отдельно,
поэтому вся память и разбита на страницы. Размер страницы – 4 KБ. Также существуют страницы другого
размера: так называемые Huge Pages размером 2 MБ и страницы размером 1 ГБ
Виртуальная память

Виртуальная память – это адресное пространство


процесса. Процесс работает не с физической памятью
напрямую, а с виртуальной. Такая абстракция позволяет
проще писать код приложений, не думать о том, что
можно случайно обратиться не на те адреса памяти или
адреса другого процесса. Это упрощает разработку
приложений, а также позволяет превышать размер
основной оперативной памяти за счёт описанных ниже
механизмов. Виртуальная память состоит из основной
памяти и swap-устройства. То есть объём виртуальной
памяти может быть в принципе неограниченного
размера.
Для управления виртуальной памятью в системе присутствует параметр overcommit. Он следит за тем,
чтобы мы не переиспользовали размер памяти. Управляется через sysctl и может быть в следующих трех
значениях:

0 – значение по умолчанию. В этом случае используется эвристика, которая следит за тем, чтобы мы не
смогли выделить виртуальной памяти в процессе намного больше, чем есть в системе;

1 – говорит о том, что мы никак не следим за объёмом выделяемой памяти. Это полезно, например, в
программах для вычислений, которые выделяют большие массивы данных и работают с ними особым
способом;

2 – параметр, который позволяет строго ограничивать объем виртуальной памяти процесса.Посмотреть,


сколько у нас закоммичено памяти, сколько используется и сколько мы можем ещё выделить, можно в
строках CommitLimit и Commited_AS из файла /proc/meminfo.
Page Cache

Через Page Cache в Linux по умолчанию идут все операции


чтения и записи. Он динамического размера, то есть
именно он съест всю вашу память, если она свободна. Как
гласит старая шутка, если вам нужна свободная память в
сервере, просто вытащите ее из сервера. Page Cache
делит все файлы, которые мы читаем, на страницы
(страница, как мы сказали, – 4 KБ). Посмотреть, есть ли в
Page Cache какие-­то страницы какого-­то конкретного
файла, можно с помощью системного вызова mincore().
Или с помощью утилиты vmtouch, которая написана с
использованием этого системного вызова.
Источники пополнения Free List

Если говорить упрощённо, то у ядра есть один большой Free List (на самом деле, это не
так), в котором хранятся страницы памяти, которые можно выдавать процессам. Ядро
пытается поддерживать размер этого списка в каком­-то не нулевом состоянии, чтобы
быстро выдавать память процессам. Пополняется этот список за счёт четырех
источников: Page Cache, Swap, Kernel Memory и OOM Killer.
Мы должны различать участки памяти на горячую и холодную и как­-то пополнять за счет них наши Free
Lists. Page Cache устроен по принципу LRU/2 ­очереди. Есть активный список страниц (Active List) и
инактивный список (Inactive List) страничек, между которыми есть какая­-то связь. В Free List прилетают
запросы на выделение памяти (allocation). Система отдаёт страницы из головы этого списка, а в хвост
списка попадают страницы из хвоста инактивного (inactive) списка. Новые страницы, когда мы читаем файл
через Page Cache, всегда попадают в голову и проходят до конца инактивного списка, если в эти страницы
не было еще хотя бы одного обращения. Если такое обращение было в любом месте инактивного списка,
то страницы попадают сразу в голову активного списка и начинают двигаться в сторону его хвоста. Если же
в этот момент опять к ним происходит обращение, то страницы вновь пробиваются в верх списка. Таким
образом система пытается сбалансировать списки: самые горячие данные всегда находятся в Page Cache в
активном списке, и Free List никогда не пополняется за их счет.
Также тут стоит отметить интересное поведение: страницы, за счет которых
пополняется Free List, которые в свою очередь прилетают из инактивного списка, но до
сих пор не отданные для аллокации, могут быть возвращены обратно в инактивный
списка (в данном случае в голову инактивного списка).

Итого у нас получается пять таких листов: Active Anon, Inactive Anon, Active File, Inactive
File, Unevictable. Такие списки создаются для каждой NUMA ноды и для каждой Memory
Zone.