欢迎转载opendevkit文章, 文章原始地址: http://www.opendevkit.com/?e=56

Dlmalloc是目前一个十分流行的内存分配器,其由Doug Lea从1987年开始编写,到目前为止,最新版本为2.8.3,由于其高效率等特点被广泛的使用。U-boot上使用的dlmalloc的版本是 2.6.6。Android bionic C库也使用, 实现C库的malloc分配.android里, 源码位置bionic/libc/upstream-dlmalloc/malloc.c uboot里源码 common/dlmalloc.c.

1. 基本概念

chunk "块", 实际上指带一块内存, 包括了管理信息.

bins "箱柜",  dlmalloc算法中, 用于快速定位所需要的chunk

#define top            (bin_at(0)->fd)   /* The topmost chunk */  特殊的bin, 指向内存最顶端的chunk

#define last_remainder (bin_at(1))       /* remainder from last split */ 特殊的bin, 指向最近分配的chunk剩下的chunk.

sbrk "系统调用" 用来移动用户空间看见的heap的边界

CALL_MORECORE 实际上是不同平台的操作系统分配调用的实现, linux上是brk.b

2. 算法逻辑

(1) chunk管理

有两种类型的chunk,已分配的chunk和未分配的chunk,两者交错排列,占据了整个heap空间。注意,没有相邻的两个未分配的 chunk,因 为在调用free释放被使用过的chunk时,dlmalloc将合并任何相邻的空闲chunk。交错的两种chunk看起来是这样的。

(2) Top chunk

Top最初被称为wilderness chunk,指向dlmalloc 可用内存的最高端的边界chunk,因为在边界上,top是唯一一个可以任意扩展的块。Top比较特殊,它不受任何分 箱管理,当其他分箱没有可用的chunk时才会用到top。在dlmalloc初始化刚完成时,整个受dlmalloc管理的内存就是一个 chunk,top即指向这个chunk。

(3) Last_remainder chunk

Last_remainder 总是指向最近被分割chunk的剩下那一部分。 如果malloc在分配时没有找到“精确匹配”的块,则优先去查看last_remainder是否够用。从局部性原理来讲,连续申请分配内存的代码总是 趋向于有共同的生命周期,它们释放的chunk也就有很大的机会合并成一个大的chunk。

3. 算法概要

(1) 在smapllbin里查找, 这个查找很快, 有就返回

(2) 在tree bin里查找, 这个查找稍慢, 有就返回

(3) 在大的块链里顺序查找, 这个最慢, 有就返回

(4) 查看top chunk, 可以分的话, 就分解top chunk

(5) sys_alloc, sys_alloc里linux用的是brk系统调用.

mem = sys_alloc(gm, nb);, gm是全局的 static struct malloc_state _gm_, 管理这整个malloc状态.

sys_alloc里, 包含了初始化工作, 如果是第一次分配, 就会初始化一下, 同时把分配到内存块赋值给top, 再从top分配用户需要的大小.init_top接口用于初始化top.

(6) free释放时候, 会合并相邻的chunk, 同时适当情况下, 调用brk, 让内核释放页面.

dlmalloc(Android bionic C库的malloc实现)简介的更多相关文章

  1. Android的底层库libutils介绍

    第一部分 libutils概述 libutils是Android的底层库,这个库以C++实现,它提供的API也是C++的.Android的层次的C语言程序和库,大都基于libutils开发. libu ...

  2. Android 第三方开源库收集整理(转)

    原文地址:http://blog.csdn.net/caoyouxing/article/details/42418591 Android开源库 自己一直很喜欢Android开发,就如博客签名一样,  ...

  3. Android开源图表库介绍

    XCL-Charts XCL-Charts V1.8     Android开源图表库(XCL-Charts is a free charting library for Android platfo ...

  4. Android JSON 解析库的使用 - Gson 和 fast-json

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于ECMAScript的一个子集. JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族 ...

  5. Android进阶笔记02:Android 网络请求库的比较及实战(二)

    一.Volley        既然在android2.2之后不建议使用HttpClient,那么有没有一个库是android2.2及以下版本使用HttpClient,而android2.3及以上版本 ...

  6. Android Studio创建库项目及引用

    Android Studio创建库项目其实创建的是在主项目下创建Module模块,这个Module模块创建的时候选择库项目模式. 为什么要这样处理呢?因为在Android Studio中一个WorkS ...

  7. [置顶] android调用第三方库——第四篇——调用多个第三方库

    0:前言: 在前面三篇中我们介绍了android调用第三方库的形式,在这一篇中我们介绍调用多个第三方库的Android.mk的写法,由于其他三篇介绍的很详细,这里只给出Android.mk的内容. [ ...

  8. android studio依赖库工程Activity显示问题及库工程设置

    android studio引用库工程其实不难,直接添加依赖module即可,但是我在操作过程中出现一些奇怪的问题,苦扰我一整天,为了祭奠这苦命的一天特别mark一下. 首先描述一下我的错误现象: s ...

  9. Android JSON解析库Gson和Fast-json的使用对比和图书列表小案例

    Android JSON解析库Gson和Fast-json的使用对比和图书列表小案例 继上篇json解析,我用了原生的json解析,但是在有些情况下我们不得不承认,一些优秀的json解析框架确实十分的 ...

随机推荐

  1. VBA使用的Randomize和DoEvents

    Randomize private function getInt() dim n,m as integer Randomize n=1 m=3 getInt=Int((m+1-n)*rnd + n) ...

  2. <停车位>version1.0

    <停车卫> 产品需求说明书 文档版本号: Version 1.0 文档编号: xxxx 文档密级: 归属部门/项目: 产品名: 停车卫 子系统名: 编写人: kina 编写日期: 2015 ...

  3. zookeeper学习(一)安装、配置、运行

    说明:zookeeper完全可以standalone,也可以伪集群形式,当然生产中都是集群形式.另外,也可以在windows下运行. 如果只是研究用,完全可以在windows下使用standalone ...

  4. Goals100

    Start:2016.4.10 100天目标:jy_ai学习.swift.设计模式        以10天为周期,开始周会,执行内容:自我检讨本周期,并展望下一个周期:目标一:寻找高效方法.1.思考, ...

  5. js(ext)中,设置[!!异步!!]上传的简单进度条

    代码在updateHmis的历史记录中,此处存档 handler : function() { //显示进度条 Ext.MessageBox.wait('数据上传中...','提示'); //上传数据 ...

  6. Jquery给input[type=radio] 控件赋值

    setobject: function (data, scope, win) { //data jsoon数据, scope,一般为form的id,win 窗口对象,如果在当前window win=n ...

  7. Linux下VFP NEON浮点编译

    http://blog.csdn.net/liujia2100/article/details/27236477 NEON:SIMD(Single Instruction Multiple Data ...

  8. JS中this关键字详解

    本文主要解释在JS里面this关键字的指向问题(在浏览器环境下). 阅读此文章,还需要心平气和的阅读完,相信一定会有所收获,我也会不定期的发布,分享一些文章,共同学习 首先,必须搞清楚在JS里面,函数 ...

  9. 【Java源码分析】LinkedList类

    LinkedList<E> 源码解读 继承AbstractSequentialList<E> 实现List<E>, Deque<E>, Cloneabl ...

  10. C# 特殊处理

    一.日期格式化处理 private Datetime _datetime;//定义字段 数据值都存在字段里 通过修改字段来修改属性 public string Datetime//定义属性 { get ...