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

  • 相关阅读:
    微服务之SpringCloud基础
    java 多线程学习
    tomcat性能优化
    js模块化规范
    jsonp及cors
    es6之各种数据类型的扩展
    es6之Promise
    es6之Set和Map
    es6之Generator
    es6之Iterator
  • 原文地址:https://www.cnblogs.com/simonote/p/3086996.html
Copyright © 2011-2022 走看看