- 1、本文档共70页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
6.6堆式管理和垃圾回收技术 在设计实际软件系统时,除了子程序调用和部分缓冲区管理等算法符合这一要求之外,大量内存分配是以随机的方式进行的,因此不符合栈式管理的要求。 这种显式存储管理的代码通常需要程序员在设计程序时直接编写,而无法由编译器自动插入。实现显式存储管理的一种有效方法,就是所谓的“堆式内存管理”。 实际上,和堆相关的管理并不都是显式的。垃圾收集技术的主要目的就是提供程序员不可见的堆内存回收机制,从而避免错误的堆空间释放引起的内存访问错误。 堆式存储管理的基本要求 第一,堆(Heap)是一种组织内存的有效方法。与栈式分配由编译器产生的代码自动分配和释放不同,程序员需要自己编写代码来实现对堆空间的分配与释放。 第二,堆空间的分配和释放必须成对出现。因此,无论是引用未分配堆空间上的存储单元(例如C语言程序中的未初始化的指针变量),或是忘记释放和多次释放堆空间上的内存都可能导致堆访问的问题。引用未分配空间或多次释放堆空间,可能引起内存访问异常;而忘记释放堆空间则会引起内存泄漏问题。 堆式管理的主要形式 第一种,采用外部堆管理支持。C语言是这种方法的典型代表。C语言本身并不支持堆存储管理;但C支持指针机制,可为访问堆空间提供直接支持。C语言通过标准库的方式提供对堆式内存管理的支持。 第二种,采用内置存储管理语句的方式支持。例如C++语言所支持的new和delete语句。编译器在处理new和delete时可以插入一些辅助性的代码序列。 第三种,采用单独的内存管理机制。这主要是各种支持垃圾回收机制(Garbage Collection)。 堆式管理的算法思想 将存储空间分为两个队列,即空闲块和已经使用的块。然后分别进行管理。 算法可进行各种优化,如减少碎片、提高效率等。 堆管理的调试支持可参见Visual C++的C运行库调试支持等相关技术。该技术与具体适应的编译器和相关环境密切相关。 垃圾回收机制(隐式释放) 使用C、C++的程序员很容易在使用指针和动态申请/释放堆空间变量时引入程序错误。由于多方面的原因,这些错误往往很难被调试和修改,如悬空指针等。 由于不知道引发错误的具体位置和时机,因此很难再现错误,使程序调试困难增加。 为了解决这一问题,在Java、C#、Smalltalk、ML、Haskell、Prolog、awk和Perl等程序设计语言中,引入了所谓的垃圾回收机制(Garbage Collection)。采用垃圾回收机制的语言,不要求程序员直接编写释放堆空间的代码,而是采用专门的算法自动回收应用程序不再使用的存储空间。 常见的垃圾回收技术 引用计数 标记和扫描可达存储片技术 拷贝回收器 6.5.3 活动树 子程序的执行是由子程序被调用的活动引起的,因此我们将子程序的一次执行称为该子程序的一次活动。如果子程序P的一次活动中,还调用了其他子程序,则P本次执行活动的时间段将包括P完成内部计算的时间和被调用?的其他子程序的执行时间。因此,如果P1、P2是两个不同的子程序,则P1、P2的活动时间(也可称为生存期)或者没有重叠,或者是嵌套的。这就意味着,如果在离开P1之前进入P2(P1直接调用P2或嵌套调用P2。例如P1调用Pi,Pi调用Pj,……,Pk调用P2),则控制必然在离开P1前离开P2。 ? 活动树的定义 这一关于控制流进入和离开活动的过程,可用活动树来表示。活动树的定义如下: (1)树的每个节点代表一个子程序的一次活动(注意,可能这一活动已经结束); (2)根节点代表主程序的活动(如C语言的main函数); (3)如果子程序P1直接调用子程序P2,则P1是P2的父节点(表明控制流从P1进入P2); (4)如果节点P3在节点P4的左边,则表明P3的活动在P4的活动之前发生。 例6.3的活动树和对应的栈表示。 例6.4 递归调用的C程序及其对应的活动树 void A(int a); void B(int b); void C(int c); int A(int a) { L1: if(a0) { B(a-1); L11: return 1; } else { L2: C(a); L22: return 0; } } void C(int c) { return; } void B(int b) { A(b); return; } int main(void) { A(1); } 6.5.4 栈和活动树的比较 栈模型和活动树模型都可以清晰地表示出这些活动的执行过程 活动树可以在一个棵树中表示包括已经结束的子程序调用活动,而栈式模型则需要多个图才能达到相同的效果 尽管用栈模型表示子程序调用历史较为繁琐,然而由于程序动态执行时只关心正在进
您可能关注的文档
- 边做边学——Photoshop+corelDRAW综合实训教程 教学课件 作者 江新顺 06.ppt
- 边做边学——Photoshop+corelDRAW综合实训教程 教学课件 作者 江新顺 07.ppt
- 边做边学——Photoshop+corelDRAW综合实训教程 教学课件 作者 江新顺 08.ppt
- 边做边学——Photoshop+corelDRAW综合实训教程 教学课件 作者 江新顺 09.ppt
- 边做边学——Photoshop+corelDRAW综合实训教程 教学课件 作者 江新顺 10.ppt
- 边做边学——Photoshop+corelDRAW综合实训教程 教学课件 作者 江新顺 11.ppt
- 边做边学——Photoshop+Illustrator综合实训教程 教学课件 作者 马丹 姚磊磊 01.ppt
- 边做边学——Photoshop+Illustrator综合实训教程 教学课件 作者 马丹 姚磊磊 02.ppt
- 边做边学——Photoshop+Illustrator综合实训教程 教学课件 作者 马丹 姚磊磊 03.ppt
- 边做边学——Photoshop+Illustrator综合实训教程 教学课件 作者 马丹 姚磊磊 04.ppt
- CNAS-CL63-2017 司法鉴定-法庭科学机构能力认可准则在声像资料鉴定领域的应用说明.docx
- 12J7-3 河北《内装修-吊顶》.docx
- 12N2 河北省12系列建筑标准设计图集 燃气(油)供热锅炉房工程.docx
- 内蒙古 12S8 排水工程 DBJ03-22-2014.docx
- 山西省 12S10 12系列建筑标准设计 管道支架、吊架.docx
- 16J601-木门窗标准图集.docx
- 12J8 河北省12系列《 楼梯》.docx
- CNAS-GL37 2015 校准和测量能力(CMC)表示指南.docx
- CNAS-RL02-2016 能力验证规则.docx
- 津02SJ601 PVC塑料门窗标准.docx
文档评论(0)