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必须是线程安全的。

  • 相关阅读:
    关于VFP9.0备注字段(memo)插入编辑问题
    asp.net core EF数据库生成模型
    asp.net Core Autofac IOC 属性注入
    CSS完美实现iframe高度自适应(支持跨域)
    改良版的SQL Service 通用存储过程分页
    Sql Service存储过程分页
    C#Excel导出导入
    C#文件压缩
    DataTable转换实体类
    C#Base64加密
  • 原文地址:https://www.cnblogs.com/simonote/p/3086996.html
Copyright © 2011-2022 走看看