博客
关于我
loki::allocator
阅读量:161 次
发布时间:2019-02-27

本文共 1661 字,大约阅读时间需要 5 分钟。

Loki::Allocator 的结构与实现

1. Loki::Allocator 的结构

Loki::Allocator 是由 C++ 编委会成员开发的一款内存分配器,其代码版本为 0.1.7,虽然从未正式发布,但其设计思路和实现方法值得学习。相比于标准的 std::alloc,Loki::Allocator 具有独特的内存管理方式,能够有效地进行内存回收和分配操作。

Loki::Allocator 可以划分为三个嵌套结构:从底到顶分别为 ChunkFixedAllocatorSmallObjAllocator。这些结构共同协同,负责内存的分配与管理。

2. Loki::Allocator 的使用实例

在实际应用中,Loki::Allocator 通常用于管理大块不带 cookie 的内存分配。其操作过程可以通过以下示意图理解:

Chunk -> FixedAllocator -> SmallObjAllocator

如上图所示,Chunk 是内存管理的基本单元,FixedAllocator 负责对大块内存的分配管理,而 SmallObjAllocator 则负责小块内存的分配。

3. Loki::Allocator 的实现细节

3.1 Chunk 实现

Chunk 是内存管理的最小单元,其主要实现包括以下几个关键函数:

  • Chunk::Allocate()

    • 通过 firstAvailableBlock 的序号和 pData 的位置计算分配内存的起始地址。
    • 减少 blocksAvailableBlock_ 的存量。
  • Chunk::Deallocate()

    • firstAvailableBlock_ 更新为 p 的序号。
    • 增加 blocksAvailableBlock_ 的存量。
  • 3.2 FixedAllocator 实现

    FixedAllocator 负责对大块内存的分配与释放。其核心逻辑包括以下步骤:

  • Allocate()

    • 如果当前 Chunk 中仍有可用的内存空间,则直接分配。
    • 如果没有可用空间,则遍历所有 Chunk,寻找可用的内存空间。
    • 如无可用空间,则申请新内存块并初始化为 Chunk。
  • Deallocate()

    • 调用 VicinityFind(p) 函数,定位需要释放的内存块所在的 Chunk。
    • 调用 Chunk::Deallocate(p) 进行内存回收。
    • 调用 Chunk::Release() 将内存归还给操作系统。
  • 3.3 VicinityFind 与 DoDeallocate
    • VicinityFind(p)

      • 通过从 deallocChunk 向上和向下暴搜,找到 p 所在的 Chunk。
      • 检查 deallocChunk 是否为当前 Chunk。
      • 如果 p 不在当前 Chunk 内,则导致死循环(这是一个已知 bug)。
    • DoDeallocate()

      • 调用 Chunk::Deallocate(p)
      • 调用 Chunk::Release() 将内存归还给操作系统。

    4. Loki::Allocator 的总结

    尽管 Loki::Allocator 从未正式发布,但其设计思路和实现方法仍具有参考价值:

  • 优点

    • 采用简单暴力方式实现内存管理。
    • 使用数组代替链表,通过索引提升效率。
    • 具备 Deferring 功能,即可延迟内存归还给操作系统。
    • 能够支持不大于最大块大小的所有内存分配需求。
  • 缺点

    • 存在一些 bug,如 VicinityFindDoDeallocate 中的死循环问题。
    • 实现方式略显暴力,不够优雅。
  • 与 std::alloc 对比

    • Loki::Allocator 的内存管理方式更为透明,能够准确判断是否有内存可用。
    • 它支持所有不大于最大块大小的内存分配需求,而 std::alloc 则有限制。
  • 总的来说,Loki::Allocator 在内存管理方面展现出了一种独特的思路,值得在内存管理领域进一步研究和探索。

    转载地址:http://qcbb.baihongyu.com/

    你可能感兴趣的文章
    Objective-C实现CIC滤波器(附完整源码)
    查看>>
    Objective-C实现circle sort圆形排序算法(附完整源码)
    查看>>
    Objective-C实现CircularQueue循环队列算法(附完整源码)
    查看>>
    Objective-C实现clearBit清除位算法(附完整源码)
    查看>>
    Objective-C实现climbStairs爬楼梯问题算法(附完整源码)
    查看>>
    Objective-C实现cocktail shaker sort鸡尾酒排序算法(附完整源码)
    查看>>
    Objective-C实现cocktailShakerSort鸡尾酒排序算法(附完整源码)
    查看>>
    Objective-C实现CoinChange硬币兑换问题算法(附完整源码)
    查看>>
    Objective-C实现collatz sequence考拉兹序列算法(附完整源码)
    查看>>
    Objective-C实现Collatz 序列算法(附完整源码)
    查看>>
    Objective-C实现comb sort梳状排序算法(附完整源码)
    查看>>
    Objective-C实现combinationSum组合和算法(附完整源码)
    查看>>
    Objective-C实现combinations排列组合算法(附完整源码)
    查看>>
    Objective-C实现combine With Repetitions结合重复算法(附完整源码)
    查看>>
    Objective-C实现combine Without Repetitions不重复地结合算法(附完整源码)
    查看>>
    Objective-C实现conjugate gradient共轭梯度算法(附完整源码)
    查看>>
    Objective-C实现connected components连通分量算法(附完整源码)
    查看>>
    Objective-C实现Connected Components连通分量算法(附完整源码)
    查看>>
    Objective-C实现Convex hull凸包问题算法(附完整源码)
    查看>>
    Objective-C实现convolution neural network卷积神经网络算法(附完整源码)
    查看>>