第九章 运行时存储空间组织
本章重点:
一、运行时存储器的划分策略:
- 静态存储分配
- 栈式存储分配
- 堆式动态存储
二、活动记录表
1.简单栈式存储分配
2.嵌套过程语言的栈式
目标程序运行时的活动
过程:过程定义是一个说明,其最简单的形式是一个标识符和 一段语句相关,标识符是过程名,语句是过程体。
调用:当过程名出现在可执行语句里的时候,称该过程在这一 点被调用。过程调用导致过程体的执行。
过程的活动:一个过程的活动指的是该过程的一次执行,也就 是说,每次执行一个活动。
活动的生存期:指的是从执行该过程体第一步操作到最后一步 操作之间的操作序,包括执行该过程时调用其它过程花费的 时间。 活动的生存期或者是嵌套的,或者是不重叠的。
过程的递归:如果一个过程在没有退出当前的活动时,又开始 其新的活动,则这个过程是递归的。(递归有直接递归和间 接递归)
1. 静态存储分配
在编译时对所有的数据对象分配固定的存 储单元,并且在运行时始终保持不变。
在编译时就能够确定一个程序在运行时所需要的存储空间的 大小,则在编译时就能够安排好目标程序运行时的全部数据空 间,并能够确定每个数据项的单元地址。
语言要求:
- 数组的上下界必须是常数
- 过程调用不允许递归
- 不允许用户动态地建立数据实体
2. 栈式存储分配
在运行时把存储器作为一个栈进行管 理,运行时,每当调用一个过程,它所需要的存储空间 就动态地分配于栈顶,一旦退出,它所占的空间就予以 释放。
基于控制栈的原理: 存储空间被组织成栈,活动记录的 推入和弹出分别对应于活动的开始和结束。 与静态分配不同的是,在每次活动中把局部名字和新的 存储单元绑定,在活动结束时,活动记录从栈中弹出,因 而局部名字的存储空间也随之消失。
语言要求:
过程不允许嵌套,但允许过程递归调用,如C语言。
嵌套过程语言的栈式实现的语言要求:过程不仅允许递归调用,还允许过程进行嵌 套定义。
3. 堆式动态存储
在运行时把存储器组织成堆结构,以便用户可以对存储空间进行申请与归还。
堆式分配的基本思想是,为运行的程序划出适 当大的空间(称为堆Heap),每当程序申请空间 时,就从堆的空闲区找出一块空间分配给程序, 每当释放时则回收。
语言要求:
对于允许程序为变量在运行时动态申请和释放 存储空间的语言,采用堆式分配是最有效的解 决方案。
4.活动记录表
1.简单栈式存储分配
C语言的活动记录
2.嵌套过程语言的栈式
言非局部名字访问的实现