Solaris 模块调试器指南

内核内存高速缓存

内核内存分配器会将其管理的内存分为一组高速缓存。 所有分配都是从这些高速缓存(通过 kmem_cache_t 数据结构表示)实现的。每个高速缓存都具有固定的缓冲区大小,表示该高速缓存可提供的最大分配空间。 每个高速缓存都具有一个指明其管理的数据类型的字符串名称。

一些内核内存高速缓存具有特殊用途,并会进行初始化以便仅分配特定种类的数据结构。 "thread_cache" 即是此类高速缓存的一个示例,它仅分配 kthread_t 类型的结构。 这些高速缓存中的内存通过 kmem_cache_alloc() 函数分配给客户机,并且通过 kmem_cache_free() 函数释放。


注意 –

kmem_cache_alloc()kmem_cache_free() 不是公共的 DDI 接口。请勿编写依赖于这些接口的代码,因为将来的 Solaris 发行版中可能会更改或删除这些接口。


名称以 "kmem_alloc_" 开头的高速缓存可实现内核的常规内存分配方案。 这些高速缓存为 kmem_alloc(9F)kmem_zalloc(9F) 的客户机提供内存。 其中的每个高速缓存都满足大小介于此类高速缓存的缓冲区大小和第二小的高速缓存的缓冲区大小之间的请求。 例如,内核具有 kmem_alloc_8kmem_alloc_16 高速缓存。 在这种情况下,kmem_alloc_16 高速缓存可处理大小为 9-16 个字节内存的所有客户端请求。 请记住,无论客户端请求的大小是多少,kmem_alloc_16 高速缓存中每个缓冲区的大小均为 16 个字节。对于大小为 14 个字节的请求,所得到缓冲区中有两个字节是未使用的,因为该请求是从 kmem_alloc_16 高速缓存得到满足的。

最后一组高速缓存是指由内核内存分配器在内部使用以对其自身进行记录的高速缓存。 这包括名称以 "kmem_magazine_" 或 "kmem_va_"、kmem_slab_cachekmem_bufctl_cache 等开头的那些高速缓存。