`
923723914
  • 浏览: 635121 次
文章分类
社区版块
存档分类
最新评论

windows程序员进阶系列:《软件调试》之堆 (一)

 
阅读更多

windows程序员进阶系列:《软件调试》之堆 (一)

堆是软件在运行时动态申请内存空间的主要途径。从堆上申请来的空间需要程序员自己申请和释放,且申请和释放操作必须绝对匹配。忘记释放或者多次释放可能会导致严重问题。

与栈类似,使用堆的过程中也会由于向堆中写入超过所申请堆大小的数据,覆盖堆上的其他内容,而导致堆溢出问题。

由于堆的特殊性,一旦堆被破坏将会导致一些严重的问题。由于如果对堆不够了解的话对于这些问题将会手足无措。本文将会详细的介绍堆的方方面面,通过以下几篇文章的讲解便可以很清晰的了解堆的结构,再遇到在堆上出现的问题将从容应对而不再是手足无措。

由于堆的复杂性,本主题将会分五篇文章来介绍。

第一篇文章将介绍堆的基本概念以及堆的分类。

第二篇文章将介绍win32堆的内部结构。

第三篇文章将介绍CRT堆的内部结构。

第四篇文章介绍堆的调试支持。

第五篇文章将分析一个堆破坏的实例。

栈是分配局部变量和函数调用的主要场所。编译器在编译时会生成合适的代码来从栈上分配空间。因此栈又被称为“自动内存”。但是栈也有自己的不足:首先由于栈是非常小的,不适合分配特别大(动辄几十M)的内存区。再者栈会随着函数的调用和返回不断的创建和销毁。因此只适用于局部变量的分配,不适合分配具有长生命周期的变量。

堆克服了以上栈的缺点。应用程序通过HeapAlloc mallocnew分配的空间均来自于堆。而它们均是通过堆管理器从堆中分配空间的。堆管理器用于管理堆,对外提供堆分配和释放的接口。

windows操作系统的内核态有一个管理内存空间的内存管理器。堆管理器管理的空间是通过内存管理器获得的。由于应用程序申请空间的操作可能是分散且零散的,为了避免频繁的向内存管理器申请空间,堆管理器会一次性的向内存管理器批发大量的内存空间,然后零散的分配给应用程序。

有一个形象的比喻:把内存管理器比作内存工厂,对外不接受小批量的订货。而堆管理器是该工厂的代理商,零售给应用程序。

Windows操作系统的堆管理器被称为win32堆管理器,它管理的堆被称为win32堆。

为了支持C/C++malloc new等内存分配函数。编译器的C运行库(CRT)在程序初始化时会创建一个专门的堆供这些函数使用,这个专门的堆被称为CRT堆。

CRT堆有三种工作方式:SBH模式、旧SBH模式和系统模式。

前两种模式时,CRT堆管理器会直接从内存管理器批发内存,然后分割成小块的堆块供应用程序使用。

第三种模式CRT堆管理器会将对堆块的分配请求转发给win32堆管理器。因此处于系统模式的CRT堆仅仅是堆win32堆的简单封装。

除了上面介绍的堆,应用程序也可以实现自己的堆管理器。直接向内存管理器批发内存,供本应用程序内部使用。例如:应用程序通过向内存管理器申请空间,实现的内存池就可以看做是一种堆管理器。

如图所示,应用程序可以从内存管理器、win32堆、CRT堆申请空间。

但三者有区别:

通过内存管理器申请时是调用VirtualAlloc申请的。申请大小是以页面大小(win32下为4KB)为单位。

通过WIN32堆管理器申请时是调用HeapAlloc申请的,但当申请的空间超过一定阈值时,WIN32堆管理器并不会从自己的堆中分配,而是重新向内存管理器申请,然后转交给应用程序。

通过CRT堆申请空间是调用new mallocC/C++函数来实现的。同样当申请的空间超过一定阈值时,会从上一级直接申请并转交给应用程序。根据工作模式的不同,上一级可以是WIN32堆,也可以是内存管理器。

内存管理类似于内存工厂,用于生产内存并向外批量出货。

Win32堆是中间商,直接从内存工厂进货,提供批发和零售服务。

CRT堆是更下一级的中间商,可以从内存工厂和中间商进货,对外提供零售服务。

应用程序是消费者,可以从以上三个角色购买内存。但是只有当购买量很大时才能从内存工厂购买。

如有纰漏,请指正,谢谢!

2013.10.12于浙江杭州

分享到:
评论

相关推荐

    windows驱动开发技术详解-part2

    用WinDBG和VMWARE软件对驱动进行源码级调试,深入Windows操作系统的底层和内核,透析Windows驱动 开发的本质。 本书是作者结合教学和科研实践经验编写而成的,不仅详细介绍了Windows内核原理,而且介绍了编程技 巧...

    Windows驱动开发技术详解的光盘-part1

    非常容易上手,用实例详细讲解PCI、USB、虚拟串口、虚拟摄像头、SDIO等驱动程序的开发,归纳了多种调试驱动程序的高级技巧,如用WinDBG和VMWARE软件对驱动进行源码级调试,深入Windows操作系统的底层和内核,透析...

    正宗《Visual C++2008入门经典》中文 高清完整版PDF part5(共6部分)

    本书系编程语言先驱者Ivor Horton的经典之作,是C++编程方面最畅销的图书品种之一,不仅涵盖了Visual C++ 2008编程知识,还全面介绍了标准C++语言和C++/CLI。本书延续了Ivor Horton讲解编程语言的独特方法,从中读者...

    正宗《Visual C++2008入门经典》中文版part1 pdf

    本书系编程语言先驱者Ivor Horton的经典之作,是C++编程方面最畅销的图书品种之一,不仅涵盖了Visual C++ 2008编程知识,还全面介绍了标准C++语言和C++/CLI。本书延续了Ivor Horton讲解编程语言的独特方法,从中读者...

    正宗《Visual C++2008入门经典》中文版part3 pdf

    本书系编程语言先驱者Ivor Horton的经典之作,是C++编程方面最畅销的图书品种之一,不仅涵盖了Visual C++ 2008编程知识,还全面介绍了标准C++语言和C++/CLI。本书延续了Ivor Horton讲解编程语言的独特方法,从中读者...

    正宗《Visual C++2008入门经典》中文版part4 pdf

    本书系编程语言先驱者Ivor Horton的经典之作,是C++编程方面最畅销的图书品种之一,不仅涵盖了Visual C++ 2008编程知识,还全面介绍了标准C++语言和C++/CLI。本书延续了Ivor Horton讲解编程语言的独特方法,从中读者...

    正宗《Visual C++2008入门经典》中文版part2 pdf

    本书系编程语言先驱者Ivor Horton的经典之作,是C++编程方面最畅销的图书品种之一,不仅涵盖了Visual C++ 2008编程知识,还全面介绍了标准C++语言和C++/CLI。本书延续了Ivor Horton讲解编程语言的独特方法,从中读者...

    正宗《Visual C++2008入门经典》中文版part6 pdf

    本书系编程语言先驱者Ivor Horton的经典之作,是C++编程方面最畅销的图书品种之一,不仅涵盖了Visual C++ 2008编程知识,还全面介绍了标准C++语言和C++/CLI。本书延续了Ivor Horton讲解编程语言的独特方法,从中读者...

    asp.net知识库

    NET委托:一个C#睡前故事 [推荐] - [原创] Microsoft .NET策略及框架概述 卸载Class? Web Form 窗体 如何实现web页面的提示保存功能 在ASP.Net中两种利用CSS实现多界面的方法 如何在客户端调用服务端代码 页面一...

    编程新手真言......

    Scheme 程序语言介绍之一 248 与软工有关的哲学 辩证 251 富网页技术 251 形式维度 252 开源与开放 253 Core learning and min learing编程 253 与软工有关的哲学 联系 254 本地化和语言编码 254 学习与维度 255 跟...

    自己动手写操作系统(含源代码).part2

    经过四年的磨练成长,于渊又拿出第二版的书稿《Orange'S:一个操作系统的实现》,这本书是属于真正 Hacker的。我虽然已经有多年不写代码了,但看这本书的时候,让我又重新感受到做程序员的乐趣:用代码建设属于自己...

    自己动手写操作系统(含源代码).part1

    经过四年的磨练成长,于渊又拿出第二版的书稿《Orange'S:一个操作系统的实现》,这本书是属于真正 Hacker的。我虽然已经有多年不写代码了,但看这本书的时候,让我又重新感受到做程序员的乐趣:用代码建设属于自己...

    自己动手写操作系统

    本书在详细分析操作系统原理的基础上,用丰富的实例代码,一步一步地指导读者用C语言和汇编语言编写出一个具备操作系统基本功能的操作系统框架。本书不同于其他的理论型书籍,而是提供给读者一个动手实践的路线图。...

    文件管理器程序开发研究

    和 Windows 系统中的资源管理器很相似,可以用来查看本机的所有资源、文件系统结构, 以便更清楚、直观的查看和操作手机的文件和文件夹。 研究目标 一个简单的文件管理器首先需要浏览文件(文件夹)、显示路径以及...

    基于jsp+servlet+javaBean的图书管理系统+项目说明+sql数据库(期末大作业).zip

    **开发环境**: windows+jdk1.8+Tomcat9+IDEA+mysql 注意:我用的IDE是`jetbrains IntelliJ IDEA`,不知道导入Eclipse会出现什么问题。 - **注意事项**:调试之前请创建名为library的数据库,相关sql脚本为项目根...

    基于C++ 和OpenGL的太阳系(太阳、地球、月球)系统运动图绘制源码+使用说明+exe.zip

    - `windows 11` - `Visual Studio 2022` - `OpenGL` * `glfw-3.3.8.bin.WIN64` * `glutdlls37beta` # 不配置环境 如果仅运行可执行文件,不修改和调试,无需配置环境。 可执行文件在项目目录下的 `x64/debug/...

    Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3

    注:本系列图书的第I、II卷再版时均相应改名为《xxx开发实例大全》(基础卷)及(提高卷),但内容基本无变化,需要的童鞋可自由匹配查找。 内容简介  《Java开发实战1200例》分为I、II两卷共计1200个例子,包括了开发...

Global site tag (gtag.js) - Google Analytics