Как понять «Вы можете использовать распределитель кэша slab (например, kmem_cache_create или kmem_cache_create_usercopy) для выделения множества одинаковых объектов»? - PullRequest
0 голосов
/ 20 июня 2020

Согласно документации (https://www.kernel.org/doc/html/latest/core-api/memory-allocation.html), в которой говорится [выделено мной]:

Если вам нужно выделить много одинаковых объектов вы может использовать распределитель кэша slab . Кэш должен быть настроен с помощью kmem_cache_create () или kmem_cache_create_usercopy (), прежде чем его можно будет использовать. Вторую функцию следует использовать, если часть кеша может быть скопирована в пользовательское пространство. После создания кеша kmem_cache_allo c () и его удобные оболочки могут выделять память из этого кеша.

Что означает «выделить много идентичных объектов»? Почему я не мог использовать kmalloc, kvmalloc, vmalloc и др. c при таких обстоятельствах?

1 Ответ

1 голос
/ 20 июня 2020

Под «выделить много одинаковых объектов» они подразумевают выделение множества объектов одного типа .

Почему я не мог использовать kmalloc, kvmalloc, vmalloc и др. c. при таких обстоятельствах?

Вы можете использовать их, но специальный распределитель кеша (созданный kmem_cache_create) имеет несколько преимуществ. Среди них:

  1. Меньшее потребление памяти на объект.

    При выделении объектов из собственного распределителя кеша фактический выделенный размер может быть меньше единицы выделено kmalloc. Это связано с тем, что каждый распределитель кэша может выделять объект только определенного c размера.

    kmalloc также выделяет объекты из распределителей кеша, но он использует распределитель предопределенных размеров . Скажем, kmalloc имеет распределители для размеров 4K и 8K. Когда он выделяет объект размером, например, 5 КБ, он использует распределитель 8 КБ. То есть 3 Кбайт выделенного пространства - это пустая трата.

  2. Локализация сбоев.

    Если ваш собственный кеш будет поврежден (например, double-free ), это повреждение повлияет только на размещение ваших собственных объектов. Существует высокая вероятность того, что другие распределители останутся работоспособными.

  3. Более простая отладка сбоев.

    Если Linux ядро ​​сообщает о повреждении вашего собственного распределителя кэша, вы знать, откуда следует начинать отладку: скорее всего, это код, который работает с данным кешем.

  4. Умная инициализация при выделении.

    При выделении объекта вы скорее всего захочется, чтобы его инициализировали, то есть установили его поле в начальные значения. Обычно (при использовании kmalloc) вам нужно инициализировать объект каждый раз, когда он выделяется.

    Но если поля вашего объекта имеют начальные значения в то время, когда вы освобождаете объект, вы больше не необходимо инициализировать этот объект, будет ли он выделен снова. Распределитель кеша предоставляет возможность пропустить инициализацию уже инициализированного объекта через его конструктор (ctor параметр). Если объект выделяется впервые, конструктор вызывается автоматически. Если объект был выделен ранее (и освобожден), конструктор не вызывается.

    Например, файловая система ext4 использует конструкторы Большие и сложные файловые системы используют конструкторы для выделения Linux ядра использует конструкторы, например, для inodes

Конечно, создание распределителя принесет небольшую пользу, когда вам нужно выделить всего 5 небольших объектов: сам распределитель потребляет память, а создание распределителя занимает время.

Но если вам нужно выделить 100 объектов, было бы неплохо создать для них распределитель.

...