dlmalloc(Android bionic C库的malloc实现)简介
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实现)简介的更多相关文章
- Android的底层库libutils介绍
第一部分 libutils概述 libutils是Android的底层库,这个库以C++实现,它提供的API也是C++的.Android的层次的C语言程序和库,大都基于libutils开发. libu ...
- Android 第三方开源库收集整理(转)
原文地址:http://blog.csdn.net/caoyouxing/article/details/42418591 Android开源库 自己一直很喜欢Android开发,就如博客签名一样, ...
- Android开源图表库介绍
XCL-Charts XCL-Charts V1.8 Android开源图表库(XCL-Charts is a free charting library for Android platfo ...
- Android JSON 解析库的使用 - Gson 和 fast-json
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于ECMAScript的一个子集. JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族 ...
- Android进阶笔记02:Android 网络请求库的比较及实战(二)
一.Volley 既然在android2.2之后不建议使用HttpClient,那么有没有一个库是android2.2及以下版本使用HttpClient,而android2.3及以上版本 ...
- Android Studio创建库项目及引用
Android Studio创建库项目其实创建的是在主项目下创建Module模块,这个Module模块创建的时候选择库项目模式. 为什么要这样处理呢?因为在Android Studio中一个WorkS ...
- [置顶] android调用第三方库——第四篇——调用多个第三方库
0:前言: 在前面三篇中我们介绍了android调用第三方库的形式,在这一篇中我们介绍调用多个第三方库的Android.mk的写法,由于其他三篇介绍的很详细,这里只给出Android.mk的内容. [ ...
- android studio依赖库工程Activity显示问题及库工程设置
android studio引用库工程其实不难,直接添加依赖module即可,但是我在操作过程中出现一些奇怪的问题,苦扰我一整天,为了祭奠这苦命的一天特别mark一下. 首先描述一下我的错误现象: s ...
- Android JSON解析库Gson和Fast-json的使用对比和图书列表小案例
Android JSON解析库Gson和Fast-json的使用对比和图书列表小案例 继上篇json解析,我用了原生的json解析,但是在有些情况下我们不得不承认,一些优秀的json解析框架确实十分的 ...
随机推荐
- Redis GetTypedClient
C#操作Redis 未包含GetTypedClient定义 原创,转载请注明出处. VS版本:2015 用NuGet安装了Redis的包 按照百度的各种教程来操作,但是发现网上下载的DEMO可以正 ...
- Coursera Machine Learning : Regression 多元回归
多元回归 回顾一下简单线性回归:一个特征,两个相关系数 实际的应用要比这种情况复杂的多,比如 1.房价和房屋面积并不只是简单的线性关系. 2.影响房价的因素有很多,不仅仅是房屋面积,还包括很多其他因素 ...
- Java(接口与继承)动手动脑
1>继承条件下的构造方法调用 运行 TestInherits.java 示例,观察输出,注意总结父类与子类之间构造方法的调用关系修改 Parent 构造方法的代码,显式调用 GrandParen ...
- 《Reactive_MircService_Architecture》 脑图
Reactive_MircService_Architecture Lightbend CTO的50页的小册子,对响应式系统以及微服务架构介绍非常全面,整理了一个脑图来先.
- Trie / Radix Tree / Suffix Tree
Trie (字典树) "A", "to", "tea", "ted", "ten", "i ...
- 十分钟使用github pages +hexo拥有个人博客
最近想自己搭建自己的个人博客,毕竟这样觉得比较geek,但是搜了资料,感觉良莠不齐,好多东西说的含糊不清,于是自己记录下自己的搭建过程. 1, 安装nodejs 2, 安装git 3, 申请githu ...
- sql学习
1.改变表的某一字段的长度: alter table tt modify a char(2000); 2.不想打开表就查看某一字段的长度可用下面的方法: select length(a),leng ...
- mysql.connector操作mysql的blob值
This tutorial shows you how to work with MySQL BLOB data in Python, with examples of updating and re ...
- FIFO
FIFO存储器 FIFO是英文First In First Out 的缩写,是一种先进先出的数据缓存器,他与普通存储器的区别是没有外部读写地址线,这样使用起来非常简单,但缺点就是只能顺序写入数据,顺序 ...
- ember - 观察者模式
Ember可以察觉所有属性的变化,包括计算属性.观察者是非常有用的,特别是计算属性绑定之后需要同步的时候. 观察者经常被Ember开发过度使用.Ember框架本身已经大量使用观察者,但是对于大多数的开 ...