【发布时间】:2014-03-13 05:49:34
【问题描述】:
kmem_cache_alloc 和kmalloc() 在内核内存分配上有什么区别?什么时候用?
【问题讨论】:
-
kmem_cache 函数在Linux Device Drivers
标签: linux-kernel
kmem_cache_alloc 和kmalloc() 在内核内存分配上有什么区别?什么时候用?
【问题讨论】:
标签: linux-kernel
Kmalloc - 从物理内存分配连续区域。但请记住,分配和释放内存需要大量工作。
Kmem_cache_alloc - 在这里,您的进程保留一些预分配的预定义大小对象的副本。假设您有一个结构,您知道您将非常频繁地需要它,因此您不需要在需要时从主内存 (kmalloc) 分配它,而是已经分配了它的多个副本,当您需要它时,它会返回已分配的块(节省大量时间)。同样,当你释放它时,你不会把它还给它,它实际上并没有被释放,它会回到分配的池中,这样如果某个进程再次请求它,你可以返回已经分配的这个地址结构。
【讨论】:
kmalloced 内存也会返回到池中,而不是完全释放,不是吗?
kmalloc:它使用可用于任何内核代码的通用平板缓存。所以你的模块将与内核中的其他组件共享slab缓存。
kmem_cache_alloc:它将从由kmem_cache_create 创建的专用slab 缓存中分配对象。如果您特别想要一个更好的平板缓存管理专用于您的模块,也适用于特定类型的对象,请使用 kmem_cache_create 后跟 kmem_cache_alloc。 USB/SCSI 驱动程序使用它。 kmem_cache_create 获取您要创建slab 的对象的大小、出现在/proc/slabinfo 中的名称和用于管理slab 缓存行为的标志。
参考:https://www.mail-archive.com/kernelnewbies@nl.linux.org/msg13191.html & LDD
【讨论】: