如何理解"You can use the slab cache allocator(i.e. kmem_cache_create or kmem_cache_create_usercopy) to allocate many identical objects"?
How to comprehend "You can use the slab cache allocator(i.e. kmem_cache_create or kmem_cache_create_usercopy) to allocate many identical objects"?
根据文档(https://www.kernel.org/doc/html/latest/core-api/memory-allocation.html),它说[强调我的]:
If you need to allocate many identical objects you can use the slab
cache allocator. The cache should be set up with kmem_cache_create()
or kmem_cache_create_usercopy() before it can be used. The second
function should be used if a part of the cache might be copied to the
userspace. After the cache is created kmem_cache_alloc() and its
convenience wrappers can allocate memory from that cache.
"allocate many identical objects"是什么意思?为什么我不能在这种情况下使用 kmalloc
、kvmalloc
、vmalloc
等?
“分配许多相同的对象”是指分配许多相同类型的对象。
Why could not I use kmalloc
, kvmalloc
, vmalloc
, etc. under such circumstances?
您可以使用它们,但特殊的缓存分配器(由 kmem_cache_create
创建)有几个优点。其中:
每个对象的内存消耗更少。
当从自己的缓存分配器分配对象时,实际 分配的大小可能小于 kmalloc
分配的大小。这是因为每个缓存分配器只能分配特定大小的对象。
kmalloc
也从缓存分配器分配对象,但它使用 预定义大小 的分配器。比如说,kmalloc
有 4K 和 8K 大小的分配器。当它分配大小的对象时,例如5K,它使用8K分配器。那就是3K的分配space只是浪费
故障定位。
如果您自己的缓存将被损坏(例如,通过 double-free),这种损坏只会影响您自己对象的分配。其他分配器很有可能保持功能。
更容易调试故障。
如果 Linux 内核报告您自己的缓存分配器损坏,那么您知道应该从哪里开始调试:很可能是与给定缓存一起工作的代码。
分配的巧妙初始化。
在分配对象时,您很可能希望对它进行初始化,即将其字段设置为初始值。通常(当使用 kmalloc
时)你需要在每次 分配时初始化对象 。
但是如果你的对象的字段在你释放对象时有初始值,你不再需要初始化那个对象,它会被再次分配。缓存分配器提供了通过其 constructor(ctor
参数)省略已初始化对象的初始化的能力。如果一个对象是第一次分配,构造函数会被自动调用。如果一个对象之前已经分配(并释放),则不调用构造函数。
例如,ext4 文件系统使用构造函数大型和复杂的文件系统使用构造函数进行分配Linux 内核使用构造函数,例如inodes
当然,当您只需要分配 5 个小对象时创建分配器会有一点好处:分配器本身消耗内存,分配器的创建消耗时间。
但是如果您需要分配 100 个对象,为它们创建一个分配器是个好主意。
根据文档(https://www.kernel.org/doc/html/latest/core-api/memory-allocation.html),它说[强调我的]:
If you need to allocate many identical objects you can use the slab cache allocator. The cache should be set up with kmem_cache_create() or kmem_cache_create_usercopy() before it can be used. The second function should be used if a part of the cache might be copied to the userspace. After the cache is created kmem_cache_alloc() and its convenience wrappers can allocate memory from that cache.
"allocate many identical objects"是什么意思?为什么我不能在这种情况下使用 kmalloc
、kvmalloc
、vmalloc
等?
“分配许多相同的对象”是指分配许多相同类型的对象。
Why could not I use
kmalloc
,kvmalloc
,vmalloc
, etc. under such circumstances?
您可以使用它们,但特殊的缓存分配器(由 kmem_cache_create
创建)有几个优点。其中:
每个对象的内存消耗更少。
当从自己的缓存分配器分配对象时,实际 分配的大小可能小于
kmalloc
分配的大小。这是因为每个缓存分配器只能分配特定大小的对象。kmalloc
也从缓存分配器分配对象,但它使用 预定义大小 的分配器。比如说,kmalloc
有 4K 和 8K 大小的分配器。当它分配大小的对象时,例如5K,它使用8K分配器。那就是3K的分配space只是浪费故障定位。
如果您自己的缓存将被损坏(例如,通过 double-free),这种损坏只会影响您自己对象的分配。其他分配器很有可能保持功能。
更容易调试故障。
如果 Linux 内核报告您自己的缓存分配器损坏,那么您知道应该从哪里开始调试:很可能是与给定缓存一起工作的代码。
分配的巧妙初始化。
在分配对象时,您很可能希望对它进行初始化,即将其字段设置为初始值。通常(当使用
kmalloc
时)你需要在每次 分配时初始化对象 。但是如果你的对象的字段在你释放对象时有初始值,你不再需要初始化那个对象,它会被再次分配。缓存分配器提供了通过其 constructor(
ctor
参数)省略已初始化对象的初始化的能力。如果一个对象是第一次分配,构造函数会被自动调用。如果一个对象之前已经分配(并释放),则不调用构造函数。例如,ext4 文件系统使用构造函数大型和复杂的文件系统使用构造函数进行分配Linux 内核使用构造函数,例如
inodes
当然,当您只需要分配 5 个小对象时创建分配器会有一点好处:分配器本身消耗内存,分配器的创建消耗时间。
但是如果您需要分配 100 个对象,为它们创建一个分配器是个好主意。