1. bin(chunk容器)

ptmalloc将相似大小的 chunk 用双向链表链接起来,这样的一个链表被称为一个 bin。 Ptmalloc 一共维护了 128 个 bin,并使用一个数组来存储这些 bin,这个数组被成为bin数组。

bin数组结构如下:

在32位平台下,bin[0] 和 bin[127] 是不存在的,因为最小的 chunk 为 16B, small bin 一共 62 个, large bin 一共 63 个,算上 bin[1] 加起来一共 128 个 bin。

其中 small bin 可以看成是公差为8的等差数列,其相邻两个 bin 的 chunk 的大小相差8B,如上图所示。large bin 的每个 bin 中的 chunk 大小不是一个固定的等差数列,而是分成六组,每组 bin 是一个固定公差的等差数列,每组的 bin 数量依次为 32、 16、 8、 4、 2、 1,公差依次为 64B、 512B、4096B、32768B、 262144B 等。
正是基于 bin 数组的这种关系,当用户给出一个需要申请的空间大小,ptmalloc 会很容易的确定改大小空间在哪个 bin 里。

fast bin:

  • 不大于 max_fast(默认值为 64B)的 chunk 被释放后,首先会被放到 fast bin 中, fast bin 中的 chunk 并不改变它的使用标志 P。 这样也就无法将它们合并, 当需要给用户分配的 chunk 小于或等于 max_fast 时, ptmalloc 首先会在 fast bin 中查找相应的空闲块,然后才会去查找 bin 中的空闲 chunk。在某个特定的时候(在内存释放合并 top chunk 时,如果合并后的 chunk 的大小大于 FASTBIN_CONSOLIDATION_THRESHOLD(默认64KB), 会触发进行 fast bins 的合并操作),ptmalloc会遍历 fast bin中的 chunk,18将相邻的空闲 chunk 进行合并, 并将合并后的 chunk 加入 unsorted bin 中,然后再将 usorted bin 里的 chunk 加入 bins 中。

ptmalloc堆内存管理机制(主要讨论Linux x86下32位系统)相关推荐

  1. Windows X86(32位系统)为什么可使用最大内存4G,再加内存条,内存也不会增加?

    ①X86就是指32位系统(位:cpu一次能处理的最大位数....所以64位比32位速度快很多) ②内存条:CPU可通过总线地址,并进行读写操作的电脑部件. 电脑内存(RAM,random sccess ...

  2. Linux堆内存管理深入分析

    0 前言 近年来,漏洞挖掘越来越火,各种漏洞挖掘.利用的分析文章层出不穷.从大方向来看,主要有基于栈溢出的漏洞利用和基于堆溢出的漏洞利用两种.国内关于栈溢出的资料相对较多,这里就不累述了,但是关于堆溢 ...

  3. Linux堆内存管理深入分析(上)

    Linux堆内存管理深入分析 (上半部) 作者:走位@阿里聚安全   0 前言 近年来,漏洞挖掘越来越火,各种漏洞挖掘.利用的分析文章层出不穷.从大方向来看,主要有基于栈溢出的漏洞利用和基于堆溢出的漏 ...

  4. Linux堆内存管理深入分析 (上半部)【转】

    转自:http://www.cnblogs.com/alisecurity/p/5486458.html Linux堆内存管理深入分析 (上半部) 作者:走位@阿里聚安全 0 前言 近年来,漏洞挖掘越 ...

  5. Linux内存管理机制研究

    Linux内存管理机制研究 查看linux系统中处于free状态的内存有两个角度,一个是从内核的角度来看,一个是从应用层的角度来看的. 1.从内核的角度来看free的内存,就是内核目前可以直接分配到, ...

  6. 二进制安全:ptmalloc内存管理机制与堆块chunk源码分析

    敬告: <中华人民共和国刑法>第三百八十六条[破坏计算机系统罪:网络服务渎职罪]违反国家规定,对计算机信息系统功能进行删除.修改.增加.干扰,造成计算机系统不能正常运行,后果严重的,处五年 ...

  7. linux堆内存管理深入分析,【技术分享】Linux堆溢出之Fastbin Attack实例详解

    1. 摘要 在近几年各大CTF比赛中,看到有很多次pwn类别题中出现fastbin攻击的情况,例如今年的defcon,RCTF,胖哈勃杯,0CTF final等等 ,fastbin attack是堆漏 ...

  8. linux内存管理机制以及free命令详解

    linux内存管理机制以及free命令详解 一.linux内存管理机制 1.物理内存和虚拟内存 直接从物理内存读写数据要比从硬盘读写数据要快的多,因此,我们希望所有数据的读取和写入都在内存完成,而内存 ...

  9. 【Linux 内核 内存管理】Linux 内核堆内存管理 ① ( 堆内存管理 | 内存描述符 mm_struct 结构体 | mm_struct 结构体中的 start_brk、brk 成员 )

    文章目录 一.堆内存管理 二.内存描述符 mm_struct 结构体 三.mm_struct 结构体中的 start_brk.brk 成员 一.堆内存管理 Linux 操作系统中的 " 堆内 ...

最新文章

  1. Nature:微生物培养技术发展迅猛,未来要搞定一切!
  2. 痛并快乐的造轮子之旅:awk访问数据库之旅
  3. 博物馆自动灭火系统应如何选择
  4. 7.Phong 和 BlinnPhong
  5. 图片裁剪和异步上传插件--一步到位(记录)
  6. 【B】替换 Quartz.net 默认使用的 MySql.Data 为 Mysqlconnector 的学习过程
  7. Java 文件目录显示
  8. 吴恩达深度学习 —— 2.16 关于python/numpy向量的说明
  9. linux mysql 主从数据库_【Linux】【MySQL】MySQL主从数据库
  10. SAP License:值得一看的ERP问题
  11. [转] 有关java中两个整数的交换问题
  12. Javascript中的Trait与代码重用
  13. android打开关闭gps定位服务,【Android】使用模拟位置,关闭模拟位置后GPS启动不了...
  14. 《概率论与数理统计》(浙大第四版)第七章总结笔记(纯手写)
  15. 服务器虚拟内存最佳设置范围,虚拟内存有什么用?虚拟内存设置多少合适?
  16. linux内存显示少,linux 显示的内存怎么少于我实际的物理内存
  17. 内蒙古巴丹吉林沙漠锁定2021中国唯一申遗名额
  18. 30岁张一鸣创业成功秘密武器,OKR“失控”管理法
  19. ROC和 区别p值和q值
  20. 加州房价篇 (一) : 了解数据

热门文章

  1. ASP.NET知识集
  2. 在数据库中outlet、code、outline为联合组件。hibarnate插入可如此插入
  3. 单片机编程文件组织形式(个人编程规范)
  4. java代码编写的文本特征提取_Test1 java语言写的特征提取源代码,有搞文字识别的可以下载一看,简单易学 Develop 274万源代码下载- www.pudn.com...
  5. 按条件分类_保税仓储企业能否同时存储非保货物?“仓储货物安装台分类监管”如何申请?...
  6. java 保存bufferedimage_java - 如何将BufferedImage保存为Fi
  7. 免装版_无缝贴图制作软件 PixPlant2中文免装版
  8. 新唐M031学习笔记(一)定时器基础计数应用
  9. 图灵计算机模型意义,图灵机有什么意义_学习图灵机模型中遇到的问题
  10. 160 - 22 CarLitoZ.1