从源码角度剖析VC6下的内存分配与切割的运作

目录

  • 前言
  • 1、heap初始化
  • 2、第一次分配内存,计算真正区块大小
  • 3、new_region管理中心
  • 4、__sbh_alloc_new_group()切割第一次分配好的内存
  • 5、开始切割内存

前言

malloc与free带来的内存管理是应付小区块的,即SBH(small block heap),这点也可以从源代码中看出:
VC6下会做门槛检测

if(size <= __sbh_threshold) {
pvReturn = __sbh_alloc_block(size);
return pvReturn;
}
...
return HeapAlloc(_crtheap,0,size)

VC10下不会做门槛检测,它总是会调用系统提供的HeapAlloc。这是因为操作系统提供的函数也有类似的功能了。
当然还需要注意,我们分析的步骤是按照函数调用的次序来的:(从下往上的函数调用次序如下)
在这里插入图片描述

1、heap初始化

首先向操作系统要一大块内存(如4096),称为_crtheap.
然后使用HeapAlloc从_crtheap中获取16个HEADER大小的内存,并获取内存指针。
每个HEADER长这样:

图1
图2

2、第一次分配内存,计算真正区块大小

在debug模式下,通过调用malloc_dbg,分配得到32个8字节的内存,即100h.
然后调整大小,扩充一个如下的结构:nDataSize记录真正大小。gap用户调试器检查保护nsize内存。注意gap一共上下两个,但是结构体里面只定义了上面的那个。

图1
图2
我们将这整个内存的大小叫做blockSize: 然后调用heap_alloc_dbg函数,进行结构体与nSize的整合

在这里插入图片描述
通过调用_heap_alloc_base来获取每个blockSize内存的头指针。
然后通过头尾指针将所有分配出来的block串接起来,变为一个链表:

在这里插入图片描述

头指针为_pFirstBlock;
尾指针为_pLastBlock;
_heap_alloc_base具体内容
之前在通过heap_alloc_dbg中调用_heap_alloc_base来获取每个blockSize内存的头指针。
现在来看看它具体步骤:
1、首先将扩充完的大小与__sbh_threshold进行比较,所过是小区块就用shb服务,否则由操作系统服务。
小区块的定义是:这块内存大小+cookie大小 < 1024个字节

if(size <= __sbh_threshold) {
pvReturn = __sbh_alloc_block(size);
return pvReturn;
}
...
return HeapAlloc(_crtheap,0,size)

接下来看__sbh_alloc_block具体细节:
对扩充完的区块再次进行扩充,加上8个字节(上下cookie)并且进行roundup操作(变为16的整数倍)
在这里插入图片描述
以上图为例,最终得到的结果是0x130,但是在cookie中写入的却是131。这是因为由于是16的倍数,所以最后一位一定是0。最后一位0/1表示是在SBH手上还是已经分配出去了。

3、new_region管理中心

之前在第一步heap初始化的时候分配了16个HEADER,每个HEADER现在用来管理1MB的内存。每个HEADER有两根指针:一根指向虚拟地址空间,一根指向管理中心。
管理中心被称为new_region。
region设计如下:
它含有:
1个整数
64个char
32个Hi和32个Lo并起来,构成32组,每组64个bit。(用来管理哪些区块有或者没有)
32个group,每个group由64根双向链表组成。

图1
图2
程序将用这一块region(大概16KB左右)来控制1MB的虚拟内存空间。 程序通过调用__sbh_alloc_new_region()、__sbh_alloc_new_group()函数开始内存管理。

4、__sbh_alloc_new_group()切割第一次分配好的内存

已知拥有32个group,对应了1MB的虚拟内存空间,平均下来每个group管理32KB内存。
每32KB的内存还要再分割,分成8page(注意这里的内存都是连续的),每page4KB,然后用指针把8个page串起来。串起来之后将它们挂到group的最后一条链表。这便是SBH现在所作的事情。
下面红色部分便是group与32KB内存的具体衔接图。
在这里插入图片描述
0xfff…实际上就是-1,作用:
将来回收内存的时候需要合并内存,合并的过程中需要用-1作为阻隔器,即只能合并-1与-1之间的内存。
上-1下面有3格,第一格记录的是两个-1之间的内存,一开始大小为4080,后两格作为指针将page从前到后串联起来。
每个page大小4096字节,去掉两个-1,剩下4088个字节。由于每个红色区块要保证大小是16倍数。所以需要将4088再分割出去8个字节(也就是保留)。
每个4K都这样处理,形成如下的图:
在这里插入图片描述

5、开始切割内存

先前讲到了每个group中有64根双向链表,平均分配下来:
第一条链表管理16个字节的内存
第二条链表管理32个字节的内存

最后一条管理1024个字节的内存(实际上大于1k的内存全都归最后一条管理)
在这里插入图片描述
现在开始想象开始切割page1的内存,当page1内存小于1k的时候就不应该由最后一条链表来管,应该要计算,然后将指定链表拉过来。现在来看具体的切割:
在之前的步骤中我们以及知道我们需要的内存是多大了:130h(100h+debugHeader+cookie+roundup)
所以,现在还剩下ec0h的内存。切割完后,系统将红色的地址:007d0ed0,传出去。
客户程序拿到该指针,便认为拥有了这一块内存。
由上可知,切割其实只是cookie的调整 + 指针的传送。
注意红色指针还需要调整(扣除debugHeader),调整到右边的结构块的绿色部分,该部分才是使用者(ioinit)真正拿到的地址。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/377336.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

windows常见命令整理(持续更新)

windows常见命令整理 1. 文件1.1. 实时显示文件 logfile.txt 中新添加的内容&#xff08;类似于linux tail -f&#xff09; 2. 网络2.1. netstat 3. 进程和任务3.1. tasklist &#xff08;用于列出当前运行的进程及其详细信息&#xff09;3.2. wmic &#xff08;用于执行各种系…

最长公共子序列求序列模板提_最长公共子序列

最长公共子序列求序列模板提Description: 描述&#xff1a; This question has been featured in interview rounds of Amazon, MakeMyTrip, VMWare etc. 这个问题在亚马逊&#xff0c;MakeMyTrip&#xff0c;VMWare等访谈轮次中都有介绍。 Problem statement: 问题陈述&…

洛必达法则使用条件

使用条件 1、分子分母同趋向于0或无穷大 。 2、分子分母在限定的区域内是否分别可导。 3、当两个条件都满足时&#xff0c;再求导并判断求导之后的极限是否存在&#xff1a;若存在&#xff0c;直接得到答案&#xff1b;若不存在&#xff0c;则说明此种未定式无法用洛必达法则解…

求根号m(巴比伦算法)

巴比伦算法是针对求根号m的近似值情况的&#xff0c;它的思想是这样的&#xff1a; 设根号mX0,则如果枚举有答案X(X<X0)&#xff0c;则m/X>X0,当精度要求不高的时候&#xff0c;我们可以看成Xm/XX0,而如果精度要求比较高&#xff0c;我们只需取X和m/X的平均值作为新的枚举…

Android面试题

http://blog.csdn.net/aomandeshangxiao/article/category/841452 http://www.cppblog.com/life02/category/18316.html转载于:https://www.cnblogs.com/DonkeyTomy/articles/2598673.html

r语言 分类变量 虚拟变量_R语言中的变量

r语言 分类变量 虚拟变量R语言| 变数 (R Language | Variables) In the previous tutorial, we have come across the basic information that stands as a pavement for understanding the R language in depth. Now moving future let us educate ourselves about the concep…

算法题复习(快排、链表、二分、哈希、双指针)

目录1、快速排序复习2、链表部分复习203. 移除链表元素707. 设计链表206. 反转链表142.环形链表 II3、二分法复习4、哈希法复习5、双指针复习**15. 三数之和****18. 四数之和****27. 移除元素****344. 反转字符串**,简单&#xff0c;双指针从两侧往中间靠拢&#xff0c;并随时s…

Cassandra1.2文档学习(7)—— 规划集群部署

数据参考&#xff1a;http://www.datastax.com/documentation/cassandra/1.2/webhelp/index.html#cassandra/architecture/architecturePlanningAbout_c.html 当规划一个Cassandra集群部署时&#xff0c;关于你初始存储的数据的数据量你应当有一个好的想法&#xff0c;并且对于…

虚拟机设置NAT

需要开启虚拟机网络相关服务&#xff0c; 安装虚拟网卡&#xff0c; 还有必须安装 VMware ToolsVMware虚拟机下实现NAT方式上网1. 把你的虚拟网卡VMnet8设置为自动获得IP、自动获得DNS服务器&#xff0c;启用。2. 把你虚拟机中操作系统的“本地连接”也设置为自动获得IP、自动获…

窗体震动 C# (不使用Timer控件,控制窗体震动)

private static Point plocation new Point(); public static void StartVibration(Form form)//Form 传入需要振动的窗体 { plocation form.Location; for (int i 1; i < 41; i)//41&#xff0c;可以理解为震动的时间。…

算法题复习(栈与队列、二叉树)

目录栈与队列栈用于匹配的问题队列用于堆二叉树系列深度遍历&#xff0c;递归与迭代层序遍历二叉树属性二叉树修改与构造二叉搜索树公共祖先二叉搜索树的修改与构造栈与队列 栈用于匹配的问题 20. 有效的括号 https://leetcode-cn.com/problems/valid-parentheses/ 不匹配的三…

bpsk_BPSK的完整形式是什么?

bpskBPSK&#xff1a;二进制相移键控 (BPSK: Binary Phase Shift Keying) BPSK is an abbreviation of "Binary Phase Shift Keying". BPSK是“二进制相移键控”的缩写 。 BPSK is also occasionally called phase reversal keying (PRK), or 2PSK, which is the el…

win7 下安装oracle 10g

oracle 10g 在win7下安装&#xff0c;提示程序异常终止&#xff0c;发生未知错误 在网上搜结果&#xff1a; 修改Oracle 10G\database\stage\prereq\db\refhost.xml 在 </SYSTEM> <CERTIFIED_SYSTEMS>后面添加 <!--Microsoft Windows 7--> <OPERAT…

poj 1703 Find them, Catch them

题目链接&#xff1a;http://poj.org/problem?id1703 题目大意&#xff1a;警察抓获N个罪犯&#xff0c;这些罪犯只可能属于两个团伙中的一个&#xff0c;现在给出M个条件&#xff08;D a b表示a和b不在同一团伙&#xff09;&#xff0c;对于每一个询问(A a b)确定a&#xff0…

双向a*搜索算法_双向搜索算法

双向a*搜索算法什么是双音搜索&#xff1f; (What is bitonic search?) Searching a bitonic array is known as bitonic search. An array is said to be bitonic if it has an increasing sequence of integers followed immediately by a decreasing sequence of integers.…

关于LRU缓存简单记录以及代码补全。

目录大概思路时间空间复杂度分析指针操作具体细节代码双向链表设计私有成员变量设计:构造函数和析构函数设计&#xff1a;get与put具体设计双向指针的具体细节添加到头节点函数删除尾节点函数删除节点函数删除节点函数感想今天面试考到LRU&#xff0c;太紧张了&#xff0c;完全…

码农干货系列【4】--图像识别之矩形区域搜索

简介 定位某个图片的矩形区域是非常有用的&#xff0c;这个可以通过手动的选择某个区域来实现定位&#xff0c;图片相关的软件都提供了这个功能&#xff1b;也可以像本篇一个通过程序来实现智能定位。前者会有误差&#xff0c;效率低下&#xff1b;后者选区精度高&#xff0c;效…

算法题复习(回溯)

目录base code棋盘问题51. N 皇后37. 解数独组合问题77. 组合未剪枝优化剪枝优化216. 组合总和 III未剪枝优化剪枝优化17. 电话号码的字母组合39. 组合总和未剪枝优化剪枝优化40. 组合总和 II,挺重要的&#xff0c;涉及到去重了切割问题131. 分割回文串子集问题78. 子集90. 子集…

pfa是什么意思_PFA的完整形式是什么?

pfa是什么意思PFA&#xff1a;预测性故障分析 (PFA: Predictive Failure Analysis) PFA is an abbreviation of Predictive Failure Analysis. It is a technique of a mechanism of the computer that is used to predict impending failures of software or hardware compone…

SqlServer视图(view)

--上节回顾--1.什么是事务--2.事务的特征--原子性、一致性、隔离性、持久性--3.与事务相关的t-sql命令--开启事务&#xff1a;begin transaction--提交事务&#xff1a;commit transaction--回滚事务&#xff1a;rollback transaction ----------------视图-------------------…