Введение
Механизм управления памятью
Slab allocation — это механизм управления памятью, предназначенный для эффективного выделения памяти под объекты. По сравнению с более ранними механизмами, он снижает фрагментацию, возникающую при выделении и освобождении памяти. Эта техника используется для сохранения выделенной памяти, содержащей объект данных определенного типа, для повторного использования при последующем выделении объектов того же типа. Это аналогично пулу объектов, но применяется только к памяти, а не к другим ресурсам. Slab allocation впервые был представлен в ядре Solaris 2.4 Джеффом Бонвиком, а затем и в Linux; однако, поскольку это устаревший метод выделения, в настоящее время он считается устаревшим и может быть вскоре удален из ядра Linux.
Основание
Выделение памяти с помощью слабов снижает частоту очень дорогостоящей (с точки зрения времени процессора) практики инициализации и уничтожения объектов данных ядра, что может превысить стоимость выделения памяти для них. Когда ядро часто создает и удаляет объекты, накладные расходы на инициализацию могут привести к значительному снижению производительности. Кэширование объектов приводит к менее частому вызову функций, инициализирующих состояние объекта: когда объект, выделенный из слаба, освобождается после использования, система выделения слабов обычно сохраняет его в кэше (вместо того, чтобы выполнять его уничтожение), подготавливая к повторному использованию при следующей потребности в объекте этого типа (тем самым избегая работы по созданию и инициализации нового объекта). При использовании выделения слабов, кэш для определенного типа или размера объекта данных содержит несколько предварительно выделенных "слабов" памяти; внутри каждого слаба находятся блоки памяти фиксированного размера, подходящие для этих объектов. Система выделения слабов отслеживает эти блоки, поэтому, когда поступает запрос на выделение памяти для объекта данных определенного типа, она обычно может удовлетворить его, используя свободный слот (блок) из существующего слаба. Когда системе выделения памяти предлагается освободить память объекта, она просто добавляет слот в список свободных (неиспользуемых) слотов соответствующего слаба. Следующий вызов для создания объекта того же типа (или выделения памяти того же размера) вернет этот слот памяти (или другой свободный слот) и удалит его из списка свободных слотов. Этот процесс устраняет необходимость поиска подходящего участка памяти и значительно снижает фрагментацию памяти. В данном контексте, слаб – это одна или несколько смежных страниц памяти, содержащих предварительно выделенные блоки памяти.
Свободные списки
Слэйб представляет собой единичный блок памяти, выделенный кэшу операционной системой, размер которого обычно кратен размеру страницы. Слэйб разделяется на несколько записей, которые кэш предоставляет по запросу клиентского кода для выделения памяти под новые объекты. Поэтому необходимо отслеживать, какие части слэйба свободны для использования, а какие уже заняты. Обычно это делается с помощью "списков свободных блоков": списков свободных записей в слэйбе, готовых для хранения новых объектов. Список свободных блоков может быть реализован как отдельная структура данных, например, массив индексов, указывающих на свободные записи слэйба, или же быть встроенным непосредственно в слэйб. Аллокатор SLUB в Linux хранит список свободных блоков в виде связного списка указателей, каждый из которых размещается непосредственно в свободной области памяти слэйба, которую он представляет.