版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第六章 运行时存储空间的组织和管理,编译程序在完成词法、语法和语义分析后,在生成目标代码之前,需要把程序的静态正文和实现这个程序的运行时的活动联系起来弄清楚将来在代码运行时刻,源代码中的各种变量、常量等用户定义的量是如何存放的,如何去访问它们。 在程序的执行过程中,程序中数据的存取是通过与之对应的存储单元来进行的。在程序语言中,程序使用的存储单元都是由标识符来表示的。它们对应的内存地址都是由编译程序在编译时或由其生成的目标程序运行时进行分配。所以对于编译程序来说存储组织与管理是一个复杂而又十分重要的问题。,第六章 运行时存储空间的组织和管理,过程的活动 过程的一次执行称为过程的一次活动 活动记
2、录 过程的活动需要可执行代码和存放所需信息 的存储空间,后者称为活动记录 本章内容 讨论一个活动记录中的数据安排 程序执行过程中,所有活动记录的组织方式,第六章 运行时存储空间的组织和管理,过程P一次活动的生存期,指的是从执行该过程体第一步操作到最后一步操作之间的操作时间,包括执行P时调用其它过程花费的时间。 过程可以是递归的 一个过程可对应多个活动,第六章 运行时存储空间的组织和管理,影响存储分配策略的语言特征 过程能否递归 当控制从过程的活动返回时,局部变量的值是否要保留 过程能否访问非局部变量 过程调用的参数传递方式 过程能否作为参数被传递 过程能否作为结果值传递 存储块能否在程序控制下
3、动态地分配 存储块是否必须显式地释放,6.1 (过程内部)局部存储分配策略,6.1.1 过程 过程定义、过程调用、形式参数、实在参数、活动的生存期,Procedure f(a:int, b:bool) int c; ,过程定义,void main() f(3,true); ,过程调用,6.1 局部存储分配策略,6.1.2 名字的作用域和绑定 名字的作用域 一个声明起作用的程序部分称为该声明的作用域。,int a; Function f(int b) int c; ,void main() a = 0; c = 0; f(3); ,正确,在a的作用域内,错误,超出了c的作用域,6.1 局部存储分
4、配策略,6.1.2 名字的作用域和绑定 名字的作用域 即使一个名字在程序中只声明一次,该名字在程序运行时也可能表示不同的数据对象。,int a; Function f(int b) int c; ,void main() a = 0;f(3); f(5); ,两次调用,函数f中变量c对应不同的数据对象,保存值的存储单元,6.1 局部存储分配策略,名字到存储单元的绑定 环境把名字映射到左值(存储单元),而状态把左值映射到右值(值)。 赋值改变状态,但不改变环境。 如果环境将名字x映射到存储单元s,我们就说x被绑定到s。,6.1.2 名字(变量)的作用域和绑定,A = b,5,A,4,b,A,5,
5、6.1 局部存储分配策略,静态概念和动态概念的对应,6.1 局部存储分配策略,6.1.3 活动记录 编译程序每次运行时,编译器从操作系统(OS)获得一块存储区(内存)。其内容包括: 编译后的目标代码 (可执行程序 .exe) 数据对象 (各种静态变量和动态变量) 用于管理过程活动的控制栈 (活动记录),过程的活动中用于存放所需信息的存储空间, 称为活动记录或帧,6.1 局部存储分配策略,6.1.3 活动记录 编译程序每次运行时,编译器从操作系统(OS)获得一块存储区(内存)。其空间安排:,目标代码(.exe),静态变量和外部变量,活动记录,活动记录及动态变量,6.1 局部存储分配策略,6.1.
6、3 活动记录 例子,void p() void main() ; p(); .; ,代 码,静 态 数 据,main的活动记录,堆,p的活动记录,栈,6.1 局部存储分配策略,6.1.3 活动记录 一般的活动记录的布局,本过程返回给调用过程的值,调用过程传递给本过程的参数,指向调用过程的指针,用于引用存于其他活动记录的非局部数据,用于保存本过程调用前的机器状态,本过程内部定义的局部变量,临时变量,中间结果,6.1 局部存储分配策略,6.1.4 局部数据的安排 字节是可编址内存的最小单位。 一个过程所声明的局部变量,按这些变量声明时出现的次序,在活动记录的局部数据区中依次分配空间。 局部数据的地
7、址可以用相对于某个位置(本过程对应的活动记录的起始位置)的偏移来表示。 数据对象的存储安排深受目标机器寻址方式的影响,存在对齐问题。例如,要求整数(int,long)的相对地址可以被4整除。由于对齐而引起的无用空间称为衬垫空白区。,例题,在X86/Linux工作站上,以下两个结构的size分别是20和16,为什么不一样? typedef struct _atypedef struct _b char c1; char c1; long i; char c2; charc2; long i; double f; double f; a; b;,第一部分 存储区(内存)的划分,例题解答:,type
8、def struct _a char c1; long i; charc2; double f; a;,第一部分 存储区(内存)的划分,例题解答:,typedef struct _b char c1; char c2; longi; double f; b;,第一部分 存储区(内存)的划分,6.1 局部存储分配策略,6.1.5 程序块 语法如声明 语句 本身含有局部变量声明的语句,可以嵌套 最接近的嵌套作用域规则 程序块B中声明的作用域包括B 如果名字x没有在B中声明,那么B中x的出现是在外围程序块B的x声明的作用域中,且满足 B有x的声明 B比其他任何包含x声明的程序块更接近被嵌套的B 并列
9、程序块不会同时活跃 并列程序块的变量可以重叠分配, int a; .int b; a = 3; .int a ,B,B1,B2,可以把程序块看成是不带参数和返回值的函数,6.1 局部存储分配策略,main() / begin of B0 / int a = 0; int b = 0; / begin of B1 / int b = 1; / begin of B2 / int a = 2; / end of B2 / / begin of B3 / int b = 3; / end of B3 / / end of B1 / / end of B0 /,6.1 局部存储分配策略,main()
10、/ begin of B0 / int a = 0; int b = 0; / begin of B1 / int b = 1; / begin of B2 / int a = 2; / end of B2 / / begin of B3 / int b = 3; / end of B3 / / end of B1 / / end of B0 /,6.1 局部存储分配策略,main() / begin of B0 / int a = 0; int b = 0; / begin of B1 / int b = 1; / begin of B2 / int a = 2; / end of B2 /
11、 / begin of B3 / int b = 3; / end of B3 / / end of B1 / / end of B0 /,6.2 全局存储分配策略,介绍程序运行时所需的各个活动记录在存储空间的分配策略 描述过程的目标代码怎样访问绑定到局部名字的存储单元 介绍三种分配策略 静态分配策略 堆式分配策略 栈式分配策略,6.2 全局存储分配策略,6.2.1 运行时内存的划分,6.2 全局存储分配策略,6.2.2 静态分配 名字在程序被编译时绑定到存储单元,不需要运行时的任何支持。 绑定的生存期是程序的整个运行时间。 控制再次进入该过程时,局部变量的值和控制上一次离开时的一样。 每个活
12、动记录的大小是固定的。 过程调用时保存信息的地址在编译时也是已知的。,6.2 全局存储分配策略,静态分配的应用: Fortran语言被设计成允许静态存储分配 C语言程序的外部变量和程序中出现的常量都可以静态分配。 声明在函数外面 外部变量 声明在函数里面 静态局部变量 常量,像FORTRAN这样的语言,其程序是段结构的,即由主程序段和若干子程序段组成。 各程序段中定义的名字一般是彼此独立的,也即各段的数据对象名的作用域在各段中,同一个名字在不同的程序段表示不同的存储单元,不会在不同段间互相引用、赋值。 另外它的每个数据名所需的存储空间大小都是常量(即不许含可变体积的数据,如可变数组),且所有数
13、据名的性质是完全确定的。 这样,整个程序所需数据空间的总量在编译时完全确定,换句话说,一旦存储空间的某个位置分配给了某个数据名(关联起来)之后,在目标程序的整个运行过程中,此位置(地址)就属于该数据名了。,6.2 全局存储分配策略,静态分配给语言带来限制 递归过程不被允许 数据对象的长度和它在内存中位置,必须是在编译时可以知道的 数据结构不能动态建立,6.2 全局存储分配策略,6.2.3 栈式分配 栈式分配主要用于管理过程的活动记录。 局部变量的生存期是过程活动的时间。 控制进入该过程时,局部变量绑定到存储单元,过程活动结束后,局部变量的空间释放。,6.2 全局存储分配策略,6.2.3 栈式分
14、配,活动树:用树来描绘控制进入和离开活动的方式,活动树的特点 每个结点代表某过程的一个活动 根结点代表主程序的活动 结点a是结点b的父结点,当且仅当控制流从a的活动进入b的活动 结点a 处于结点b 的左边,当且仅当a的生存期先于b的生存期,活动执行的顺序?,6.2 全局存储分配策略,当前活跃着的过程活动可以保存在一个栈中 控制栈的内容:s, q (2, 3), p(2, 3),6.2 全局存储分配策略,运行栈:把控制栈中的信息拓广到包括过程活动所需的所有局部信息(即活动记录),s,6.2 全局存储分配策略,运行栈:把控制栈中的信息拓广到包括过程活动所需的所有局部信息(即活动记录),6.2 全局
15、存储分配策略,运行栈:把控制栈中的信息拓广到包括过程活动所需的所有局部信息(即活动记录),6.2 全局存储分配策略,运行栈:把控制栈中的信息拓广到包括过程活动所需的所有局部信息(即活动记录),34/48,6.2 全局存储分配策略,运行栈的管理: 过程调用和过程返回都需要执行一些代码来管理活动记录栈,保存或恢复机器状态等 过程调用序列 过程调用时执行的分配活动记录,把信息填入它的域中的代码 过程返回序列 过程返回时执行的恢复机器状态,释放活动记录,使调用过程能够继续执行的代码,调用序列和返回序列都分常常分成两部分,分处于调用过程和被调用过程中,6.2 全局存储分配策略,即使是同一种语言,过程调用
16、序列、返回序列和活动记录中各域的排放次序,也会因实现而异 设计这些序列和活动记录的一些原则是 把参数域和可能有的返回值域放在紧靠调用者活动记录的地方 以活动记录中间的某个位置作为基地址 长度能较早确定的域放在活动记录的中间 一般把临时数据域放在局部数据域的后面 用同样的代码来执行各个活动的保存和恢复,6.2 全局存储分配策略,调用者和被调用者之间的任务划分,被调用者的责任,调用者的责任,调用者的活动记录,被调用者的 活动记录,过程p调用过程q,6.2 全局存储分配策略,过程p调用过程q的调用序列 p在栈上留出放返回值的空间,并计算实参,依次放入栈顶,同时改变top_sp的值。 p把返回地址和当
17、前base_sp的值存入q的活动记录中,建立q的访问链 q保存寄存器的值和其它机器状态信息,将base_sp的值压栈,并将当前的top_sp作为自己的base_sp 。 q根据局部数据域和临时数据域的大小减小top_sp的值,初始化它的局部数据,并开始执行过程体。,6.2 全局存储分配策略,过程p调用过程q的返回序列 q把返回值置入邻近p的活动记录的地方 q增加top_sp的值 q恢复寄存器(包括base_sp)和机器状态,返回p p根据参数个数与类型和返回值类型调整top_sp,然后取出返回值,39/48,6.2 全局存储分配策略,过程的参数个数可变的情况 函数返回值改成用寄存器传递 编译器
18、产生将这些参数逆序进栈的代码 被调用函数能准确地知道第一个参数的位置 被调用函数根据第一个参数到栈中取第二、第三个参数等等,6.2 全局存储分配策略,活动记录的长度在编译时不能确定的情况 局部数组的大小要等到过程激活时才能确定 在活动记录中为这样的数组分别存放数组指针的单元 运行时,这些指针指向分配在栈顶的存储空间,访问动态分配的数组,q的数组,q的活动记录,p的数组,控制链,top_sp,base_sp,p的活动记录,数组A的指针,数组B的指针,数组B,数组 A,控制链,只有作用范围在一个过程中,且返回后不可访问的数据对象才能分配在栈上。,6.2 全局存储分配策略,栈式分配的动态释放空间引起悬空引用:引用某个已被释放的存储单元 main()|int dangle ( ) | int q;|int j = 20; q = dangle ( );|return |,6.2 全局存储分配策略,6.2.4 堆式分配,堆式分配与栈式分配的区别,栈,活动树,q (1,9),r,s,堆,三种存储分配策略的比较,例子,指出下面程序中各个变量对应的分配策
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年大学第四学年(服装设计与工艺)服装手工装饰试题及答案
- 浙江省宁波市象山县2026年初三毕业班9月份摸底调研考试英语试题含解析
- 四川省绵阳市三台外国语校2026届初三下学期动态性教学质量检测试题考前适应卷语文试题含解析
- 浙江省温州市梧田一中市级名校2025-2026学年初三全真语文试题模拟试卷(7)含解析
- 2025 高中文学类阅读理解之诗歌意象课件
- 2026年自动化调试的标准化流程
- 肠梗阻急诊处理流程培训计划
- 神经科脑出血抢救急救流程
- 2026广东佛山市顺德区乐从第一实验学校(教务文员)招聘1人备考题库附参考答案详解【轻巧夺冠】
- 2026上半年四川事业单位统考大邑县卫生健康局招聘53人备考题库及参考答案详解【巩固】
- 2026年青海省海南藏族自治州单招职业适应性测试题库附参考答案详解(模拟题)
- 广告制作公司奖惩制度
- 2026年及未来5年市场数据辽宁省环保行业市场行情动态分析及发展前景趋势预测报告
- 基金会会计监督制度
- 幼儿园课件《认识我们的身体》课件
- 违反无菌技术操作
- 骨髓腔穿刺科普
- 2025年广东省高职院校五年一贯制转段考试文化课测试(数学)
- 中铁二十四局集团有限公司施工现场从业人员安全风险告知书
- 计算机软件著作权登记申请表范本
- 2021年工人日报社校园招聘笔试试题及答案解析
评论
0/150
提交评论