博客
关于我
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/

    你可能感兴趣的文章
    numpy学习笔记3-array切片
    查看>>
    numpy数组替换其中的值(如1替换为255)
    查看>>
    numpy数组索引-ChatGPT4o作答
    查看>>
    NUMPY矢量化np.prod不能构造具有超过32个操作数的ufunc
    查看>>
    Numpy矩阵与通用函数
    查看>>
    numpy绘制热力图
    查看>>
    numpy转PIL 报错TypeError: Cannot handle this data type
    查看>>
    Numpy闯关100题,我闯了95关,你呢?
    查看>>
    Nutch + solr 这个配合不错哦
    查看>>
    NuttX 构建系统
    查看>>
    NutUI:京东风格的轻量级 Vue 组件库
    查看>>
    NutzCodeInsight 2.0.7 发布,为 nutz-sqltpl 提供友好的 ide 支持
    查看>>
    NutzWk 5.1.5 发布,Java 微服务分布式开发框架
    查看>>
    NUUO网络视频录像机 css_parser.php 任意文件读取漏洞复现
    查看>>
    Nuxt Time 使用指南
    查看>>
    NuxtJS 接口转发详解:Nitro 的用法与注意事项
    查看>>
    NVelocity标签使用详解
    查看>>
    NVelocity标签设置缓存的解决方案
    查看>>
    Nvidia Cudatoolkit 与 Conda Cudatoolkit
    查看>>
    NVIDIA GPU 的状态信息输出,由 `nvidia-smi` 命令生成
    查看>>