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

    你可能感兴趣的文章
    PHP判断数组是否有重复值、获取重复值
    查看>>
    springboot基于Web的社区留守儿童管理系统源码毕设+论文
    查看>>
    Springboot基于Redisson实现Redis分布式可重入锁【案例到源码分析】
    查看>>
    PHP利用正则表达式实现手机号码中间4位用星号(*)替换显示
    查看>>
    PHP加密与安全的最佳实践
    查看>>
    PHP加速器eaccelerator导致php-fpm进程卡死原因分析
    查看>>
    PHP区分 企业微信浏览器 | 普通微信浏览器 | 其他浏览器
    查看>>
    php原生代码怎么连表查询,PHP tp5中使用原生sql查询代码实例
    查看>>
    PHP去掉转义符
    查看>>
    php去除字符串开头或末尾的字符(例如逗号)
    查看>>
    php反射api
    查看>>
    PHP反射ReflectionClass、ReflectionMethod 入门教程
    查看>>
    PHP反射机制
    查看>>
    php取当天的最后一秒_Docker快速搭建PHP开发环境详细教程
    查看>>
    php取绝对值
    查看>>
    PHP变量内容的获取
    查看>>
    php各种常用的算法
    查看>>
    php各种缓存策略对比
    查看>>
    RabbitMQ高级特性 - 消息分发(限流、负载均衡)
    查看>>
    php后台“爬虫”模拟登录第三方系统
    查看>>