第08章 程序运行时的存储组织及管理.ppt

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

* S.P O.P 语义分析及生成中间代码程序 代码生成程序 代码优化程序 语法分析程序 词法分析程序 错 误 处 理 符 号 表 管 理 编译程序在编译阶段要为源程序中出现的变量、常量等组织好在运行阶段的存储空间 将这种组织形式通过生成的目标代码体现出来 为运行阶段实现存储奠定基础 * 第八章 程序运行时的存储组织及管理 教学目标 要求明确静态存储分配和动态存储分配的含义 了解栈式动态存储分配和活动记录的含义及组成 了解堆式动态存储分配的分配方式和管理技术 * 8.1 程序运行时的存储组织 8.2 静态存储分配 8.3 栈式动态存储分配 8.4 堆式动态存储分配 教学内容 * 8.1 程序运行时的存储组织 运行时存储空间的划分 代码空间 数据空间 目标代码区 静态数据区 运行栈区 … 运行堆区 * 存储分配策略 目标代码的长度在编译时就可确定,可放在静态区内; 对于在编译时已知大小的数据对象(如常量,全局变量,静态变量等等), 也可放在静态区内; 为提高运行效率,应尽可能多地分配静态数据空间。FORTRAN,BASIC的分配一般可全部放在静态区内. 像PASCAL,C这类语言的实现,由于子程序允许递归地调用,因此应用一数据栈来动态地管理内存分配. 另外PASCAL和C还允许动态地申请的内存,这种数据的空间可由堆式分配实现. * 活动记录(active record) 执行过程时所需进行的信息管理,是通过活动记录实现的,活动记录连续存储在块中,其内容见右图。 以过程为单位的动态存储分配方案: 当一过程被调用时,就把其活动记录压入运行时存储栈顶,返回时弹出之。 临时变量 内情向量 形式单元 动态链 返回地址 静态链 局部变量 连接 数据区 局部 数据区 SP TOP * 8.2 静态存储分配 若在编译阶段就能确定源程序中各个数据实体的存储空间大小,则可以采用较简单的静态存储管理。 采用静态存储分配的语言必须满足下列条件: 1)? 不允许过程有递归调用。 2)? 不允许有可变大小的数据项,如可变数组或可变字符串。 3)? 不允许用户动态建立数据实体。 满足上述条件的语言有FORTRAN、BASIC等。 * 8.2 静态存储分配 右下图是一个FORTRAN程序模块在采用静态存储分配策略时的典型数据区格局。 隐式参数 (返回地址、寄存器内容等) 形式参数 简单变量 数组 临时变量 1) 隐式参数主要用于和主调模块的通讯,在一般情况下这个参数可以是主调过程的返回地址,或在不能利用寄存器返回函数值时传回函数返回值。这些信息不会在程序中明显地出现,所以称为隐式参数。 2) 形式参数部分存放相应实在参数的地址或值。 3) 程序变量部分将作为简单变量、数组、记录以及编译程序所产生的临时变量的存储空间。 * 静态存储分配←→动态存储分配 静态存储分配 在编译阶段由编译程序实现对存储空间的管理,为源程序中的变量分配存储单元。 在编译时能够确定变量在运行时的数据空间大小 运行时不改变 动态存储分配 在目标程序运行阶段由目标程序实现对存储空间的组织与管理,为源程序中的变量分配存储单元。 在目标程序运行时进行分配 编译时为运行阶段设计好存储组织形式,即为每个数据项安排好它在数据区中的相对位置 * 8.3 栈式动态存储分配 栈式分配适用于允许递归调用的程序设计语言; 引入一运行栈,每调用一次过程,就把该过程的相应调用记录压入栈,过程执行完毕后再将其弹出栈; 进入时:在栈顶为其分配一个数据区 退出时:撤消过程数据区 动作: 1)申请 2)释放 3)嵌套调用 * 下面我们通过一段C程序的运行来说明运行栈的变化情况。设有C程序如下: real x; …………………块1 int m1(int ind) ……………块2 { int x; x=m2(ind+1); } int m2(int j) ………………块3 { { int f[10]; ……………块4 bool test1; } } main()………………………块5 { int x; x=2; printf(%d\n,m1(x/5)); } 块4数据区 块3数据区 块2数据区 块5数据区 块1数据区 块3数据区 块2数据区 块5数据区 块1数据区 块2数据区 块5数据区 块1数据区 块5数据区 块1数据区 块1数据区 (a) (b)

文档评论(0)

2232文档 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档