WINDOWS核心编程--堆栈

WINDOWS核心编程--堆栈
堆栈是大家常常使用的,WINDOWS核心编程中的堆栈的解释比较深度一些。

先看看栈:
每当创建一个线程时,系统就会为线程的堆栈(每个线程有它自己的堆栈)保留一个堆栈空间区域,并将一些物理存储器提交
给这个已保留的区域。按照默认设置(可以修改),系统保留 1MB的地址空间并提交两个页面的内存。
因为栈的大小是有限的,因此栈是可能溢出的。特别是在深度嵌套的情况下,如递归调用。当发生溢出时,引发一个
EXCEPTION_STACK_OVERFLOW异常处理(在 WinNT.h文件中定义为0xC00000FD)。通过使用结构化异常处理(SEH),你的程序将能得到关于这个异常处理条件的通知,并且能够实现适度恢复。

再来看看堆:

从内部来讲,堆也是进程保留的地址空间的一个区域(这里也可以看出堆是属于进程的)。和栈不同的是,保留区域中的大多数页面没有被提交物理存储器。当从堆中进行越来越多的内存分配时,堆管理器将把更多的物理存储器提交给堆。物理存储器总是从系统的页文件中分配的,当释放堆中的内存块时,堆栈管理器将收回这些物理存储器。

堆可以用来分配许多较小的数据块。若要对链接表和链接树进行管理,最好的方法是使用堆,而不是虚拟内存或内存映射。

堆的优点是,可以不考虑分配粒度和页面边界之类的问题,集中精力处理手头的任务。堆的缺点是,分配和释放内存块的速度比其他机制要慢,并且无法直接控制物理存储器的提交和回收。

堆也是涉及到回收物理存储器的,其具体规则和操作系统相关。Windows 98 与Windows 2000的规则不同的,Windows 98更加注重内存的使用,因此只要可能,它就收回堆,返回页文件。Windows 2000更加注重速度,因此它往往较长时间占用物理存储器,只有在一段时间后页面不再使用时,才将它返回给页文件。而虚拟内存函数是能够控制这些规则,它自己控制了何时归还物理存储器,返回页文件。我们在c/c++中使用的malloc/free和new/delete只是对应着虚拟内存中的(保留+提交物理存储器)/(释放区域),缺少归还(DECOMMIT)物理存储器这个环节。操作系统负责回收堆和页面文件交换。

使用的关键步骤:
HANDLE HeapCreate(DWORD fdwOptions, SIZE_T dwInitialSize, SIZE_T dwMaximumSize);
PVOID HeapAlloc(HANDLE hHeap, DWORD fdwFlags, SIZE_T dwBytes);
BOOL HeapFree(HANDLE hHeap, DWORD fdwFlags, PVOID pvMem);
BOOL HeapDestroy(HANDLE hHeap);
使用堆的最好方式是将堆纳入现在的c++程序中,VC中的new/delete等就是使用的堆函数分配内存。malloc/free由运行时库提
供,new/delete为C++内置的操作符。他们都使用运行时库的自己的堆。运行时库的在2000和win9x下都有自己独立的堆。这也就意味着只要你一启动进程,你将至少有两个堆,一个作为进程缺省,一个给C/C++运行时库。单就分配内存而言(new/delete还要管构造和析构),所有这些方式最终要归结到一点2000和98下都是是HeapAlloc。所以微软才会强调GlobalAlloc/GlobalFree和LocalAlloc/LocalFree会比较慢,推荐使用HeapAlloc,但由于Global**和Local**具有较简单的使用界面,因此即使在微软所提供的源代码中他们仍被大量使用。
 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值