优雅的slab内存分配器(三)——分配和释放内存(kmalloc/kfree)

本文详细介绍了slab内存分配器中的kmalloc和kfree架构,以及关键函数cache_alloc_refill、virt_to_cache、cache_flusharray和free_block的工作原理。在kmalloc中,可能存在空间浪费;而在kfree时,通过一系列操作将对象返回到合适的存储区域。文章还探讨了如何通过object地址获取其所在page,并分析了slab管理流程。
摘要由CSDN通过智能技术生成

代码架构


kmalloc架构

kmalloc
   |----->return __kmalloc(size, flags);
   |   |----->return __do_kmalloc(size, flags, _RET_IP_);
   |   |   |----->return __do_kmalloc(size, flags, _RET_IP_);
   |   |   |   |----->cachep = kmalloc_slab(size, flags);
   |   |   |   |      根据size找到最合适的kmem cache实例
   |   |   |   |----->ret = slab_alloc(cachep, flags, caller);
   |   |   |   |      从slab中分配object
   |   |   |   |   |----->objp = __do_cache_alloc(cachep, flags);
   |   |   |   |   |   |----->return ____cache_alloc(cachep, flags);
   |   |   |   |   |   |   |----->ac = cpu_cache_get(cachep);
   |   |   |   |   |   |   |      获取array cache,ac维护一组object cache
   |   |   |   |   |   |   |----->objp = ac->entry[--ac->avail];
   |   |   |   |   |   |   |      如果array cache有可用的object,则支持返回,否则调用
   |   |   |   |   |   |   |      cache_alloc_refill填充array cache,并分配object
   |   |   |   |   |   |   |----->objp = cache_alloc_refill(cachep, flags);
   |   |   |   |   |   |   |      该函数先查看slab中是否可以分配到object,如果没有则从buddy system
   |   |   |   |   |   |   |      分配slab,并从slab中分配object,详情参考重要函数分析。
   |   |   |   |   |   |   |----->return objp;

我们可以看到kmalloc是分配一个object,object size大于或等于需要分配的空间的size,所以这里会存在挺多的空间浪费。

kfree架构

kfree
  |----->c = virt_to_cache(objp);
  |      根据object地址找到kmem cache实例,详见重要函数分析。
  |----->__cache_free(c, (void *)objp, _RET_IP_);
  |   |----->___cache_free(cachep, objp, caller);
  |   |   |----->cache_flusharray(cachep, ac);
  |   |   |      如果array_cache中的object已经达到上限,则调用该函数将array_cache中的object移入
  |   |   |      shared array cache或者slab中,详见重要函数分析
  |   |   |----->ac->entry[ac->a
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值