第18章 堆栈.PDFVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第18章 堆栈.PDF

下载 第1 8章 堆 栈 对内存进行操作的第三个机制是使用堆栈。堆栈可以用来分配许多较小的数据块。例如, 若要对链接表和链接树进行管理,最好的方法是使用堆栈,而不是第 1 5章介绍的虚拟内存操作 方法或第 1 7章介绍的内存映射文件操作方法。堆栈的优点是,可以不考虑分配粒度和页面边界 之类的问题,集中精力处理手头的任务。堆栈的缺点是,分配和释放内存块的速度比其他机制 要慢,并且无法直接控制物理存储器的提交和回收。 从内部来讲,堆栈是保留的地址空间的一个区域。开始时,保留区域中的大多数页面没有 被提交物理存储器。当从堆栈中进行越来越多的内存分配时,堆栈管理器将把更多的物理存储 器提交给堆栈。物理存储器总是从系统的页文件中分配的,当释放堆栈中的内存块时,堆栈管 理器将收回这些物理存储器。 M i c r o s o f t 并没有以文档的形式来规定堆栈释放和收回存储器时应该遵循的具体规则, Windows 98 与Windows 2000 的规则是不同的。可以这样说,Windows 98 更加注重内存的使用, 因此只要可能,它就收回堆栈。Windows 2000更加注重速度,因此它往往较长时间占用物理存 储器,只有在一段时间后页面不再使用时,才将它返回给页文件。 M i c r o s o f t常常进行适应性测 试并运行各种不同的条件,以确定在大部分时间内最适合的规则。随着使用这些规则的应用程 序和硬件的变更,这些规则也会有所变化。如果了解这些规则对你的应用程序非常关键,那么 请不要使用堆栈。相反,可以使用虚拟内存函数(即 Vi r t u a l A l l o c和Vi r t u a l F r e e ),这样,就能 够控制这些规则。 18.1 进程的默认堆栈 当进程初始化时,系统在进程的地址空间中创建一个堆栈。该堆栈称为进程的默认堆栈。 按照默认设置,该堆栈的地址空间区域的大小是 1 MB。但是,系统可以扩大进程的默认堆栈, 使它大于其默认值。当创建应用程序时,可以使用 / H E A P链接开关,改变堆栈的 1 M B默认区域 大小。由于 D L L 没有与其相关的堆栈,所以当链接 D L L 时,不应该使用 / H E A P 链接开关。 / H E A P链接开关的句法如下: 许多Wi n d o w s 函数要求进程使用其默认堆栈。例如, Windows 2000 的核心函数均使用 U n i c o d e字符和字符串执行它们的全部操作。如果调用 Wi n d o w s 函数的A N S I 版本,那么该A N S I 版本必须将A N S I 字符串转换成U n i c o d e字符串,然后调用同一个函数的 U n i c o d e 版本。为了进 行字符串的转换,A N S I 函数必须分配一个内存块,以便放置U n i c o d e版本的字符串。该内存块 是从你的进程的默认堆栈中分配的。 Wi n d o w s 的其他许多函数需要使用一些临时内存块,这些 内存块是从进程的默认堆栈中分配的。另外,老的 1 6位Wi n d o w s 函数L o c a l A l l o c和G l o b a l A l l o c 也是从进程的默认堆栈中进行它们的内存分配的。 由于进程的默认堆栈可供许多Wi n d o w s函数使用,你的应用程序有许多线程同时调用各种 Wi n d o w s 函数,因此对默认堆栈的访问是顺序进行的。换句话说,系统必须保证在规定的时间 内,每次只有一个线程能够分配和释放默认堆栈中的内存块。如果两个线程试图同时分配默认 堆栈中的内存块,那么只有一个线程能够分配内存块,另一个线程必须等待第一个线程的内存 452计计第三部分 内 存 管 理 下载 块分配之后,才能分配它的内存块。一旦第一个线程的内存块分配完,堆栈函数将允许第二个 线程分配内存块。这种顺序访问方法对速度有一定的影响。如果你的应用程序只有一个线程, 并且你想要以最快的速度访问堆栈,那么应该创建你自己的独立的堆栈,不要使用进程的默认 堆栈。不幸的是,你无法告诉Wi n d o w s 函数不要使用默认堆栈,因此,它们对堆栈的访问总是 顺序进行的。 单个进程可以同时拥有若干个堆栈。这些堆栈可以在进程的寿命期中创建和撤消。但是, 默认

文档评论(0)

专业好文档 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:6110200002000000

1亿VIP精品文档

相关文档