slab 内存管理在现代C++中的应用

   大四一段时间曾经学习过 Linux 内核的一小部分,自然读过大名鼎鼎的 slab 内存管理;后来又看了看<Modern C++ Design>中的 Small Object Allocator, 觉得它们在原理上大致相同。这里仅将其基本原理简单介绍一下,以飨读者。
    1. 先说 slab
    Linux 的 slab 内存管理由两个部分组成,一是所谓的 cache, 再就是 slab;每一种数据结构对应一个 cache,举例来说,struct task_struct (这个结构非常大,就是所谓的进程控制块)对应 taskstruct_cachep, 而这种数据结构在分配内存时就只能从对应的 cache 中分配,也即,要分配一个 struct task_struct, 就只能
kmem_cache_alloc(taskstruct_cachep);总体上,这个 cache 管理着一个对象(object)池,分配内存时,直接从池中取空闲的对象,而释放时则返还给这个对象池,只有在池为空时才向系统申请内存页;所以这个对象池是非常快的。
    这个内存池由一个cache管理,由多个 slab 组成,每个 slab 可以缓存多个对象。注意,slab是固定大小的而且都是一个页的大小(4K), 这是为了计算的方便,后面就会看到。cache 和 slab 的结构如图所示:
                         _________          _________
   cachep----->|  slab         |------>|  slab        |---->......
                     |                 |          |               |
                     |                 |          |               |
                     | object       |           |  object     |
                     | object       |           |  object     |
            (4K)   |___  _____|    (4K)|________|
    一个 slab 又由两部分组成,这个4K的内存块的前面的一小部分是 slab 控制块(Linux 里面稍有不同),紧接着就是一组 object。slab控制块维护着一个指针,指向当前空闲着的对象。当一个对象被释放时,就让这个指针指向这个刚释放的对象;而在申请内
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值