第10章存储管理.ppt

  1. 1、本文档共29页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第10章 存储管理 存储管理 存储管理是程序员、语言实现者和语言设计者考虑的中心问题之一。 语言中含有对使用的存储管理技术的某种期望和限制。 如:在Fortran中,有对子程序非递归调用的限制。 但Fortran中是允许递归调用的,它的实现需要返回点的运行时栈(需要动态存储管理)。 如没有递归调用,Fortran可只用静态存储管理实现。 虽然每个语言设计通常允许某种存储管理技术的使用,但机制的细节、在软硬件中的表示却是实现者的任务。 程序对存储的直接控制较少,只能通过不同语言特性的使用产生间接影响。 10.1 需要存储的运行时元素 被翻译用户程序的代码段:两种形式(可执行机器代码或某种中间形式)。 系统运行时程序——支持用户程序执行系统程序,包括:简单的库例程、运行时的软件解释器或翻译器、控制运行时存储管理的例程等。通常形式为硬件可执行的机器代码。 用户定义的数据结构和常量。 子程序返回点:子程序可在程序中任何点被调用,需分配存储的内容包括:返回点、协同例程恢复点、被调度子程序的事件通知等。 需要存储的运行时元素(续) 引用环境——指标识符关联 表达式计值的临时空间——用于存放中间结果。当递归存在时,临时空间需要可能是无限的。 输入、输出缓冲——用于外部介质间数据的交换。 其他零散系统数据——表、I/O状态信息、以及各种状态信息。 需要存储的运行时元素(续) 除此之外,有些操作也需要存储空间: 子程序调用和返回操作——子程序激活记录、局部引用环境、及其他数据。而返回操作需要释放这些存储。 数据结构创建和后除操作—— 允许动态创建数据结构时,需要动态分配存储操作。 部件插入和删除操作 这些操作需要显式的存储管理。许多其他操作需要其他隐蔽存储管理发生,大多涉及分配和回收。 10.2 程序员和系统控制的存储管理 程序员被允许在何种程度上直接控制存储管理? C允许程序员通过Malloc和free控制存储。 而很多高级语言不允许程序员直接控制存储。 程序员控制存储管理的困难是两方面的:会大大增加程序员的负担,也会干扰必须的系统管理。 没有任何高级语言允许程序员全面管理存储。一方面,他不可能管理系统数据,最多只能管理局部数据。另一方面,对程序员来说也是危险的,因为可能导致微妙的错误。 程序员管理存储的优点在于: 系统很难确定什么时候存储可被有效地分配和释放。 而程序员可以精确地知道什么时候某特定结构是需要的,什么时候不再需要。 这种程度的确定是一个争议的话题,涉及性能、灵活性和安全间的权衡。 存储管理阶段 有三个基本方面: 初始分配:在执行开始时,每个存储片可能是自由的或被分配使用,如果自由,则可在执行过程中分配,存储管理需要保持自由存储区的轨迹。 恢复:被分配过的存储块可能重新可用。因此,必须收回,简单的回收可以是堆栈指针的重定位,复杂的可以是垃圾回收。 合并和重用:回收的存储可能是立即可重用的,也可能需先将小碎片合并为大的存储块。重用和初始分配的机制一样。 10.3 静态存储管理 静态分配是最简单的分配形式——在翻译时分配并在执行中保持不变。 通常,代码段和系统程序是静态分配的,静态分配不需要运行时存储管理,无需回收和重用。 一般在Fortran的实现中,所有存储都是静态分配的。 静态存储分配效率高,因为不需要为运行时存储管理花费时间和空间。 翻译器可为所有数据项生成直接的左值,但不适合递归子程序调用。在递归中,数据结构大小依赖于计算或输入数值。 10.4 基于栈的存储管理 最简单的运行时存储管理技术是堆栈。 在执行开始时,自由存储为内存中的顺序块,按栈方式进行管理,分配和回收均在一端进行。 栈指针被用于控制存储管理,总是指向栈顶,即下一个可用的存储位置,被视为被用存储和自由存储的分界点。 合并(compaction)作为释放存储动作的一部份自动发生。 因为需要存储的程序和数据元素是和子程序激活紧紧关联的,这是一个严格嵌套的子程序调用的后进先出结构。当子程序被调用,则在栈顶创建一个新的激活记录。 大多数Pascal实现采用一个单一的中央激活记录栈,再加上静态分配的系统程序和子程序代码区域。 PASCAL中存储组织 图 (a)是典型的Pascal子程序激活记录结构 图 (b)是Pascal运行时存储组织。 基于栈的存储管理 LISP实现中栈略有不同。 子程序(函数)调用也是严格嵌套,栈用于激活记录。 每个激活记录包含一个返回点及表达式计值和参数传递的临时区域。 局部引用环境也可能在同一栈中分配,但允许程序员直接操纵这些关联的情形除外。 因此,它们通常存放在分开的栈中,表示为了一个链接表,称为A表。 LISP实现需要一个堆存储区域,通过自由空间表和垃圾回收来管理。 执行时的LISP存储组织 10.5 堆存储管理 堆是一个存储块,其中片段

文档评论(0)

136****3783 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档