运行时的存储组织及管理
7/30/20182004年12月28日
1
运行时的存储组织及管理
概述
存储组织
运行时的存储分配策略
静态存储分配
动态存储分配
对非局部名字的访问
参数传递
7/30/2018
2
编译技术
有关源程序中的一些问题
问题的提出:如何构造运行程序的策略和方法
过程
活动树
控制栈
说明的作用域
名字的绑定
7/30/2018
3
编译技术
名字与存储的绑定
名字
存储单元
值
存储分配
程序运行
环境
状态
l-value
r-value
静态概念动态对应
过程定义过程活动
名字说明名字的绑定
说明的作用域活动的生存期
7/30/2018
4
编译技术
存储组织
运行时刻内存的划分:假定编译器从操作系统得到一块存储区,运行时的存储空间要划分成块:
生成的目标代码;
数据对象;
记录过程活动的控制栈
对应的数据结构
目标代码
静态数据
栈
堆
返回值
实在参数
控制链(动态链)
访问链(静态链)
保存机器状态
局部数据
临时变量
7/30/2018
5
编译技术
运行时刻存储分配策略
分配策略是:
静态分配;
栈式分配,或称栈式动态分配;
堆式分配,或称堆式动态分配。
采用哪种分配策略是由源语言的语义决定的。
7/30/2018
6
编译技术
堆式存储分配
栈式存储分配策略在下列情况下不能使用:
活动结束时必须保持局部名字的值
被调用者的活动比调用者的活动的生存期长。
堆式存储器的策略:(堆管理器管理堆空间)
把连续存储区域分成块,当活动记录或其他对象需要时就分配。
块的释放可以按任意次序进行,所以经过一段时间后,堆可能包含交错的正在使用的和已经释放的区域
7/30/2018
7
编译技术
堆管理器的效率问题
堆管理的效率问题是数据结构理论中的特殊问题
对每个感兴趣的活动记录的大小,保存一个相应大小的空闲块的链表
可能的话,为大小为s的请求分配一个大小为s’的块,其中s’是大小等于s的最小块。当该块最终被释放后,将其链回原来的空闲块链表
对于大块存储空间,使用堆管理器管理。
其具体管理方法可以参考操作系统中堆内存的管理方法。
7/30/2018
8
编译技术
栈式存储分配
基于控制栈的原理:
存储空间被组织成栈,活动记录的推入和弹出分别对应于活动的开始和结束。
与静态分配不同的是,在每次活动中把局部名字和新的存储单元绑定,在活动结束时,活动记录从栈中弹出,因而局部名字的存储空间也随之消失。
7/30/2018
9
编译技术
,设寄存器top标记栈顶。
s
S
a:array
top
r
r
i:integer
top
top
q(1,9)
q(1,9)
i:integer
top
p(1,9)
p(1,9)
i:integer
top
top
q(1,3)
q(1,3)
i:integer
top
7/30/2018
10
编译技术
鼻出血慢性鼻炎变应性鼻炎2008版ppt课件 来自淘豆网m.daumloan.com转载请标明出处.