linux内存分配 连续 足够,linux内存池能分配连续物理内存吗

中。

size参数:

内核是基于页技术分配内存,以最佳的利用系统的RAM。

linux处理内存分配的方法是:创建一系列的内存对象池,每个池的内存大小事固定的,处理分配请求时,就直接在包含足够大的内存块中传递一个整款给请求者。内核只能分配一些预定义的固定大小的字节数组。kmalloc能处理的的最小内存块是32或者64,不大于128KB。

内存区段:

linux内核把内存分为3个区段:可用于DMA的内存,常规内存以及高端内存。kmalloc不能分配高端内存。内存区段在mm/page_alloc.c中实现。区段的初始化在对应的arch树下的mm/init.c中。

后备高速缓存 (lookaside cache)

内核中普通对象进行初始化所需的时间超过了对其进行分配和释放所需的时间,因此不应该将内存释放回一个全局的内存池,而是将内存保持为针对特定目而初始化的状态。例如,如果内存被分配给了一个互斥锁,那么只需在为互斥锁首次分配内存时执行一次互斥锁初始化函数(mutex_init)即可。后续的内存分配不需要执行这个初始化函数,因为从上次释放和调用析构之后,它已经处于所需的状态中了。

linux2.6中USB和SCSI驱动程序使用了这种高速缓存,是为一些反复使用的块增加某些特殊的内存池。后背高速缓存管理也叫slab分配器,相关函数和类型在中申明。

slab分配器实现高速缓存具有kmem_cache_t类型。

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

unsigned long flags;

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

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

用于创建一个新的高速缓存对象。

constructor用于初始化新分配的对象,destructor用于清除对象。

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

void * kmem_cache_alloc(kmem_cache_t *cache,int flags);

释放内存对象使用kmem_cache_free

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

在内存空间都被释放后,模块被卸载前,驱动程序应当释放他的高速缓存。

int kmem_cache_destory(kmem_cache_t *cache);

要检查其返回状态,如果失败,表明莫块中发生了内存泄露。

基于slab的高速缓存scullc

kmem_cache_t *scullc_cache;

scullc_cache=kmem_cache_creat("scullc",scullc_quantum,0,SLAB_HWCACHE_ALIGN,NULL,NULL);

if(!scullc_cache)

{

scullc_cleanup();

return -ENOMEM;

}

if(!dpte->data[s_pos])

{

dptr->data[s_pos]=kmem_cache_alloc(scullc_cache,GFP_KERNEL);

if(!dptr->data[s_pos])

goto nomem;

memset(dptr->data[s_pos],0,scullc_quantum);

}

for(i=0;idata[i])

kmem_cache_free(scullc_cache,dptr->data[i]);

}

if(scullc_cache)

kmem_cache_destory(scullc_cache);

内存池:

内核中有些地方的内存分配是不允许失败的,为确保能分配成功,内核建立一种称为内存池的抽象,他试图始终保持空闲状态,以便紧急情况使用。

mempool_t * mempool_creat(int min_nr,

mempool_alloc_t *alloc_fn, //对象分分配 mempool_alloc_slab

mempool_free_t *free_fn, //释放 mempool_free_slab

void *pool_data);

可以用如下代码来构造内存池

cache=kmem_cache_creat(...); //创建一个高速缓存

pool=mempool_creat(MY_POOL_MINIMUM,mempool_alloc_slab,mempool_free_slab,cache);//建立内存池对象

void *mempool_alloc(mempool_t *poll,int gfp_mask);//分配对象

void *mempool_free(void *element,mempool_t *poll);//释放对象

void mempool_destroy(mempool_t *poll);//销毁内存池

注意:mempool会分配一些内存块,空闲且不会被用到,造成内存的大量浪费。所以一般情况不要用内存池。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值