Под «выделить много одинаковых объектов» они подразумевают выделение множества объектов одного типа .
Почему я не мог использовать kmalloc
, kvmalloc
, vmalloc
и др. c. при таких обстоятельствах?
Вы можете использовать их, но специальный распределитель кеша (созданный kmem_cache_create
) имеет несколько преимуществ. Среди них:
Меньшее потребление памяти на объект.
При выделении объектов из собственного распределителя кеша фактический выделенный размер может быть меньше единицы выделено kmalloc
. Это связано с тем, что каждый распределитель кэша может выделять объект только определенного c размера.
kmalloc
также выделяет объекты из распределителей кеша, но он использует распределитель предопределенных размеров . Скажем, kmalloc
имеет распределители для размеров 4K и 8K. Когда он выделяет объект размером, например, 5 КБ, он использует распределитель 8 КБ. То есть 3 Кбайт выделенного пространства - это пустая трата.
Локализация сбоев.
Если ваш собственный кеш будет поврежден (например, double-free ), это повреждение повлияет только на размещение ваших собственных объектов. Существует высокая вероятность того, что другие распределители останутся работоспособными.
Более простая отладка сбоев.
Если Linux ядро сообщает о повреждении вашего собственного распределителя кэша, вы знать, откуда следует начинать отладку: скорее всего, это код, который работает с данным кешем.
Умная инициализация при выделении.
При выделении объекта вы скорее всего захочется, чтобы его инициализировали, то есть установили его поле в начальные значения. Обычно (при использовании kmalloc
) вам нужно инициализировать объект каждый раз, когда он выделяется.
Но если поля вашего объекта имеют начальные значения в то время, когда вы освобождаете объект, вы больше не необходимо инициализировать этот объект, будет ли он выделен снова. Распределитель кеша предоставляет возможность пропустить инициализацию уже инициализированного объекта через его конструктор (ctor
параметр). Если объект выделяется впервые, конструктор вызывается автоматически. Если объект был выделен ранее (и освобожден), конструктор не вызывается.
Например, файловая система ext4 использует конструкторы Большие и сложные файловые системы используют конструкторы для выделения Linux ядра использует конструкторы, например, для inodes
Конечно, создание распределителя принесет небольшую пользу, когда вам нужно выделить всего 5 небольших объектов: сам распределитель потребляет память, а создание распределителя занимает время.
Но если вам нужно выделить 100 объектов, было бы неплохо создать для них распределитель.