前端分配器(Front End Allocator)是后端分配器(Back End Allocator)的一个抽象优化层。 通过允许有不同类型的前端分配器,有着不同内存需求的应用程序可以选择合适的分配器。 例如,如果一个应用程序会存在频繁的内存分配,那么它可以选择使用低碎片(Low Fragmentation)前端分配器来避免堆碎片。在Windows中有两个不同的前端分配器可供使用:

1 旁视列表(Look aside list,LAL)前端分配器

2 低碎片(Low fragmentation,LF)前端分配器

除了Vista,其他的Windows版本默认都使用LAL前端分配器。在Vista中,设计上决定默认使用LF前端分配器。LAL是一个由128个单向链表组成的表。每个单向链表包含特定大小的自由堆块(free heap blocks),块的大小由16bytes开始。每个堆块包含8bytes的堆块元数据(heap block metadata)用于管理堆块。例如,如果一个24Bytes的分配请求到达前端分配器,前端分配器将会寻找32Bytes大小的自由块(free blocks),32Byte = 24Byte用户请求数据+8Byte元数据。由于每一个堆块自身都需要占据8Byte的元数据,所以可以返回给调用者的最小堆块的大小应该为16bytes(因为8Byte的自由堆块已包含了8Byte的元数据,没有空间去供用户使用了)。那么,前端分配器不会使用旁视表(Look-aside Table)中的索引0(原文中为index 1,但根据理解应该为index 0)。

表中每一个索引代表一系列特定大小的自由堆块,后一索引代表的堆块的大小比前一索引代表的堆块大小多8byte。(index1--16B,index2--24B,index3--32B,...,index127--1023Byte)。当应用程序释放一个内存块,堆管理器将标记该内存块为“自由”(free),并且把这个释放的内存块放到前端分配器的旁视表中对应的索引上去。 如果下一次请求内存的时候,前端分配器将会查看在旁视表中是否有可用的(大小相同)自由堆块,如果有就可以将其返回给调用者。不用说,通过旁视列表前端分配器来满足内存分配将是速度最快的。

看一个例子,如下图所示,是某个时刻旁视列表的状态:

表中的index0当然是无用的,index1代表的自由堆块的大小为16Bytes(8Bytes为可用空间),共有三个,index 3 代表的自由块的大小为32Bytes(24Bytes为可用空间),共两个。

若要分配一个24Bytes的内存块,经过计算(24B+8B)/8B-1=3,堆管理器将会知道需要从索引3中寻找对应的内存块。找到后堆管理器将列表中的第一个堆块移除并返回给调用者。

若要分配一个16Bytes的内存块,经过计算,对应的索引应该为index 2,但此刻index2是个空列表,无法从前端分配器中分配内存,那么这个内存请求将会向下转发到后端分配器中做进一步处理。

Frond End Allocator(前端分配器)相关推荐

  1. [置顶] 从零开始学C++之STL(二):实现简单容器模板类Vec(vector capacity 增长问题、allocator 内存分配器)...

    首先,vector 在VC 2008 中的实现比较复杂,虽然vector 的声明跟VC6.0 是一致的,如下: C++ Code  1 2   template <  class _Ty,  c ...

  2. stl源码剖析_STL源码剖析 阅读笔记(二)allocator

    一.空间分配器 allocator 从使用上看,空间分配在任何语言的任何组件都不需要我们去过多关心,因为语言.组件的底层肯定都比较完整的做了这件事情. 从实现上看,学习 allocator 的原理在源 ...

  3. C++STL容器vector

    vector简介 vector模塑出一个dynamic array,即动态数组.它本身是一个 "将元素置于dynamic array加以管理的抽象概念",属于序列式容器. 使用条件 ...

  4. 扫盲:php session缓存至memcached中的方法

    memcached是一套分布式的快取系统,当初是Danga Interactive为了LiveJournal所发展的,但被许多软件(如MediaWiki)所使用.这是一套开放源代码软件,以BSD li ...

  5. Metal之实现视频采集与实时渲染

    一.视频渲染实现思路 ① 思路说明 通过AVFoundation进行视频数据的采集,并将采集到的原始数据存储到CMSampleBufferRef中,即视频帧数据(视频帧其实本质也是一张图片). 通过C ...

  6. 2017-2018-1 20155227 《信息安全系统设计基础》第十三周学习总结

    2017-2018-1 20155227 <信息安全系统设计基础>第十三周学习总结 找出全书你认为最重要的一章,深入重新学习一下,要求(期末占10分): 完成这一章所有习题详细总结本章要点 ...

  7. C++ 内存分配层次以及memory primitives的基本用法

    分配层次 C++ memory primitives 分配 释放 类型 是否可重载 malloc free() C函数 不可 new delete C++表达式 不可 ::operator new() ...

  8. 不定长内存池之apr_pool

    内存池可有效降低动态申请内存的次数,减少与内核态的交互,提升系统性能,减少内存碎片,增加内存空间使用率,避免内存泄漏的可能性,这么多的优点,没有理由不在系统中使用该技术. 内存池分类: 1.      ...

  9. cocos2dx中的Rapidjson

    1 Json基础 JSON 概念和特点: JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation) JSON 是轻量级的文本数据交换格式,类似 XML ...

最新文章

  1. Node.js调用C#代码
  2. sql server 存储过程的详解
  3. win32开发(定时器)
  4. 字符串与整数、浮点数、无符号整数之间的转换常用函数
  5. 前端埋点方法解析及优缺点分析
  6. mysql flaskalchemy_python flask sqlalchemy 数据库mysql操作
  7. 红帽(redhat linux) 初级认证(RHCSA)考点详解
  8. 一件虚拟连衣裙价值9500美元?然而这只是数字服装的开始……
  9. LightOJ - 1406 Assassin`s Creed【状压DP】
  10. 快牛策略——PowerPoint 2003:红头文件的制作及标准
  11. 《幕后产品:打造突破式产品思维》读书笔记
  12. matlab算法实现对等额本息和等额本金两种还款方式的计算
  13. 初识二维码 第二十讲 二维码解码程序的组件之一 摄像头拍照功能
  14. 可修改UID的白卡,请问为什么一般读写器不能修改这种卡的UID,必须要特定的读写器才能修改?
  15. 虚拟主机到底哪家比较好呢?
  16. 【阅读总结】ROSE: A Retinal OCT-Angiography Vessel Segmentation Dataset and New Model
  17. UOJ#271. 【清华集训2016】连通子树(虚树+倍增)
  18. Matlab对科氏力建模,A.升级交换机内的软件B.加装一个内部路由器C.在服务器上安装ARP防火墙D.在内部网的每台主机上...
  19. 下列对C语言特点的描述中 错误的是,下列对C语言特点的描述中,错误的是。
  20. 关于nextline自动跳过问题

热门文章

  1. 【GIS】OpenStreetMap城市边界shp提取
  2. 互联网协议 — TCP — 流量控制
  3. html5图片自动翻转,纯js实现360度旋转预览图片特效
  4. 三星SAMSUNG SL-M2676N 驱动
  5. 使用ActiveX控件开发网页常见的问题
  6. android 打开闪光灯
  7. 你不在意的HTTPS证书吊销机制
  8. 新浪微博会不会被关闭?
  9. 个人PC连接服务器同时上网
  10. Python灰度图像和彩色图像的读取、显示。图像求反。