Размещение перекрытия

редактировать

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

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

Содержание

  • 1 Основа
  • 2 Реализация
  • 3 Slabs
    • 3.1 Большие перекрытия
    • 3.2 Маленькие перекрытия
  • 4 Системы, использующие размещение перекрытий
  • 5 См. Также
  • 6 Примечания
  • 7 Внешние ссылки

Основа

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

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

Реализация

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

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

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

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

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

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

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

Slabs

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

Large slabs

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

Маленькие плиты

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

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

Системы, использующие распределение слэба

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

См. Также

Нет es

Внешние ссылки

Последняя правка сделана 2021-06-08 05:22:39
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте