基本概念

  • 堆块:堆区内存的基本单位

    • 包括两个部分:块首,块身
    • 块首:标识这个堆块自身的信息:如大小,是否被占用等
    • 块身:分配给用户使用的数据区
  • 堆表:一般位于堆区的起始位置,用于索引堆区所有堆块的信息,包括大小,是否被占用等.
    • 占用态的堆块被使用它的程序索引,堆表只索引所有空闲态的堆块.
    • 堆表分为空闲双向链表Freelist(空表),快速单向链表Lookaside(块表)
  • 空表
    • 块首:包含一对用于将空闲堆块组织成双向链表的指针
    • 空表被分为128条,按照大小区分
    • 结构如下free[0]中存放的为不小于1024bytes的堆块链表指针,其余为index*8

  • 堆中的操作:堆块分配,堆块释放,堆块合并
  • 块表结构:单向链表
  • 块表不会发生堆块合并
  • 块表总被初始化为空
  • 最多四个结点

堆块中的操作

  • 堆块分配:块表分配,普通空表分配和零号空表(Free[0])分配

  • 块表分配:

    1. 寻找到大小合适的空闲堆块
    2. 修改其状态为占用态
    3. 从堆表中"卸下"
    4. 返回一个指向堆块的指针
  • 普通空表分配

    1. 寻找最优的空闲块分配,若失败寻找次优的空闲块(最小的能满足要求的空闲块)
  • 零号空表:

    1. 先查找free[0]最后一个块(尾块),看能否满足需求
    2. 若能,再正向搜索最小的能满足要求的空闲堆块分配
  • 找零钱现象:

    • 无最优的堆块时,会分配一个稍大的
    • 会先从大块中精确割除一块进行分配
    • 给剩下的部分重新标注块首,链入空表

      (快表无此现象)
  • 堆块释放:

    • 将块首中堆块的状态信息改为空闲
    • 链入相应的堆表(末尾)
  • 堆块合并:

    • 两个空闲堆块彼此相邻时会进行合并操作
    • 从空闲链表中卸下
    • 合并堆块
    • 调整合并后的块首信息
    • 将新块链入空表
  • RtlAllocateHeap()

  • 位于ntdll.dll,堆分配的鼻祖

  • 所有的堆分配函数最终都会调用他

0day堆(1)堆的管理策略的更多相关文章

  1. 0day堆(2)堆的调试实验

    堆的调试实验 调试态堆管理策略和常态堆管理策略:前者只使用空表不用块表,不真实 使用调试器加载函数会触发前者 __asm int3 调试最真实的栈 未启用块表的堆区信息 堆区起始位置(假设为0x005 ...

  2. iOS: ARC & MRC下string内存管理策略探究

    ARC & MRC下string内存管理策略探究 前两天跟同事争论一个关于NSString执行copy操作以后是否会发生变化,两个人整了半天,最后写代码验证了一下,发现原来NSString操作 ...

  3. SVN分支管理策略个人见解

    本篇目录 前言 SVN分支管理策略 VisualSVN Server TortoiseSVN客户端 Repository的创建 Check out trunk创建新项目MyProject trunk更 ...

  4. Git 分支管理策略

    分支管理策略 下面我们来说一下一般企业中开发一个项目的分支策略: 主分支 master 开发分支 develop 功能分支 feature 预发布分支  release bug 分支 fixbug 其 ...

  5. Rs2008内存管理策略

    Rs2008 在内存管理方面已经有了很大的改变.主要增加了文件缓存,允许把内存数据卸载到文件缓存中.而Rs2005 都是把数据放到内存中.对于大数据量的报表而言,很容易出现OutOfMemory 错误 ...

  6. C++ 堆 和 堆 分析

    [摘要] 堆和栈,即是数据结构,又是分配存储空间的不同方式.在数据结构上.堆是树型层次结构,结点按keyword次序排列,经常使用的堆为二叉堆:栈是一种先进后出的数据结构.在内存分配上的堆和栈,首要差 ...

  7. git分支管理之分支管理策略

    分支管理策略 阅读: 246888 通常,合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息. 如果要强制禁用Fast forward模式,Git就 ...

  8. Redis 数据结构与内存管理策略(上)

    Redis 数据结构与内存管理策略(上) 标签: Redis Redis数据结构 Redis内存管理策略 Redis数据类型 Redis类型映射 Redis 数据类型特点与使用场景 String.Li ...

  9. Redis 数据结构与内存管理策略(下)

    Redis 数据结构与内存管理策略(下) 标签: Redis Redis数据结构 Redis内存管理策略 Redis数据类型 Redis类型映射 Redis 数据类型特点与使用场景 String.Li ...

随机推荐

  1. Fast Enumeration

    在 Objective-C 2.0 中提供了快速枚举的语法,它是我们遍历集合元素的首选方法.它具有以下优点: 比直接使用 NSEnumerator 更高效: 语法非常简洁: 如果集合在遍历的过程中被修 ...

  2. [白话解析] 通俗解析集成学习之bagging,boosting & 随机森林

    [白话解析] 通俗解析集成学习之bagging,boosting & 随机森林 0x00 摘要 本文将尽量使用通俗易懂的方式,尽可能不涉及数学公式,而是从整体的思路上来看,运用感性直觉的思考来 ...

  3. Java实验五参考答案

    1.找错误 btOK.setOnAction( new EventHandler<ActionEvent> { public void handle (ActionEvent e) { S ...

  4. Java构造方法的姿势与易错点

    <Java基础复习>-类与对象&初始化 关于类和对象的基本理念,就不再赘述(如果你学习过还忘了,就是一种特殊的本领了),没有学习过的可以去搜索一下OOP或者类和对象,百科的知识就已 ...

  5. PTA数据结构与算法题目集(中文) 7-37 模拟EXCEL排序 (25 分)

    PTA数据结构与算法题目集(中文)  7-37 模拟EXCEL排序 (25 分) 7-37 模拟EXCEL排序 (25 分)   Excel可以对一组纪录按任意指定列排序.现请编写程序实现类似功能. ...

  6. flask-类视图

    flask-类视图 标准类视图 from flask import Flask, render_template, views, jsonify app = Flask(__name__) class ...

  7. 通过简单的ajax验证是否存在已有的用户名

    首先来说说我对ajax的理解:简单地来说就是在不重新刷新页面的情况下,实现数据的调用获得更新. 我在这里介绍的是要过jquery封装好的ajax,大家可以去了解一下使用原生的XMLHttpReques ...

  8. Linux c++ vim环境搭建系列(5)——vim使用

    5. 使用 5.1 快捷键及设置 5.1.1 光标移动 w : 正向移动到相邻单词的首字符 b : 逆向移动到相邻单词的首字符 e : 正向移动到相邻单词的尾字符 ge : 逆向移动到相邻单词的尾字符 ...

  9. CountDownLatch 计算器(具有回调功能)

    final CountDownLatch cdl = new CountDownLatch(1); new Thread(new Runnable() { @Override public void ...

  10. Jmeter连接mysql数据库?so easy!!!

    一.确保mysql数据库能够通过Navicat等远程连接工具连接. 注意:一定是确保能使用navicat连接,而不是dos窗口! 比如笔者需要查询ecshop数据库下的ecs_admin_user表, ...