最近面试c++的时候,被问到c++内存管理模型,没用过。回来看了下《STL源码解析》,这里简单总结下,不涉及具体实现。感兴趣同学可以下载电子书自己看下。

SGI版本的空间适配器设计哲学:

  1. 向system heap 要求空间。
  2. 考虑多线程状态。
  3. 考虑内存不足时的应变措施。
  4. 考虑过多“小型区块”可能造成的内存碎片(fragment)问题。

考虑到小型区块可能造成的内存碎片问题,SGI设计了双层级配置器,第一级配置器直接使用malloc()和free(),第二级配置器则视情况采用不用的策略:当配置区块超过128字节时,视之为"足够大",便调用第一级配置器;当配置区块小于128字节时,视之为“过小”,为了降低额外负担,便采用复杂的内存池整理方式,而不再求助于第一级配置器。

一、二级配置器的关系,接口包装如下图:

第一级配置器以malloc(), free(), realloc()等C函数执行实际的内存配置、释放、重配置操作。

第二级配置器多了一些机制,避免太多小额区块造成内存的碎片。小额区块带来的其实不仅是内存碎片,配置时的额外负担也是一个大问题。额外负担永远无法避免,但是区块愈小,额外负担所占的比例就愈大,愈显得浪费。这里的额外负担指的是分配的内存需要一段信息保存内存的大小、下一个节点指针等额外信息。

SGI第二级配置器的做法是,如果区块够大,超过128字节时,就移交第一级配置器处理。当区块小于128字节时,则以内存池管理,此法又称为次层配置:每次配置一大块内存,并维护对应之自由链表(free-list)。下次若再有相同大小的内存需求,就直接从free-lists中拔出。如果客户端释放小额区块,就由配置器回收到free-lists中。为了方便管理,SGI第二级配置器会主动将任何小额区块的内存需求量上调至8的倍数,并维护16个free-lists,各自管理大小为8,16,24,32....128的小额区块。逻辑图如下:

分配内存首先判断区块大小,大于128字节就直接调用第一级配置器,小于128字节就检查对应的自由链表free-lists。如果自由链表中有可用的区块,就直接拿来使用,如果没有可用区块,则需要重新填充空间。释放的时候,首先判断区块大小,大于128字节就调用第一级配置器,小于128就找出对应的自由链表,将区块回收。

当发现自由链表中没有可用区块了时,需要为自由链表重新填充空间。新的空间将取自内存池。缺省取得20个新节点,但万一内存池空间不足,获得节点数可能小于20。内存池如果水量充足,则直接分配20个区块给free-list 。如果水量不足20个,但超过1个以上,就拨出这不足20个区块的空间出去。如果内存池连一个区块空间都无法供应,此时需要利用malloc()从heap中配置内存,为内存池注入活水以应付需求。新水量的大小为需求量的两倍,再加上一个随着配置次数增加而愈来愈大的附加量。

万一山穷水尽,整个system heap空间不够了,malloc行动失败,则四处查找有无“尚有未用区块,且区块够大”的free list,找到了就挖一块,找不到就调用第一级配置器。第一级配置器其实也是使用malloc来配置内存,但它有out-of-memory处理机制,或许有机会释放其它的内存拿来此处使用,如果可以,就成功,否则发出bad_alloc异常。

以上就是整个第二级空间配置器的设计。

总结来说:第一级负责分配大内存,直接使用malloc,第二级使用内存池加上自由链表来分配。

参考资料:

1. 《STL源码剖析》侯捷

=============================================================================================

Linux应用程序、内核、驱动、后台开发交流讨论群(745510310),感兴趣的同学可以加群讨论、交流、资料查找等,前进的道路上,你不是一个人奥^_^。

面试浅谈 c++ 的空间两级配置器相关推荐

  1. 面试浅谈之十大排序算法

    面试浅谈之十大排序算法 HELLO,各位博友好,我是阿呆

  2. PHP字符串转数字面试,浅谈php字符串反转 面试中经常遇到的问题

    下面小编就为大家分享一篇浅谈php字符串反转 面试中经常遇到的问题,具有很好的参考价值,希望对大家有所帮助.一起跟随小编过来看看吧 1.单字节字符串反转 php提供了用于字符串反转的函数strrev( ...

  3. Ybtoj 最优密码 单调队列(浅谈)树状数组 两种解法

    作者:hsez_yyh 链接:https://blog.csdn.net/yyh_getAC/article/details/123956399  来源:湖北省黄石二中竞赛组  著作权归作者所有.商业 ...

  4. [前端面试] 浅谈SPA、SEO、SSR

    原文作者:staneyffer 原文链接:浅谈SPA.SEO.SSR 前后端分离算是最近Web开发的大趋势了,目前已经有大量的公司使用了前后端分离的开发方式.那我们就来大概谈谈前后端分离开发中必须要了 ...

  5. 浅谈优秀程序员电脑环境配置

    下面浅谈下程序员的电脑环境配置: 图标显示方式 作为程序员 我们应该掌控软件的所有信息,这样我们看不到后缀名 之类的,对于我们很不方便.按下面操作我们就可以解决这个问题. 我们还应该把后缀名显示出来方 ...

  6. 浅谈汽车车载导航仪GPS地图安装配置常见错误的解决方法(如提示缺少Style.ini等)

    如今汽车GPS导航仪产品已经非常成熟了,根据功能的多少价钱基本在600-2800元之间,一般而言,家庭买一款800元左右的导航仪已经足够用了. 现在以中关村最常见的e道航为例,简要谈一谈GPS外置SD ...

  7. 心情随笔,浅谈软件开发工作两年感悟与想法(中)

    前言:(现状)         前一篇文章记录了前女友结婚的心路历程,虽然早已经明白,我选择了离开老家城市,那么就注定与她无缘了.但还是很可惜,不过依旧祝她幸福.(要是不幸福,还可以回来找我,哈哈)这 ...

  8. 【JAVAEE框架】浅谈 Spring 框架的两大核心思想 AOP 与 IOP

    哈喽~大家好呀,这篇来看看Spring 框架的两大核心思想.

  9. 欧拉回路/路径浅谈(七桥问题,两种算法)

    文章目录 前言 引子 欧拉回路/路径 定义 欧拉路径 欧拉回路 无向图(连通) 欧拉回路-无向 欧拉路径-无向 有向图(连通) 欧拉回路-有向 欧拉路径-有向 注意事项 算法 Fluery算法 Hie ...

最新文章

  1. tomcat高并发的配置
  2. DCMTK:OFStandard类中的ASCII /双转换方法的测试代码
  3. javascript php 性能,浅谈页面装载js及性能分析方法_javascript技巧
  4. 力扣 独一无二的出现次数
  5. 【BZOJ2655】—calc(拉格朗日插值+生成函数+dp)
  6. python数据结构-列表-1
  7. (一)Protobuf的Java使用
  8. linux重启tomcat命令
  9. iOS9.3描述文件怎么安装
  10. HTML 页面 meta 的作用
  11. windows释放GPU内存方法
  12. 汇编语言-实验5(学习打卡Day10)
  13. 20221118-数学函数图像在线工具推荐
  14. Office2016打开文件提示“文件已损坏”,WPS打开却正常的解决办法
  15. 键盘修改器,绝对管用
  16. wordpress最佳架构_如何在2019年选择WordPress主题:最佳选择
  17. QQ坦白说代码信息获取过滤代码讲解
  18. 淘宝发布 18 年 18 件“时代宝贝”:胶卷、万能充、MP3 等
  19. 手机拍照技巧:全景拍摄,让手机拍出的照片妙趣横生
  20. 如何使用正则表达式匹配一个空格

热门文章

  1. [转]阿拉伯数字转一二三和壹贰叁
  2. python六角星绘制_一小时销量破百万,Python告诉你周杰伦的《Mojito》到底有多火!...
  3. 用神经网络学习Fe原子光谱并反向求导计算权重
  4. 4.7 参数 vs 超参数-深度学习-Stanford吴恩达教授
  5. vivado SOC——hello word(上)建立SOC系统
  6. 【预告】新房装修网络规划网络布局学习笔记,家庭网络需求文章内容及结构...
  7. 【测试】有道云笔记数据导出备份功能体验测试
  8. Linux内核功能及架构
  9. 使用Notepad++工具查看文件的十六进制
  10. 基于FPGA的OLED屏幕开发