Из Википедии, бесплатной энциклопедии
  (Перенаправлено из распределителя Slab )
Перейти к навигации Перейти к поиску

Выделение Slab - это механизм управления памятью, предназначенный для эффективного распределения памяти объектов. По сравнению с более ранними механизмами он снижает фрагментацию, вызванную выделением и освобождением. Этот метод используется для сохранения выделенной памяти, содержащей объект данных определенного типа, для повторного использования при последующем распределении объектов того же типа. Он аналогичен пулу объектов , но применяется только к памяти, а не к другим ресурсам.

Распределение Slab было впервые введено в ядре Solaris 2.4 Джеффом Бонвиком . [1] В настоящее время он широко используется во многих Unix и Unix-подобных операционных системах, включая FreeBSD [2] и Linux . [3]

Основа [ править ]

Основная причина выделения slab-файлов заключается в том, что стоимость (в процессоре) инициализации и уничтожения объектов данных ядра может перевесить стоимость выделения для них памяти. [1] Поскольку ядро ​​часто создает и удаляет объекты, накладные расходы на инициализацию могут привести к значительному снижению производительности. Кэширование объектов приводит к менее частому вызову функций, которые инициализируют состояние объекта: когда выделенный блоком объект освобождается после использования, система распределения блоков обычно сохраняет его в кэше (вместо того, чтобы выполнять работу по его уничтожению), готовым для повторного использования в следующий раз объект этого типа необходим (что позволяет избежать работы по созданию и инициализации нового объекта).

При выделении блоков кэш для определенного типа или размера объекта данных имеет ряд заранее выделенных «блоков» памяти; внутри каждой плиты есть блоки памяти фиксированного размера, подходящие для объектов. [4]Распределитель slab отслеживает эти фрагменты, поэтому, когда он получает запрос на выделение памяти для объекта данных определенного типа, обычно он может удовлетворить запрос свободным слотом (фрагментом) из существующего slab. Когда распределителю предлагается освободить память объекта, он просто добавляет слот в список свободных (неиспользуемых) слотов содержащего слэба. Следующий вызов для создания объекта того же типа (или выделения памяти того же размера) вернет этот слот памяти (или какой-либо другой свободный слот) и удалит его из списка свободных слотов. Этот процесс устраняет необходимость поиска подходящего пространства памяти и значительно снижает фрагментацию памяти. В этом контексте slab - это одна или несколько смежных страниц в памяти, содержащих предварительно выделенные фрагменты памяти.

Реализация [ править ]

Для понимания алгоритма размещения плит необходимо определить и объяснить некоторые термины:

  1. Кэш : кеш представляет собой небольшой объем очень быстрой памяти. Кэш - это хранилище для определенного типа объекта , такого как семафоры , дескрипторы процессов , файловые объекты и т. Д.
  2. Slab : slab представляет собой непрерывный фрагмент памяти, обычно состоящий из нескольких физически смежных страниц. Slab - это фактический контейнер данных, связанных с объектами определенного типа содержащего кеша.

Когда программа устанавливает кэш, она выделяет ряд объектов для блоков, связанных с этим кешем. Это количество зависит от размера связанных плит.

Плиты могут находиться в одном из следующих состояний:

  1. пустой  - все объекты на плите отмечены как свободные
  2. частичная  - плита состоит как из бывших в употреблении, так и из свободных объектов
  3. полный  - все объекты на плите помечены как использованные

Первоначально система отмечает каждую плиту как «пустую». Когда процесс вызывает новый объект ядра, система пытается найти свободное место для этого объекта на частичном слэбе в кэше для этого типа объекта. Если такого расположения не существует, система выделяет новый блок из смежных физических страниц и назначает его кэш-памяти. На этой плите выделяется новый объект, и его расположение помечается как «частичное».

Распределение происходит быстро, потому что система строит объекты заранее и легко размещает их из плиты.

Плиты [ править ]

Slab - это величина, на которую кеш может увеличиваться или уменьшаться. Он представляет собой одно выделение памяти для кэша с машины, размер которого обычно кратен размеру страницы . Блок должен содержать список свободных буферов (или bufctls), а также список выделенных bufctls (в случае большого размера блока). [ необходима цитата ]

Большие плиты [ править ]

Они предназначены для кешей, в которых хранятся объекты, размер которых составляет не менее 1/8 размера страницы для данной машины. Причина того, что большие плиты имеют разную компоновку по сравнению с маленькими плитами, заключается в том, что это позволяет большим плитам лучше упаковываться в единицы размера страницы, что помогает с фрагментацией. Slab содержит список bufctl, которые являются просто контроллерами для каждого буфера, который может быть выделен (буфер - это память, которую будет использовать пользователь распределителя slab).

Маленькие плиты [ править ]

Маленькие плиты содержат объекты, размер которых меньше 1/8 размера страницы для данной машины. Эти небольшие блоки необходимо оптимизировать дальше от логической схемы, избегая использования bufctls (которые были бы такими же большими, как и сами данные, и вызывали бы гораздо большее использование памяти). Небольшой блок представляет собой ровно одну страницу и имеет определенную структуру, которая позволяет избежать ошибок. Последняя часть страницы содержит «заголовок плиты», который представляет собой информацию, необходимую для удержания плиты. Начиная с первого адреса этой страницы, имеется столько буферов, сколько может быть выделено без перехода в заголовок slab в конце страницы.

Вместо использования bufctls мы используем сами буферы для хранения свободных ссылок на список. Это позволяет обойти bufctl небольшой плиты. [1]

Системы, использующие размещение плит [ править ]

  • AmigaOS (введена в AmigaOS 4 )
  • DragonFly BSD (представлен в версии 1.0)
  • FreeBSD (введено в 5.0)
  • GNU Mach [5]
  • Хайку (введено в альфа-версии 2)
  • Horizon ( микроядро Nintendo Switch ) [6]
  • HP-UX (введено в 11i) [7]
  • Linux (представленный в ядре 2.2, некоторые дистрибутивы используют метод выделения SLUB поверх SLAB, но SLAB имеет лучшую производительность NUMA [8] ) - В Linux распределение slab обеспечивает своего рода интерфейс для зонированного партнера по распределению для этих разделов ядра которые требуют более гибкого распределения памяти, чем стандартный размер страницы 4 КБ
  • NetBSD (введено в 4.0)
  • Solaris (введено в 2.4)
  • Perl 5 компилятор использует плиту распределитель для внутреннего управления памятью [9] [10]
  • Memcached использует выделение slab для управления памятью
  • иллюзия

См. Также [ править ]

  • Выделение блоков фиксированного размера
  • Пул памяти
  • SLOB
  • SLUB

Примечания [ править ]

  1. ^ a b c Джефф Бонвик , Распределитель плит: распределитель памяти ядра с кэшированием объектов (1994)
  2. ^ Руководство разработчика ядра FreeBSD
  3. ^ М. Тим Джонс, Анатомия распределителя Slab Linux. Архивировано 2 октября 2013 г. на Wayback Machine.
  4. ^ Авраам Зильбершатц и др. : Понятия операционной системы . Wiley: 2004. ISBN  0-471-69466-5.
  5. ^ "Документация GNU Mach Allocator" .
  6. ^ "Безопасность консоли - Переключатель (34c3)" . media.ccc.de . Проверено 28 декабря 2017 .
  7. ^ Крис Купер и Крис Мур, HP-UX 11i Internals , Upper Saddle River, Нью-Джерси: Prentice Hall PTR, 2004, ISBN 0-13-032861-8 , стр. 334 . 
  8. ^ Хатчинс, Бен (29 марта 2012). «Re: CONFIG_SLAB = y в ядре 3.2» .
  9. ^ "Perl5-Porters Weekly: 2012 17 июня" . Проверено 18 ноября 2012 года .
  10. ^ Бонвик, Джефф. «Журналы и Vmem: расширение Slab Allocator на многие процессоры и произвольные ресурсы» . USENIX 2001 . Проверено 18 ноября 2012 года .

Внешние ссылки [ править ]

  • Страница справочника FreeBSD uma (9)
  • Комментарий распределителя SLUB об управлении slabs в Linux двумя разными распределителями: распределителем SLUB и распределителем SLAB
  • Memory Compaction v7 (набор исправлений для Linux от Мела Гормана для решения проблем фрагментации и сжатия SLAB, 2 апреля 2010 г.)
  • Обнаружение утечек памяти ядра Джонатан Корбет, Linux Weekly News, 2006; включает комментарии пользователей о сборке мусора
  • Производительность Linux: Linux становится слишком медленным и раздутым? На SLAB и SLUB. Журнал свободного программного обеспечения 2010 г.
  • [1] - включает slabtopутилиту для отображения информации о кеш-памяти ядра в реальном времени.