windows核心编程 第18章 堆

第18章  堆

 

1.         堆适合分配小内存块,不需要按分配粒度或者页大小对齐。堆在最初只是预定了一块区域,在客户分配时将预定的区域提交,在客户释放后可能反提交。

2.         关于默认堆:GetProcessHeap返回,用户模式代码无法销毁它,在进程结束后由系统销毁。进程可以通过链接选项 “/HEAP:reserve[,commit]”来设置默认堆大小。因为默认堆属于进程,所以在DLL中不应设置该链接选项。Windows的ANSI 版API向Unicode版转化的时候从默认堆分配字符串缓存,LocalAlloc、GlobalAlloc也从默认堆分配内存。默认堆对外界访问进行 了同步,即没有使用HEAP_NO_SERIALIZE标记。

3.         使用独立堆的一些好处:(1)写堆内存出错后,不会影响其他堆的数据。(2)对特定类型数据使用独立堆的话,由于分配块大小相同,具有速度快、无碎片的优 点。(3)相关数据使用独立的堆,在访问这些数据时访问的页面更集中,减少PageFault。(4)对特定线程上的逻辑结构使用独立堆,不必加锁,提高 性能。

4.         HeapCreate:参数fdwOption,如果在创建堆的时候指定了部分标志(如HEAP_NO_SERIALIZE标志等),以后每次访问堆这些 标志都生效;如果创建的时候没有指定,那后续的每次访问可以单独指定标志。 HEAP_NO_SERIALIZE-访问堆的时候不加锁。HEAP_GENERATE_EXCEPTIONS-分配内存失败的时候抛出异常,默认行为是 返回NULL。HEAP_CREATE_ENABLE_EXECUTE-可以在堆内存上放置代码来执行。参数dwInitalSize-初始堆大小。参数 dwMaximumSize-如果非0,表示如果堆内存使用量达到这个值后再分配会失败;为0,表示堆会自动增大,直到内存用尽。

5.         HeapAlloc、HeapSize、HeapFree、HeapDestroy,容易理解。

6.         HeapReAlloc:HEAP_ZERO_MEMORY-增大内存时,增加的字节初始化为0。HEAP_REALLOC_IN_PLACE_ONLY-要求不移动起始地址的情况下改变大小,需要增大时如果当前位置剩余空间不足会返回NULL。

7.         HeapSetInformation:标记HeapEnableTerminationOnCorruption-Visita以上使用。默认情况下, 堆内存被破坏后只在调试器中触发一个断言然后继续执行,这个标记允许发现堆破坏就抛出异常。该标记影响进程中所有堆,无法清空标记。标记 HeapCompatibilityInformation-值为2的时候,表示启用低碎片堆(lowfragmentation heap)算法,启用该算法的堆针对内存碎片问题优化有更好的性能。

8.         Heap32ListFirst、Heap32ListNext-遍历快照(CreateToolhelp32Snapshot)中的堆。 Heap32First、Heap32Next-遍历指定堆中的块。GetProcessHeaps-获得包括默认堆在内的所有堆句柄。 HeapValidate-检查指定堆中所有块或者单个块的有效性。HeapCompact-将堆中闲置块合并,并反提交。HeapLock、 HeapUnlock-锁定堆。HeapWalk-遍历指定堆中的块,建议先锁堆。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值