第8章 运行时的存储组织与管理.ppt

  1. 1、本文档共27页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第8章 运行时的存储组织与管理

第八章 运行时的存储组织与管理 编译程序需要进行目标程序运行环境的设计和数据空间的分配,本章主要介绍下面两个方面的内容: (1)静态存储分配 (2)栈式动态存储分配策略 8.1 概述 在编译程序构造的前四个阶段,不涉及目标语言、目标机以及目标机的操作系统特性,只与源语言的特性有关。 在编译程序构造的最后一个阶段,目标代码生成的时候,则完全依赖于目标机和相关的操作系统。这样就要求在目标代码生成之前进行运行环境的设计和数据空间的分配。 所谓运行时的环境是指目标机的寄存器和存储器的结构,以及用来管理存储器并保存执行过程所需要的信息。实际上,几乎所有的程序设计语言都使用以下3种类型的存储环境:完全静态环境、基于栈的存储环境、基于堆的存储环境中一种或几种。 编译程序还必须分配目标程序运行时所需要的存储空间,包括用户定义的各种数据类型的数据对象所需要的存储空间、调用过程所需要的连接单元、组织输入/输出所需要的缓冲区、保留中间结果和传递参数所需要的临时单元。 存储管理复杂程度取决于源语言本身: (1)允许的数据类型的多少 (2)语言中是否允许动态数据结构 (3)标识符的作用域的规则和结构 段结构 过程定义不嵌套,只允许过程递归调用 分程序结构 * 存储空间通常被划分为:目标区、静态数据区、栈区和堆区,如图8.1所示↓。 图8-1 运行时存储空间的划分 存储空间分配的一个重要单元是过程的活动记录,它是一段连续的存储区,用来存放过程的一次调用所需要的信息,包括:自变量(参数)空间;返回地址;用作局部数据的空间;用作局部临时变量的空间。 8.2 静态存储分配 如果在编译时就能确定目标程序运行中所需要的全部数据空间的大小,则编译时就能安排好目标程序的全部数据空间,并能确定每个数据项的单元地址、存储空间,这种分配方法即静态存储分配。 早期的程序设计语言,如FORTRAN-77,不允许递归调用,每一种数据类型所需要的存储空间的大小都是常量,采用的就是静态存储分配策略。 8.3 栈式存储分配 现代的程序设计语言都允许递归调用,具有可变类型数据结构,必须采用动态存储分配策略。栈式存储分配是一种动态存储分配策略,将整个存储空间设计成一个栈,每当调用一个过程时就将它的活动记录压入栈中,在栈顶形成过程工作时的数据区,当过程结束时再将其活动记录删除。 简单栈式存储分配 对于没有分程序结构,过程定义不允许嵌套但允许过程递归调用的语言,可以采用一种简单的栈式存储分配策略。 C语言就是满足上述特点的一种语言,其过程的活动记录一般采用如图8-2所示的结构。 由上图可知,过程的每一个局部变量或形参在活动记录中相对地址是确定的,因此可以知道程序运行时,变量和形参在栈中的绝对地址是: 绝对地址=活动记录基地址SP + 相对地址 也就说,活动记录的一个重要功能就是,计算变量的地址。 考虑以下程序结构: int x=2; void p(int); Void q(int n) {… p(n); …} Void p(int m) {… if(m1){q(m - 1); x--; p(m - 1); …} …} Main(){p(x);} 这段程序执行时, 存储空间变化情况如图8-3(a)(b)(c)所示。 嵌套过程的栈式存储分配 允许嵌套过程的语言如Pascal,处理方法是在栈中增加一个嵌套层次显示表(称Display表),Display表用于记录每一层活动记录的首地址,这样,由一个非局部变量说明所在的静态层数和相对于活动记录的相对地址就可以计算其绝对地址: 绝对地址=Display[静态层数] + 相对地址 嵌套过程的栈式存储分配步骤,即Display表的生成、作用;活动记录的填写、删除等内容,请参考金成植主编,高教出版社出版。 8.4 堆式存储分配 如果一种程序设计语言允许数据对象能够自由地分配和释放,那么由于空间的使用不一定按照“先申请后释放”的原则进行,这时栈式存储分配策略就不适用了,如C/C++语言。堆式存储分配的基本思想是:一个程序开始执行时有很大一块存储空间,运行期间如果需要就从里面申请一块存储空间,使用完毕归还。由于存储空间的申请和释放时间不一,在多次调用之后存储空间可能变成如下形式: 其中各区域的长度不一定相等。此时系统必须记录所有的使用情况,尤其是要记录所有的空闲区以备后用。此外还应该尽可能地把相连空闲区汇集成一个比较大的空闲区以免存储区被分割成为许多难以合作

文档评论(0)

dajuhyy + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档