问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

堆内存管理详解:从堆块到低碎片堆(LFH)

创作时间:
作者:
@小白创作中心

堆内存管理详解:从堆块到低碎片堆(LFH)

引用
CSDN
1.
https://blog.csdn.net/weixin_44531336/article/details/125196022

堆内存管理是计算机系统中的一个重要概念,对于理解程序运行机制和优化内存使用具有重要意义。本文将从堆块、堆管理器函数、CRT分配函数、内存分配与释放机制以及低碎片堆(LFH)等方面,深入探讨Windows系统下的堆内存管理机制。

1. 堆块

堆块是堆内存管理中的基本单位。当我们调用mallocnew分配内存时,操作系统会自动分配一个堆块,并将可操作部分(即用户数据区)的首地址返回给我们。堆块的分配和释放涉及到堆的内存分割和合并等操作。

2. 堆管理器中的相关函数

堆管理器提供了HeapAllocHeapFree函数用于分配和释放堆内存。HeapAlloc函数的声明如下:

DECLSPEC_ALLOCATOR LPVOID HeapAlloc(
  [in] HANDLE hHeap,			// 一个堆的内存句柄
  [in] DWORD  dwFlags,		
  [in] SIZE_T dwBytes			// 需要的内存块的字节数
);

调用成功时,返回指向所分配堆块中用户可以使用的区域的指针。实际上,HeapAlloc函数是RtlAllocateHeap函数的简单包装。

3. CRT分配函数

编译器的运行时库在初始化阶段会创建CRT堆,这个堆主要用于支持mallocnew等内存分配函数。在VS2010编译器的Release版本中,mallocnew最终都会调用HeapAlloc函数。

4. 分配和释放简单总结

  • new/delete是一对,malloc/free是一对,HeapAlloc/HeapFree是一对。
  • 调用顺序:new/delete -> malloc/free -> HeapAlloc/HeapFree -> RtlAllocateHeap/RtlFreeHeap
  • 在Release版本中,new/delete通常直接被编译为跳转指令;在Debug版本中,会加入很多内存检查功能。
  • freedelete释放的堆上内存不一定归还给系统,需要满足特定条件才会调用NtFreeVitrualMemory函数释放堆内存给系统。

5. 扩展:低碎片堆(LFH)

堆碎片化问题可以通过低碎片堆(LFH)来解决。LFH通过桶(buckets)来管理分配的堆块,将已分配的内存块映射为事先确定了不同大小范围的桶。LFH将可用空间划分成128个桶,每个桶的空间依次递增。

6. 参考资料

  • 《软件调试》第二版,卷2的第23章
  • 《Windows高级调试》,第6章
  • 《深入解析Windows操作系统》第七版,第五章
  • 《Windows编程调试技术内幕》
© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号