后备高速缓存

设备驱动程序常常会反复地分配很多同一大小的内存块。既然内核已经维护了一组拥有同一大小内存块的内存池,那么为什么不为这些反复使用的块增加某些特殊的内存池呢?实际上,内核的确实现了这种形式的内存池,通常称为后备高速缓存。设备驱动程序通常不会涉及这种使用后备高速缓存的内存行为,但也有例外,linux2.6中的USB和SCSI驱动程序就使用了这种高速缓存。

Linux内核的高速缓存管理有时称为“slab分配器”。slab分配器实现的高速缓存具有kmem_cache_t类型,可通过调用kmem_cache_create创建:

kmem_cache_t *kmem_cache_create(const char *name,size_t size,

                                                            size_t offset, unsigned long flags,

                                                            void (*constructor)(void *,kmem_cache_t *, unsigned long flags),

                                                             void (*destructor)(void *,kmem_cache_t,unsigned long flags));

该函数创建一个新的高速缓存对象,其中可以容纳任意数目的内存区域,这些区域的大小相同,由size参数指定。参数name与这个高速缓存相关联,其功能是保管一些信息以便跟踪问题,它通常被设置为将要高速缓存的结构类型的名字。高速缓存保留指向该名称的指针,而不是复制其内容,因此驱动程序应该指向静态存储的指针给这个函数,名称中不能包含空白。

offset参数是页面中第一个对象的偏移量,它可以用来确定对已分配的对象进行某种特殊的对齐,但是最常用的就是0,表示使用默认值。flags控制如何完成分配,是一个位掩码 。constructor和destructor是可选参数;前者用于初始化新分配的对象,而后者用于“清除”对象——在内存空间被释放给系统之前。

 

一旦某个对象的高速缓存被创建,就可以调用kmem_cache_alloc从中分配内存对象:

void ×kmem_cache_alloc(Kmem_cache_t *cache,int flag);

这里参数cache是先前创建的高速缓存;参数flags和传递给kmalloc的相同,并且当需要分配更多内存来满足kmem_cache_alloc时,高速缓存还会利用这个参数。

 

释放一个内存对象时调用kmem_cache_free:

void kmem_cache_free(kmem_cache_t *cache,consti void * obj);

 

 

如果驱动程序代码中和高速缓存有关的部分已经处理完了,这时驱动程序应该释放它的高速缓存:

int  kmem_cache_destroy(kmem_cache_t *cache);

这个释放操作只有在已将从缓存中分配的所有对象都归还后才能成功,所以,模块应该检查kmem_cache_destroy的返回值;如果失败,则表明模块发生了内存泄漏。

使用后备式缓存带来的另一个好处是内核可以统计高速缓存的使用情况。高速缓存的使用情况可以从/proc/slabinfo 获得。

 

 

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值