zoukankan      html  css  js  c++  java
  • 内存池设计

    题目:频繁的内存操作new,delete是比较耗时的操作,为了减少这些操作,一般都会设计自己的内存分配器。一个程序需要频繁使用大小在512Byte到200KByte不定长的内存,请您设计一个高效的内存分配器?
    考虑设计的重要关注点和大致思路,空间使用率等。

    一、结构:
    1) 首先假设内存分配器的最小内存分配单元为mem_unit,需要确定最小分配单元的大小。如果设置太小,将使得内存单元过于琐碎,过大则造成空间浪费。基于这个考虑,设置多个大小类别的mem_unit。申请内存单元时,将分配能够满足该大小的最小内存单元。
    2) 由于同一类别的mem_unit是随机申请的,空间不连续,所以采用单向链表结构管理同一类别的mem_unit。
    3) 为了能够快速定位某一个类别的men_unit_list, 通过对men_unit的size进行hash建立索引。
    基于以上三点考虑,建立的内存分配器结构如下图:



    二、流程
    1) 申请内存
    根据申请内存的大小选择合适的mem_unit, 若相应的mem_unit_list为NULL,则向操作系统申请内存空间,然后构建mem_unit进行分配;若mem_unit_list不为NULL,则从中取出mem_unit进行分配。
    2) 释放内存
    将men_unit添加到相应的mem_list中。

    三、总结
    1) 申请内存时间复杂度为O(1),释放内存时间复杂度为O(1);
    2) 存在空间浪费,单个mem_unit最大浪费4KB;
    3) 只申请内存不释放,因此对于内存波动大的应用空间浪费会比较严重;
    4) 多线程应用时,每个mem_unit_list必须是线程安全的。

  • 相关阅读:
    pstree
    gvisor vfs2
    gvisor entersyscall exitsyscall
    gvisor在arm64下syscall.SIGILL信号处理
    SpringBlade 为id添加自增长属性
    SQL Server Update 一个列的数据为随机数
    SpringBlade Saber 关闭验证码
    SpringBlade Saber 用户列表的新增按钮 是怎么个显示原理
    SpringBlade Saber 切换标签页 不刷新
    SpringBlade 00 常见问题汇总
  • 原文地址:https://www.cnblogs.com/simonote/p/3086996.html
Copyright © 2011-2022 走看看