malloc挖掘—动态存储器分配深入了解
在学习malloc时,我对于malloc对堆区空间的操作进行了一个深入探索,基于动态存储器分配写了这篇博客,如有错误或不足,欢迎指出
以下内容是从《深入理解计算机系统》一书总结而来
我们一般说malloc是动态内存分配,实际上malloc就是动态分配器的一种,那么下面我们就以动态存储器为切入点进行探索:
一、为什么要使用动态存储器分配?
最主要的原因是经常直到程序实际运行时才知道某些数据结构的大小
二、堆区
1.我们都知道,malloc申请空间实在堆上,那么堆空间是怎样的呢?
在C/C++内存中,堆区是紧接在bss区域(即数据段,存储未初始化的全局/静态变量)之后,向上(更高的地址)增长的,对于每一个进程,内核维护着一个指针变量brk(break)指向堆顶
2.动态分配器是怎么处理堆区的呢?
分配器将堆视为一组大小不同的块(block)的集合来维护,要么是已分配的,要么是空闲的
三、动态分配器
1.理解动态分配器
前面已经说过动态分配器将堆视为一组大小不同的块(block)的集合来维护,要么是已分配的,要么是空闲的。需要了解:
1.对于已经分配的,显示地保留给应用程序使用,空闲的则可以继续分配。
2.一个已经分配的块保持已经分配的状态,直到被free掉,得以被堆重用。当已经分配的块一直没有被free,那么一直保持分配状态,这个就是内存泄漏了。
2.分配器的要求和目标
1).要求:
处理任意请求序列 立即响应请求:分配器必须立即响应请求。因此,不允许分配器为了提高性能重行排列或者缓冲请求。
只使用堆:为了使分配器可以拓展,分配器使用的任何非标量数据结构都要保存到堆里。
对齐块:使得其可以保存任何类型的数据对象。
不修改已经分配的块。
2).目标—实现的问题(这些问题在后面动态分配器的策略会提到):
空闲块组织:如何记录空闲块?
放置: 如何选择一个合适的空闲块来放置一个新分配的块。
分割:在将一个新分配的块放置到某个空闲快之后,如何处理这个空